我目前正在尝试用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!");
}
}
答案 0 :(得分:0)
如上所述,我需要更多定界符来进行标记。
StringTokenizer st = new StringTokenizer(input, " ()+-");
是我的意思的起始示例,空格,括号,加号和减号。在定界符字符串中添加更多字符,以使它们也被标记。
您永远都不会看到字符串标记是否等于某个数字,这将阻止进一步的进展。
使用类似
int newnum = Integer.ParseInt(nextItem);
进行初始检查后,看看它是否为整数。