一种比较简单的算术表达式的BNF定义如下 〈算术表达式〉→〈项〉|〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉 〈项〉→〈因式〉|〈项〉*〈因式〉|〈项〉/〈因式〉 〈因式〉→〈变量〉|(〈算术表达式)) 〈变量〉→i 用符号表示如下: E→T|E+T|E-T T→F|T*F|T/F F→i|(E) 2、消去上面文法的左递归 E→TE’ E’→+TE’|-TE’|ε T→FT’ T’→*FT’|/FT’|ε F→i|(E) 3. 按消去左递归的文法,使用Java写出对应的递归下降语法分析器。
时间: 2023-08-21 19:22:02 浏览: 236
以下是消除左递归后的文法:
E → TE’
E’ → +TE’ | -TE’ | ε
T → FT’
T’ → *FT’ | /FT’ | ε
F → i | (E)
下面是对应的递归下降语法分析器的Java代码:
```java
import java.util.Scanner;
public class Parser {
private static String input;
private static int pos;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入算术表达式:");
input = scanner.nextLine();
pos = 0;
try {
parseE();
if (pos == input.length()) {
System.out.println("输入合法");
} else {
System.out.println("输入不合法");
}
} catch (Exception e) {
System.out.println("输入不合法");
}
}
private static void parseE() throws Exception {
parseT();
parseEPrime();
}
private static void parseEPrime() throws Exception {
if (pos < input.length() && (input.charAt(pos) == '+' || input.charAt(pos) == '-')) {
pos++;
parseT();
parseEPrime();
}
}
private static void parseT() throws Exception {
parseF();
parseTPrime();
}
private static void parseTPrime() throws Exception {
if (pos < input.length() && (input.charAt(pos) == '*' || input.charAt(pos) == '/')) {
pos++;
parseF();
parseTPrime();
}
}
private static void parseF() throws Exception {
if (pos < input.length() && input.charAt(pos) == '(') {
pos++;
parseE();
if (pos < input.length() && input.charAt(pos) == ')') {
pos++;
} else {
throw new Exception();
}
} else if (pos < input.length() && input.charAt(pos) == 'i') {
pos++;
} else {
throw new Exception();
}
}
}
```
阅读全文