杂
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) 分析表
在 LR(0) 分析表的基础上,发生冲突时
对于移进项还按以前的写
对于每个归约项,求他左部的 Follow集,只在出现在 follow 集中的输入符号处写 r几
其他和LR(0)一样
SLR 分析的过程和SL一样
消除左递归
LL(1)
SELECT 集
每个产生式都有一个 SELECT 集
先看产生式的右部能否推导出 空串,如下图所示:
错题
选择
记法:语言由句子构成
a,b是有顺序的,a必须在b前面,G1的话,b可以在a前面。
要明白左右递归的含义:在S的左 / 右追加一个字符
判断
填空
大题
画分析树
本体关键:如何不重不漏
画圈法:
递归文法
主要看答题模板:
最左或最右推导过程:
① 献给产生式标号
②
- 最左推导:每次都选择最左边的非终结符进行替换
- 最右推导:每次都选择最右边的非终结符进行替换
有限自动机
主要看答题模板:
语法制导
判断继承属性 和 综合属性
看后面大括号里面的每个式子,式子左边的部分在产生式的左部就是综合属性,在产生式的右部就是继承属性
注释分析树:
属的躯干其实就是语法分析树
还要加上每个结点的值以及箭头指向
例题:
注意:下面这个题的 n.val 也算综合属性
注意由非终结符直接推导出 空 的情况,这种算是归约项了