0

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

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

    }
}
4

2 回答 2

1

似乎不可能得到你说你从这段代码中得到的结果。你的 if 语句是错误的。就目前而言,它将永远是正确的。一个字符总是不等于某个字符或不等于另一个字符。所有的 != 都应该是 ==。我还将在报告它的 else 部分中打印出坏字符:

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

Scanner 自己进行词法分析,也就是说,它返回标记,而不是整个字符串。我认为您应该使用 Console 并获取输入的所有内容:

Console console = System.console();
s = console.readLine("Input something to lexically analyze:  "); 
于 2012-10-28T22:03:41.150 回答
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...");
            }
        }
    }
}
于 2020-08-28T22:23:34.590 回答