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

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

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

Вот мой код:

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 голосов
/ 08 октября 2018

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

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

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

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

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

int newnum = Integer.ParseInt(nextItem);

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

...