分析程序源代码:
文法: 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 改回 ε
本文介绍了一个LL1分析程序的实现及其预测分析表的构造过程。该程序能够处理包含括号的四则运算表达式,并通过消除左递归、求FIRST和FOLLOW集等步骤生成预测分析表。
1333

被折叠的 条评论
为什么被折叠?



