编写语法分析程序,实现对算术表达式的语法分析。要求所分析算术表达式由如下的文法产生:
要求在对输入的算术表达式进行分析的过程中,依次输出所采用的的产生式。
对原文法消除左递归,结果如下:
实现思路:实现求解 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()函数,借助栈(状态栈、符号栈)对终结符序列进行分析。