Как получить лексический анализатор для анализа каждого введенного символа (минус пробелы)?
В настоящее время я пытаюсь создать лексический анализатор в 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);
после первоначальной проверки, чтобы увидеть, если это целое число, конечно.