没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
语法分析程序设计
一. 实验目的
理解语法分析器的任务和工作原理;掌握计算机语言语法分析程序的设计方法,并能够
针对给定语言的语法规则,使用某种高级编程语言实现其语法分析器。
二. 实验内容
对于只含有+、*运算的算术表达式,编写相应的语法分析程序,要求:
1. 用表驱动的预测分析法进行语法分析。
2. 采用某种高级程序设计语言,设计并实现语法分析程序。
3. 设计恰当的测试用例对语法分析程序进行测试。
三.实验设备
计算机、Windows 操作系统、编程语言集成开发环境。
四.实验原理(或程序框图)及步骤
1.构造 LL(1)分析表
假设存在以下文法:
E→TE`
E`→+TE`|�
T→FT`
T`→*FT`|�
F→(E)|id
产生式 E→TE`被加到 M[E,( ]和[E,id ]
产生式 E`→+TE`被加到 M[E`,+],E`→�被加到 M[E`,) ]和 M[E`,$]
产生式 T→FT`被加到 M[T,( ]和 M[T,id]
产生式 T`→*FT`被加到 M[T`,*],T`→�被加到 M[T`,+]M[T`,)]和 M[T`,$]
产生式 F→(E)被加到 M[F,( ],F→id 被加到 M[F,id]
输入符号
非终结符号
id
+
*
(
)
$
E
E`
T
T`
F
E→TE`
T→FT`
F→id
E`→+TE`
T`→�
T`→*FT`
E→TE`
T→FT`
F→(E)
E`→�
T`→�
E`→�
T`→�
图 1 构造 LL(1)分析表
第 2 页
2.语法分析程序设计思路
(1)定义分析表并输入字符串,将输入串首字符读入 a。
(2)令 X 等于栈顶符号,并输出栈符号和剩余字符串。
(3)判断 X 是否为终结符。如果是,再判断 X 是否等于 a。如果不等于 a 则报错,否则再判
断 X 是否等于$。如果不等于$,则 ip+1 并读入下一符号到 a,同时返回步骤(2),否则结束
程序。
(4)如果 X 不是终结符,那么 X 就为非终结符。再判断 M[X,a]是不是产生式,如果是,
则输出该产生式弹出栈顶的非终结符号并将产生项逆序入栈,否则产生语法错误。
(5)因为使用的是 do...while 循环,所以最后判断 X 是否等于$,也就是栈是否已经空了。如
果等于则说明输入缓冲区的符号已经读取完毕,语法分析过程完成,否则接着循环,返回到
步骤(2)。
3.流程图
图 2 程序流程图
第 3 页
4.数据结构
定义两个数组存储终结符和非终结符。字符串数组 form[]存储产生式。二维数组 M[][]存
放 LL(1)分析表。stack 栈存储文法符号。top 为栈顶指针,其指向的栈顶符号会赋给 X,因此
X 代表栈顶符号。ip 为输入串指针,一般指向输入串的首字符,并将其赋给 a,a 为当前输入
的字符。str 存放输入的字符串。
char non_sign[10] = { 'E','A','T','B','F' };//存放非终结符号
char ter_sign[10] = { 'i','+','*','(',')','$' };//存放终结符号
string form[10];//存放产生式
int M[5][6];//定义一个 LL(1)分析表
char stack[max];//符号栈
char X;//栈顶符号
int top = 0;//栈顶指针
char a;//当前输入的符号
string str;//输入字符串
int ip = 0;//输入串指针
int flag;//分析表中的数
5.所用函数及其关系
程序的关键在于如何存储 LL(1)分析表。init_form()将产生式存储到一维数组 form[]当中。
init_table()初始化一个二维数组 M[][],将表中元素全部赋值为-1。通过 seek_non()和 seek_ter()
返回非终结符号对应的下标和终结符号对应的下标,从而找到 M[][]对应的 flag 标志,即存储
产生式的数组 form[]的下标。通过这种方式找到产生式并输出。print()打印栈符号和剩余字符
串。
init_form();//算术表达式的产生式的初始化
init_table();//LL(1)分析表的初始化
LL_table();//赋值成算术表达式的 LL(1)分析表
seek_non() //找到当前非终结符号对应的下标(纵坐标)
seek_ter() //找到当前终结符号对应的下标(横坐标)
print()//输出栈符号和剩余字符串
error() //错误情况
6.错误恢复策略
(1)预测分析表中的错误检测
两种情况下可以检测到错误:
·栈顶的终结符和当前输入符号不匹配;
·栈顶非终结符与当前输入符号在预测分析表对应项中的信息为空。
(2)预测分析表中的错误恢复
可以使用恐慌模式:
剩余11页未读,继续阅读
资源评论
会举重的薯片
- 粉丝: 2135
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- vscode配置c/c 环境教程
- vscode配置c/c 环境教程
- 基于matlab实现电磁优化计算功能,进行线型规划优化电磁设计.rar
- 基于matlab实现带精英策略的非支配排序遗传算法matlab 源码.rar
- 基于matlab实现差分进化算法,最新的用于替代遗传算法,是以后的主要发展方法.rar
- VSCode配置c/c++环境教程.md
- 基于matlab实现标准合作型协同进化遗传算法matlab源程序
- 七下人教.zip
- 基于matlab实现本份代码能对图像进行gabor滤波处理,结合指纹方向图以及指纹沟壑频率特性,对指纹图像进行增强.rar
- 基于matlab实现RBM神经网络实现了手写数字体识别的GUI程序.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功