2012-10-28 81 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