简答题
1.二义性文法证明
- 一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。也就是该句子有两个不同的最左(最右)推导。
例子
证明下列文法G(S)是二义的
S->Ac|aB
A->ab
B->bc
判断:自己定义一个句子,然后说明这个句子有两个语法树 (这里是:abc)
语法分析树 + 短语 + 句柄
短语:每一棵子树的叶子
直接短语:每棵直接子树的叶子
句柄:某句型的最左直接短语(即规范分析中最先被规约的字串)
素短语:至少包含一个终结符且不包含更小素短语的短语
注释分析树 + 依赖图
1.正规式
词法分析和语法分析
2.LL(1)分析
判断LL(1)文法:
- 1.已化简且无左递归
- 2.对于G中的每个产生式A->r1|r2|…|rm,其余候选式均满足:
- 1.FIRST集 两两不相交
- 2.若有候选式为空,其余的FIRST(ri) 交FLLOW(A)=空
2.1消除左递归
2.2预测分析表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BQYZrg7W-1654096433336)(https://s2.loli.net/2022/06/01/oy7rYDOG9C5zw6J.png)]
2.3分析过程
预测分析表
a | ^ | ( | ) | , | # | |
---|---|---|---|---|---|---|
S | a | ^ | (T) | |||
T | SN | SN | SN | |||
N | N-># | ,SN |
分析过程
- 分析栈 和 产生式 的顺序是反的!!!
- 分析栈 和 余留输入串 匹配时,两边都出栈
LR文法的关系
1.规约项目: A->α.
2.接收项目: S->α. (S为开始符号)
3.移进项目:A->α.xβ (x为终结符)
4.待约项目:A->α.Xβ (X为非终结符)
LR(0)
LR(0)定义
1.LR(0)拓广文法
2.识别全部活前缀的DFA
3.判断LR(0)文法
4.预测分析表
SLR(1)文法
判断SLR(1)
1.拓广文法
2.DFA
![image-20220531161526147](https://s2.loli.net/2022/06/01/KHWDLPy2z69OmQT.png)
3.判断冲突、是否两两不相交
- 规约项目的FOLLOW集
- 移进项目的 “.” 后面的第一个终结符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dZ1vo17z-1654097136471)(https://s2.loli.net/2022/06/01/eJlLh7v9GCTkcP8.png)]
4.SLR(1)分析表
求FOLLOW集
移进
然后再来看2状态大家看2状态接收一个+,2状态接收一个+是不是做移进呢
我们就要看当前所对应的Follow集Follow (E)有#有+有)那就意味着我要在对应的#+),这三列的位置来填它对应的归约,那就是要用第2条产生式进行归约所以我们在这三个位置填的是r2
规约
状态2接收一个 * 它就是什么移进了就可以转移到S7
5.SLR(1)分析过程
句子i+i *i的分析过程:
LR(1)
判断LR(1)
- 无 规约-规约冲突
1.拓广文法
2.DFA(带向前搜索符)
3.判断LR(1)
- 是否有规约-规约冲突—无规约-规约冲突则是LR(1)!
4.LR(1)预测分析表
- 根据式子的向前搜索符来对应Sx 和 Rx 的位置
4.分析过程
5.分析过程
LALR(1)
在 **LR(1)**的基础上 合并同心集
-
同心(项目)集:
如果除展望符外,两个LR(1)项目集(整个大的集合都要相同,如:I2和I3,而不是只是项目集中的某两个式子相同)是相同的,则称这两个LR(1)项目集是同心的
1.拓广文法
2.带向前搜索符的DFA
3.判断
-
是LALR(1)
- 没有同心集且没有冲突
- 合并同心集后无规约-规约冲突
-
不是是LALR(1)
-
合并同心集后有规约-规约冲突
-
-
同心集合并前无规约-规约冲突
- 同一项目集中有两个规约动作且向前搜索符相同才算规约-规约冲突
- 否则就是LR(1)文法
类型表达式
基本类型
类型构造符
例子
DAG(有向无环图)