java中的初学者词法分析器

时间:2012-10-28 21:40:24

标签: java analyzer lexical

我正在写一个词法分析器。我知道这很简单。它运行但只要输入输入,程序就会将其视为无效字符(即使它们应该有效)。我做错了什么?

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);
        }

    }
}

2 个答案:

答案 0 :(得分:1)

似乎无法从此代码中获得您所说的结果。你的if语句错了。目前的情况是,它永远都是真的。字符将始终不等于某个字符或不等于另一个字符。所有的!=都应该是==。我还会在报告它的else部分打印出坏字符:

System.out.println("bad character " + s.charAt(i) +
     " decimal value: " + (int) s.charAt(i));

扫描仪本身就是lexing,也就是说,它会返回令牌,而不是整个字符串。我认为您应该使用Console并获取所有输入的内容:

Console console = System.console();
s = console.readLine("Input something to lexically analyze:  "); 

答案 1 :(得分:0)

import java.util.*;

public class Main {
    static int i;

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String s = "";
        while (true) {
            System.out.println("Input something to lexically analyze: ");
            s = input.nextLine();
            analize(s);
        }
    }

    public static void analize(String s) {
        String t = "-1234567890_ abcdefjhijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ";
        char[] tt = t.toCharArray();
        char[] cc = s.toCharArray();
        int z = 1, i = 0, j = 0;
        for (i = 0; i < cc.length; i++) {
            for (j = 0; j < tt.length; j++) {
                if (cc[i] == tt[j]) {
                    System.out.println("Token " + z + " = '" + cc[i] + "'");
                    z++;
                    break;
                }
            }
            if (j > tt.length - 1) {
                System.out.println("Invalid character " + (i + 1) + " ('" + cc[i] + "') entered...");
            }
        }
    }
}
相关问题