递归下降的预则分析法
递归下降的预测分析
- 消除左递归
- 提取公因子
- 求first集和follow集
- 构造预则分析表
下面以一个支持加法,乘法和括号运算符的计算器文法为例为例子
E->E+T|T
T->T*F|F
F->(E)|id
消除左递归后
E->TE'
E'->+TE'|空
T->FT'
T'->*FT'|空
F->(E)|id
构造出的预则分析表如下

package test;
import java.util.Scanner;
public class PredictAna {
int p = 0;
char[] input;
void E() throws SyntaxException {
char t = input[p];
if (t == 'i' || t == '(') {//应用产生式 E -> T E1
T();
E1();
} else throw new SyntaxException();
}
void E1() throws SyntaxException {
char t = input[p];
if (t == '+') {//应用产生式E1 -> + T E1
p++;
T();
E1();
} else if (t == '#' || input[p] == ')') ;//应用产生式 E -> 空
else throw new SyntaxException();
}
void T() throws SyntaxException {
char t = input[p];
if (t == 'i' || t == '(') {//应用产生式 T -> F T1
F();
T1();
} else throw new SyntaxException();
}
void T1() throws SyntaxException {
char t = input[p];
if (t == '*') {//应用产生式T1 -> * F T1;
p++;
F();
T1();
} else if (t == '+' || t == ')' || t == '#') ;//应用产生式 T1 -> 空
else throw new SyntaxException();
}
void F() throws SyntaxException {
char t = input[p];
if (t == 'i') p++;
else if (t == '(') {//应用产生式 F -> ( E )
p++;
E();
if (input[p] != ')') throw new SyntaxException();
p++;
} else throw new SyntaxException();
}
void test() {//如果没有抛出语法异常则该语句正确否则错误
p = 0;
try {
E();
System.out.println("success");
} catch (SyntaxException e) {
System.out.println("fail");
}
}
public static void main(String[] args) {
PredictAna predictAna = new PredictAna();
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String s = in.next() + '#';//末尾加上一个句末指示符
predictAna.input = s.toCharArray();
predictAna.test();
}
}
}
class SyntaxException extends Exception {
public SyntaxException() {
super("语法错误");
}
}

浙公网安备 33010602011771号