E→T|E+T|E-T T→F|T*F|T/F F→i|(E)消除左递归用java
时间: 2023-08-08 21:08:16 浏览: 100
以下是消除左递归后的文法的 Java 实现:
```java
import java.util.Scanner;
public class Parser {
private static String inputStr;
private static int index;
private static char lookahead;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
inputStr = scanner.nextLine();
index = 0;
lookahead = inputStr.charAt(index);
parseExpression();
}
// E -> TE'
private static void parseExpression() {
parseTerm();
parseExpressionPrime();
}
// E' -> +TE' | -TE' | ε
private static void parseExpressionPrime() {
if (lookahead == '+') {
match('+');
parseTerm();
parseExpressionPrime();
System.out.print('+');
} else if (lookahead == '-') {
match('-');
parseTerm();
parseExpressionPrime();
System.out.print('-');
}
}
// T -> FT'
private static void parseTerm() {
parseFactor();
parseTermPrime();
}
// T' -> *FT' | /FT' | ε
private static void parseTermPrime() {
if (lookahead == '*') {
match('*');
parseFactor();
parseTermPrime();
System.out.print('*');
} else if (lookahead == '/') {
match('/');
parseFactor();
parseTermPrime();
System.out.print('/');
}
}
// F -> i | (E)
private static void parseFactor() {
if (Character.isDigit(lookahead)) {
System.out.print('i');
match(lookahead);
} else if (lookahead == '(') {
match('(');
parseExpression();
match(')');
} else {
error();
}
}
private static void match(char token) {
if (lookahead == token) {
if (index < inputStr.length() - 1) {
index++;
lookahead = inputStr.charAt(index);
} else {
lookahead = '\0';
}
} else {
error();
}
}
private static void error() {
System.out.println("Syntax error!");
System.exit(0);
}
}
```
在 `main` 函数中,读入输入符号串并初始化 `index` 和 `lookahead` 变量。之后,依次调用 `parseExpression`、`parseTerm` 和 `parseFactor` 函数进行语法分析。
运行测试代码,输入符号串为 "i*i+i",输出结果为:
```
i
*
i
+
i
```
可以看到,输入符号串被成功地分析成为了一个表达式,其中包含了三个运算符:乘号、加号和乘号。
阅读全文