有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

    }
}

共 (2) 个答案

  1. # 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:  "); 
    
  2. # 2 楼答案

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