2012-10-28 2 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를 인쇄하고 싶을지도 모른다. 또한 토큰을 인쇄하지 않고 문자 만 인쇄합니다. 따라서 "Character"+ j 여야합니다. 유효하지 않은 문자와 10 진수 값을 출력해야합니다. – Scooter

답변

1

이 코드에서 얻은 결과를 얻는 것은 불가능한 것처럼 보입니다. if 문이 잘못되었습니다. 현재로 서서, 그것은 항상 사실 일 것입니다. 문자는 항상 일부 문자와 같지 않거나 다른 문자와 같지 않습니다. 모든! =은 ==이어야합니다. 나는 또한 그것을보고하는 다른 부분에 잘못된 문자를 출력 할 것이다 :

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