1. 问题描述 编写语法分析程序,实现对算术表达式的语法分析。要求所分析算术表达式由如下的文法产生:
文章图片
要求在对输入的算术表达式进行分析的过程中,依次输出所采用的的产生式。
2. LL(1)文法 对原文法消除左递归,结果如下:
文章图片
实现思路:实现求解 FIRST 集、FOLLOW 集的函数 getFirst()、getFollow(),读取文法产生式,根据构造的 FIRST 集、FOLLOW 集实现构造分析表的函数 generateTable()。最后,读入待分析的字符串,实现 splitTerminal()函数将其分解为终结符的形式(主要将数字转换为 num),通过 analyse()函数,借助栈对终结符序列进行分析。
3. LR 文法 对原文法进行拓展文法,结果如下:
文章图片
根据文法画出 LR(1),并合并得到 LALR(1),且无冲突,项目集 DFA 如下:
文章图片
【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 |
4. 测试情况
- 分析字符串:(1+1)/2+3*(4-4)
文章图片
文章图片
- 分析字符串:1.2E3+4.56*(77.889/0.001-2)
文章图片
文章图片
- 分析错误串:1-2*(3+)
文章图片
文章图片
推荐阅读
- opencv|OpenCV图像学习八,图像归一化盒子滤波处理和图像高斯滤波处理实现
- C++|OpenCV图像处理学习十,图像的形态学操作——膨胀腐蚀
- opencv|OpenCV图像处理学习七,利用回调函数setMouseCallback和鼠标响应处理函数onMouse实现ROI感兴趣区的提取
- JavaScript|神经网络之智能科学与技术专业
- webrtc|webrtc 编译环境搭建
- C++|C++ 【类和对象: 初始化列表,Static成员 --3】
- C++|【C++】new/delete对象过程
- Windows核心编程|Windows提取环境变量
- c语言|学习了循环碰到了编写计算n的阶乘的题目,由此引发了一系列问题,包括一些初学者常见的坑,以及如何简化代码