Как получить лексический анализатор для анализа каждого введенного символа (минус пробелы)?

В настоящее время я пытаюсь создать лексический анализатор в Java, и у меня возникают некоторые трудности с получением анализатора для анализа каждого введенного символа. В настоящее время он анализирует код с пробелами, вставляемыми между каждым символом, но требования заключаются в том, что анализатор должен уметь обнаруживать "(sum" as "(" и "sum"), поэтому анализ с использованием пробелов для их разделения не т работа.

Мой код не очень эффективен, но в настоящее время он работает для анализа введенного текста с использованием пробелов между ними. Есть ли способ проанализировать каждый введенный символ вместо использования "" для их разделения?

Вот мой код:

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 ответ

Как я уже говорил выше, нужно больше разделителей для токенизации.

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

Это стартовый пример того, что я имею в виду, пробел, скобки, плюс и минус. Добавьте больше символов в строку разделителя, чтобы они тоже были символизированы.

Вы никогда не должны видеть, равен ли строковый токен определенному числу, это заблокирует дальнейший прогресс.

Используйте что-то вроде

int newnum = Integer.ParseInt(nextItem);

после первоначальной проверки, чтобы увидеть, если это целое число, конечно.

Другие вопросы по тегам