java中的初学词法分析器
问题描述:
我正在写一个词法分析器。我知道这很简单。它会运行,但无论何时输入一个输入,程序都将其视为无效字符(即使它们应该是有效的)。我做错了什么?java中的初学词法分析器
import java.util.*;
import java.util.Scanner;
public class LAnalyze{
public static int i;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s;
System.out.println("Input something to lexically analyze: ");
s = input.next();
int j = 1;
if(s.charAt(i)!='a'||s.charAt(i)!='b'||s.charAt(i)!='c'||s.charAt(i)!='d'||s.charAt(i)!='e'||s.charAt(i)!='f'||
s.charAt(i)!='g'||s.charAt(i)!='h'||s.charAt(i)!='i'||s.charAt(i)!='j'||s.charAt(i)!='k'||s.charAt(i)!='l'||
s.charAt(i)!='m'||s.charAt(i)!='n'||s.charAt(i)!='o'||s.charAt(i)!='p'||s.charAt(i)!='q'||s.charAt(i)!='r'||
s.charAt(i)!='s'||s.charAt(i)!='t'||s.charAt(i)!='u'||s.charAt(i)!='v'||s.charAt(i)!='w'||s.charAt(i)!='x'||
s.charAt(i)!='y'||s.charAt(i)!='z'||s.charAt(i)!='A'||s.charAt(i)!='B'||s.charAt(i)!='C'||s.charAt(i)!='D'||
s.charAt(i)!='E'||s.charAt(i)!='F'||s.charAt(i)!='G'||s.charAt(i)!='H'||s.charAt(i)!='I'||s.charAt(i)!='J'||
s.charAt(i)!='K'||s.charAt(i)!='L'||s.charAt(i)!='M'||s.charAt(i)!='N'||s.charAt(i)!='O'||s.charAt(i)!='P'||
s.charAt(i)!='Q'||s.charAt(i)!='R'||s.charAt(i)!='S'||s.charAt(i)!='T'||s.charAt(i)!='U'||s.charAt(i)!='V'||
s.charAt(i)!='W'||s.charAt(i)!='X'||s.charAt(i)!='Y'||s.charAt(i)!='Z'||s.charAt(i)!='0'||s.charAt(i)!='1'||
s.charAt(i)!='2'||s.charAt(i)!='3'||s.charAt(i)!='4'||s.charAt(i)!='5'||s.charAt(i)!='6'||s.charAt(i)!='7'||
s.charAt(i)!='8'||s.charAt(i)!='9'||s.charAt(i)!='-'||s.charAt(i)!='_'||s.charAt(i)!=' ') {
for (int i = 0; i < s.length(); i++) {
System.out.println("Token " + j + " = " + (s.charAt(i)));
j++;
}
}
else {
System.out.println("Invalid character(s) entered.. Program terminated!\n");
System.exit(0);
}
}
}
答
看起来你不可能得到你从这段代码中得到的结果。你的陈述是错误的。就目前而言,它永远是真的。角色总是不等于某个角色或不等于另一个角色。所有的!=应该是==。我还要打印出来的不良性格中报告问题的其他部分:
System.out.println("bad character " + s.charAt(i) +
" decimal value: " + (int) s.charAt(i));
扫描程序自身的词法,那就是它返回的令牌,而不是整个字符串。我认为你应该使用控制台,并得到所有键入的内容:
Console console = System.console();
s = console.readLine("Input something to lexically analyze: ");
+0
感谢您的所有反馈。很有帮助。 – user1781192
你有没有混淆'i'和'j'变量? –
您有两个名为i的不同变量。不要这样做。另外,也许你应该考虑将s.charAt(i)缓存到char变量中,并学习''操作符。 –
对我来说它工作正常。在查看它之前,您可能需要打印出s,以便查看您输入的内容。另外,您不打印出令牌,而是打印字符。所以它应该是“字符”+ j。你应该打印出无效字符,它是十进制值。 – Scooter