如何获得词法分析器来分析输入的每个字符(减空格)?

时间:2018-10-07 21:06:36

标签: java analyzer lexical

我目前正在尝试用Java创建一个词法分析器,并且在使分析器分析输入的每个字符方面遇到一些困难。我目前可以用每个字符之间的空格来分析代码,但是要求分析器应该能够将“(和”检测为“(”和“和”,因此使用空格进行分隔分析不会'没事。

我的代码效率不高,但是目前可以通过使用两者之间的空格来分析输入的文本。有没有一种方法可以分析输入的每个字符,而不是使用“”将它们分开?

这是我的代码:

String input = JOptionPane.showInputDialog("Enter the Math Problem:");
    //input is "(sum + 47) / total"
    StringTokenizer st = new StringTokenizer(input, " ");
    JOptionPane.showMessageDialog(this,st.countTokens());


    //Displays the header to the information table
    jTextArea1.append("John D. Student, CSCI4200-DA, Fall 2018, Lexical Analyzer \n" + 
                      "******************************************************************************** \n \n");
    //Displays the input value
    jTextArea1.append("Input: " + input + "\n");
    while(st.hasMoreTokens()) {
        //Begin displaying the next token
        jTextArea1.append("Next token is: ");

            String nextItem = st.nextToken();
            if("(".equals(nextItem)) {
                jTextArea1.append("LEFT_PAREN" + "     " + "Next lexeme is " + nextItem + "\n");
            }
            else if("sum".equals(nextItem)) {
                jTextArea1.append("IDENT" + "              " + "Next Lexeme is " + "sum" + "\n");
            }
            else if("+".equals(nextItem)) {
                jTextArea1.append("ADD_OP" + "           " + "Next lexeme is " + nextItem + "\n");
            }
            else if("47".equals(nextItem)) {
                jTextArea1.append("INT_LIT" + "            " + "Next lexeme is " + "47" + "\n");
            }
            else if(")".equals(nextItem)) {
                jTextArea1.append("RIGHT_PAREN" + "  " + "Next Lexeme is " + nextItem + "\n");
            }
            else if("/".equals(nextItem)) {
                jTextArea1.append("DIV_OP" + "            " + "Next lexeme is " + nextItem + "\n");
            }
            else if("total".equals(nextItem)) {
                jTextArea1.append("IDENT" + "             " + "Next lexeme is " + "total" + "\n");
            }
            else {
                jTextArea1.append("Unknown Character \n");
            }
    }
    //Once the tokens are done, display the finish message
    if(!st.hasMoreTokens()) {
        jTextArea1.append("******************************************************************************** \n \n");
        jTextArea1.append("Next token is: END_OF_FILE" + "     " + "Next lexeme is EOF \n");
        jTextArea1.append("Lexical analysis of the program is complete!");
    }
}

1 个答案:

答案 0 :(得分:0)

如上所述,我需要更多定界符来进行标记。

StringTokenizer st = new StringTokenizer(input, " ()+-");

是我的意思的起始示例,空格,括号,加号和减号。在定界符字符串中添加更多字符,以使它们也被标记。

您永远都不会看到字符串标记是否等于某个数字,这将阻止进一步的进展。

使用类似

int newnum = Integer.ParseInt(nextItem);

进行初始检查后,看看它是否为整数。