分析程序源代码:
文法: E -> E+F | E-F | T
T -> T*F | T/F | F
F -> i | (E)
注:这实际上就是包含括号的四则运算的文法。
消除左递归:
E -> TA A -> +TA | -TA | ε
T -> FB B -> *FB | /FB | ε
F -> i | (E)
求预测分析表:
先求FIRST集和FOLLOW集:
FIRST | FOLLOW | |
---|---|---|
E | i ( | # ) |
T | i ( | + - # ) |
F | i ( | * / + - # ) |
A | + - ε | # ) |
B | * / ε | + - # ) |
再求SELECT集合:
SELECT | |
---|---|
E -> TA | i ( |
A -> +TA | + |
A -> -TA | - |
A -> ε | # ) |
T -> FB | i ( |
B -> *FB | * |
B -> /FB | / |
B -> ε | + - # ) |
F -> i | i |
F -> (E) | ( |
由SELECT集合可以得出预测分析表
i | + | - | * | / | ( | ) | # | |
---|---|---|---|---|---|---|---|---|
E | TA | 1 | 1 | 1 | 1 | TA | 1 | 1 |
A | 1 | +TA | -TA | 1 | 1 | 1 | 0 | 0 |
T | FB | 1 | 1 | 1 | 1 | FB | 1 | 1 |
B | 1 | 0 | 0 | *FB | /FB | 1 | 0 | 0 |
F | i | 1 | 1 | 1 | 1 | (E) | 1 | 1 |
注: 此处用 0 表示 ε, 因为ASCII表没有 ε ,用 1 表示没有产生式。
LL(1)预测分析程序:
程序会读取同一目录下的 input.txt 文件中的表达式:
input.txt:
双击exe, 运行结果如下:
结语:
刚刚试了下,c语言也可以使用 ε 符号, ╮(╯_╰)╭
所以,读者如果有兴趣的话也可以把我在程序中使用的 0 改回 ε