2012-10-28 34 views
0

我正在写一个词法分析器。我知道这很简单。它会运行,但无论何时输入一个输入,程序都将其视为无效字符(即使它们应该是有效的)。我做错了什么?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); 
     } 

    } 
} 
+1

你有没有混淆'i'和'j'变量? –

+5

您有两个名为i的不同变量。不要这样做。另外,也许你应该考虑将s.charAt(i)缓存到char变量中,并学习'<' and '>'操作符。 –

+0

对我来说它工作正常。在查看它之前,您可能需要打印出s,以便查看您输入的内容。另外,您不打印出令牌,而是打印字符。所以它应该是“字符”+ j。你应该打印出无效字符,它是十进制值。 – Scooter

回答

1

看起来你不可能得到你从这段代码中得到的结果。你的陈述是错误的。就目前而言,它永远是真的。角色总是不等于某个角色或不等于另一个角色。所有的!=应该是==。我还要打印出来的不良性格中报告问题的其他部分:

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