编译原理LL(1)文法-判断,first,follow,select,分析字符串

编译原理LL(1)文法-判断,first,follow,select,分析字符串

好久不更新了,U盘格式化了,之前的代码都丢了,诶,好久了才想起来有个CSDN还没更新过,以后会坚持更新的,这次先挂上LLI文法吧,之后补上之前总结的算法,之后的内容大都是跟着课堂的,然后再根据自己跟大佬自学的东西,进行更新吧
——————————————————————————————————————————
这是实验要求:
编写程序,实现下列功能:

  1. 输入一个LL(1) 文法,存储
  2. 输出文法中每个非终结符的FIRST集和FOLLOW集
  3. 构造文法的预测分析表,并显示
  4. 输入一个符号串,可以输出该符号串的最左推导。
    ——————————————————————————————————————————
    这是判断文法能否推出空,first,follow,select的算法,通俗易懂,之后解释一下

——————————————————————————————————————————
1、判断各非汇总结符是否可以推出空
(1)将各非终结符出示状态置为“未知”
(2)按顺序扫描各产生式右部。分为下面几种情况:
a、若遇到符号“ε”,检查左部非终结符状态,若不是“空”,将其置为“空”,继续扫描下一产生式;
b、若遇到终结符,检查左部非终结符状态,若为“未知”,将其置为“非空”,继续扫描下一产生式;
c、若遇到非终结符,检查该非终结符状态,若为“未知”,则跳过当前产生式,扫描下一产生式;若为“非空”,检查左部非终结符状态,若为“未知”,将其置为“非空”,继续扫描下一产生式;
若为“空”,继续扫描本产生式的下一符号;
d、若遇到“\0”,检查左部非终结符状态,若不是“空”,将其置为“空”,继续扫描下一产生式;
e、若上述a,b,c,d过程引起了非终结符状态的改变,则跳到(2)处继续循环,否则跳出循环,判断结束。

2、求非终结符的first集
扫描以要求first集的非终结符为左部的各产生式的右部,分为下面几种情况:
A、若遇到终结符,将该终结符加入左部非终结符的first集,继续扫描下一产生式;
B、若遇到符号“ε”,将“ε”加入左部非终结符的first集,继续扫描下一产生式;
C、若遇到非终结符,将该非终结符的 first集— {ε} 加入左部非终结符的first集,然后检查该非终结符是否可以推出空,若可以为空,则扫描本产生式的下一符号;若不为空,则继续扫描下一产生式;
D、若遇到“\0”,将“ε”加入左部非终结符的first集,继续扫描下一产生式;

3、求某一非终结符的FOLLOW集
(1)在产生式右部找到该非终结符,扫面它后面的符号,分为下面几种情况:
A、若是终结符,则将该终结符加入该非终结符的folow集;
B、若是非终结符,将该非终结符的 first集— {ε} 加入该非终结符的folow集,然后检查该非终结符是否可以推出空,若可以为空,则扫描本产生式的下一符号;
C、若是“\0”,则将该产生式的左部非终结符的follow集加入它的follow集。
(2)在产生式的右部继续查找该非终结符,若找到,转(1)步。
4、求某产生式的select集
扫描产生式的右部,分为下面几种情况:
(1) 若是终结符,则将该终结符加入该产生式的select集;
(2) 若是“ε”,将左部非终结符的follow集加入该产生式的select集;
(3) 若是非终结符,将该非终结符的 first集— {ε} 加入该产生式的select集,然后检查该非终结符是否可以推出空,若可以为空,则扫描本产生式的下一符号;
(4) 若是“\0”,则将该产生式的左部非终结符的follow集加入该产生式的select集。
———————————————————————————————————————————
程序是用C++实现的,2维数组存储文法,这种简单的操作就不说了,first,follow,select,这些集合,都是要求不重复的,在程序实现的时候也是使用各种大循环来实现,所以,选择用set容器来存储这些集合,set有排序和去除重复的功能,具体的迭代器取值啥的,百度结合set的用法即可。

———————————————————————————————————————————
之后就是输入字符串,并进行分析,这时候我们先构造预测分析表,下面的程序按7即可,之后利用栈的思想,逐一分析,这里我用的是string字符串的用法,没用栈,栈取值比较麻烦,所以用的string,上代码吧
我的代码如果想执行8,必须先执行7!!!!!!!!
如果想再输入文法或者字符串的时候,请在运行一下,我懒得赋初值了。。。。。。
专业有大佬写了300,400行,用的map,map我也用不好,就数组吧,500多行。

#include<set>
#include<vector>
#include<iostream>
  • 5
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

航霸霸

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值