杂
3型文法 = 右线性文法
短语、直接短语、句柄
、判断是否是二义性文法
1、证明是二义性文法:证明存在一个句子有两颗不同的语法树
① 画语法分析树
②
、NFA、DFA
K:所有状态,包含初始状态
Σ:终结字符集
M:状态转换表达式
S:开始符号
F:结束符号(可以有多个)
最小化
- 如果给的是一张表,那就先化简,删去那些根本到不了的状态
- 最小化的结果就是画出状态转换图
消除左递归性
First 集
First 集:首符号集
就是找最左边可能出现的终结符
例子:
分三种情况
Follow集
先找到待求的大写字母(只从所有产生式的右部找),然后看他的右边,判断右边属于哪种情况
LR(0)文法
任意一个项目集中都不能出现以下两种情况:
- 同时出现移进项(点后面是终结符)和归约项(点后面没有东西)
- 同时存在两个及以上归约项
否则他就是LR(0)文法
1、状态分析表
2、LR 分析表
ACTION表(移进项、接受项、归约项)
表头写出所有的终结符
移进项写S几,几是项的序号
接受项写acc
项集是归约项,写r几,几是产生式的序号
GOTO 表(只写待约项的)
表头写出所有的非终结符
待约项直接写数字
LR(0) 分析过程(SLR分析过程类似)
翻译:
对于每一行,都先去分析表中找 第 状态栈栈顶 行,符号栈栈顶 列,看他是啥:
- 若是移进项,找到S几,脚标放状态栈
- 若是归约项,找到对应序号的产生式:r几 写到 ACTION 列,出栈右部长度个元素,写出GOTO[状态栈的栈顶,左部],去分析表中寻找第 状态栈栈顶 行,第 左部 列的数字写到GOTO列,同时该数字作为新的状态栈栈顶;而左部作为新的符号栈栈顶
对于发生冲突的项,选择能够继续往下分析的项。(SLR分析)
SLR(1) 分析表
对发生冲突的移进项和归约项求简单向前看1集合
- 对于移进项,就是点后面的 终结符
- 对于归约项,就是 Follow(左部)
在 LR(0) 分析表的基础上,
对于每个归约项,求他的 Follow集,只在出现在 follow 集中的输入符号处写 r几
其他和LR(0)一样
SLR 分析的过程和SL一样
错题
选择
记法:语言由句子构成
判断
填空
大题
画分析树
本体关键:如何不重不漏
画圈法:
递归文法
主要看答题模板:
有限自动机
主要看答题模板:
语法制导
判断继承属性 和 综合属性
看后面打括号里面的每个式子,式子左边的部分在产生式的左部就是综合属性,在产生式的右部就是继承属性
注释分析树:
属的躯干其实就是语法分析树
还要加上每个结点的值以及箭头指向
例题: