C++|基于C++实现简易语法分析程序

1. 问题描述 编写语法分析程序,实现对算术表达式的语法分析。要求所分析算术表达式由如下的文法产生:
C++|基于C++实现简易语法分析程序
文章图片

要求在对输入的算术表达式进行分析的过程中,依次输出所采用的的产生式。
2. LL(1)文法 对原文法消除左递归,结果如下:
C++|基于C++实现简易语法分析程序
文章图片

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

根据文法画出 LR(1),并合并得到 LALR(1),且无冲突,项目集 DFA 如下:
C++|基于C++实现简易语法分析程序
文章图片

【C++|基于C++实现简易语法分析程序】由图可得分析表如下:

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()函数,借助栈(状态栈、符号栈)对终结符序列进行分析。
4. 测试情况
  • 分析字符串:(1+1)/2+3*(4-4)
C++|基于C++实现简易语法分析程序
文章图片

C++|基于C++实现简易语法分析程序
文章图片

  • 分析字符串:1.2E3+4.56*(77.889/0.001-2)
C++|基于C++实现简易语法分析程序
文章图片

C++|基于C++实现简易语法分析程序
文章图片

  • 分析错误串:1-2*(3+)
C++|基于C++实现简易语法分析程序
文章图片

C++|基于C++实现简易语法分析程序
文章图片

    推荐阅读