编写语法分析程序,实现对算术表达式的语法分析。要求所分析算术表达式由如下的文法产生:

要求在对输入的算术表达式进行分析的过程中,依次输出所采用的的产生式。
对原文法消除左递归,结果如下:

实现思路:实现求解 FIRST 集、FOLLOW 集的函数 getFirst()、getFollow(),读取文法产生式,根据构造的 FIRST 集、FOLLOW 集实现构造分析表的函数 generateTable()。最后,读入待分析的字符串,实现 splitTerminal()函数将其分解为终结符的形式(主要将数字转换为 num),通过 analyse()函数,借助栈对终结符序列进行分析。
对原文法进行拓展文法,结果如下:

根据文法画出 LR(1),并合并得到 LALR(1),且无冲突,项目集 DFA 如下:

由图可得分析表如下:
| ACTION | ACTION | ACTION | ACTION | ACTION | ACTION | ACTION | ACTION | GOTO | GOTO | GOTO | GOTO | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| $ | ( | ) | + | - | * | / | num | E’ | E | T | F | |
| 0 | S4 | S5 | 1 | 2 | 3 | |||||||
| 1 | ACC | S6 | S7 | |||||||||
| 2 | R3 | R3 | R3 | R3 | S8 | S9 | ||||||
| 3 | R6 | R6 | R6 | R6 | R6 | R6 | ||||||
| 4 | S4 | S5 | 10 | 2 | 3 | |||||||
| 5 | R8 | R8 | R8 | R8 | R8 | R8 | ||||||
| 6 | S4 | S5 | 11 | 3 | ||||||||
| 7 | S4 | S5 | 12 | 3 | ||||||||
| 8 | S4 | S5 | 13 | |||||||||
| 9 | S4 | S5 | 14 | |||||||||
| 10 | S15 | S6 | S7 | |||||||||
| 11 | R1 | R1 | R1 | R1 | S8 | S9 | ||||||
| 12 | R2 | R2 | R2 | R2 | S8 | S9 | ||||||
| 13 | R4 | R4 | R4 | R4 | R4 | R4 | ||||||
| 14 | R5 | R5 | R5 | R5 | R5 | R5 | ||||||
| 15 | R7 | R7 | R7 | R7 | R7 | R7 |
实现思路:将分析表内容通过 generateTable()函数导入。读入待分析的字符串,实现 splitTerminal()函数将其分解为终结符的形式(主要将数字转换为 num),通过 analyse()函数,借助栈(状态栈、符号栈)对终结符序列进行分析。





