编译原理——语法分析器(C/C++代码实现)


0 🐣实验目的

编写一个简单的LL(1)语法分析器。(注意:此实验是简化版的LL(1)文法,已给出预测分析表,不需要求FIRST和FOLLOW集,直接根据预测分析表编写程序即可)

1 🐣实验要求

根据编译原理理论课中学习的算术表达式文法,以及该文法LL(1)分析表,用C语言编写接受算术表达式为输入的语法分析器,以控制台(或文本文件,也可以结合词法分析器完成)为输入,控制台(或文件)输出产生式序列形式的分析结果。

2 🐣实验内容

实现LL(1)语法分析器。执行过程举例:分析id+id*id,根据PPT上的预测分析表,输入id+id*id#,分析出栈和输出的内容。
文法如下:

E→TE' E' →+TE' |ε T→FT'
T' →*FT' |ε F→(E)|id

3 🐣实验思路

  1. 首先明确LL(1)语法分析器的大致结构,然后设计各个模块结构。

  1. 定义常量(比如预测分析表的行变量个数,列变量个数),变量(主函数用到的循环变量等等),数据结构(比如存储符号的分析栈以及临时使用的临时栈)

  1. 定义两个一维数组,一个用于存储终结符号,一个用于存储语法变量,再定义一个二维数组用于存储预测分析表。

  1. 我将输出栈内字符和输出输入缓冲区内剩余字符分别定义为了两个函数,这样更方便我进行调用输出。

  1. 主函数是整个程序的重要部分,主要是LL(1)文法的算法实现:即根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作:大致过程是先将初始的符号压入分析栈内,紧接着进入循环,循环测试即为缓冲区内串长度,然后取出栈顶看是否输入缓冲区的符号匹配,不匹配判断栈弹出的符号是否与行变量匹配,匹配就记住行变量,不匹配就报错,接着判断输入缓冲区第一个字符是否与列变量匹配,如果匹配,记住此时列变量,然后与预测分析表进行比对,分析此时情况,直到循环结束,最后得出结论,输出最后的分析结果。


4 🐣实验代码


5 🐣实验结果


6 🐣实验总结

此实验写的并不是太好,应该不能满足大部分的实验要求,需要自己改一下。

7 🐣实验程序以及实验报告下载链接

编译原理实验:包括实验一词法分析器,实验二进制分析,实验三语法分析器,实验四SLR语法分析器等其中含有实验报告,实验代码等等-C++文档类资源-CSDN文库


  • 54
    点赞
  • 260
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小航同学吖

制作不易,动动你的小手

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值