编译原理笔记
我是标题
- 1.编译原理流程
- 2.推导的定义
- 3.句型,句子定义
- 4.文法的几种类型
- 5.短语
- 6.给定语法写出文法以及给定文法写出语法。
- 7.消除左递归
- 8.消除回溯
- 9.NFA
- 自上而下分析法
- 10.first集follow集
- 11.预测分析表
- 12.LL(1)
- 13.LL(1)的输入串分析
- 自下而上分析法
- 13.LR(0)
1.编译原理流程
2.推导的定义
3.句型,句子定义
4.文法的几种类型
二型文法也叫上下文无关文法
5.短语
句柄为一棵树最左侧的直接短语,在上图中为P。
直接短语是再无分支的叶子节点。
6.给定语法写出文法以及给定文法写出语法。
7.消除左递归
8.消除回溯
9.NFA
自上而下分析法
10.first集follow集
first求法例如
找X的first集合,就看这个字母产生式右边的第一个,如果是终结符就写入,如果是非终结符就继续往下。
follow集的求法:
1.如果是起始符加上‘#’。
2.如果这个集合右侧为空则等于箭头左侧的Follow集合。
3.如果这个集合的右侧为终结符直接写入。否则他的Follow集合是右侧非终结符的first集合去掉空串。
4.如果右侧非终结符能直接推导到空串,那么要加入Follow右侧集。
例子
11.预测分析表
12.LL(1)
13.LL(1)的输入串分析
1.要点:产生式反着压,转换为终结符,并且尽量往输入符号凑。
自下而上分析法
13.LR(0)
1.拓广文法:
用S‘ 指向它本身,并且吧有或(|)的产生式分离开来,标上序号。
2.画活前缀DFA
从开始符号进行第一次规约/移进
如果移进后,点右侧是非终结符,则把上一个状态的该字母产生式全部写入。
如果这个状态到下一个状态重复了那么将箭头指向自身。
3.引入SLR(1)
可以发现I4和I5发生了移进和归约的冲突。
4.填表
ACTION下放终结符和#。
GOTO下放非终结符。
左侧0-i个State。
1 / # 位置固定为 acc。
通过观察DFA。
I0通过a可以到达状态4填入S4。
I0通过S可以到达状态1填入1。
如果Ix是归约式子,在对应产生式右侧的Follow集合下方填入rx。
任何状态下的归约式子都要如此操作。
I2是归约式子,在对应产生式右侧的Follow集合下方填入r2.
5.分析表
规则:
1.状态栈顶和余串栈顶查表找Action,在下一行写入状态栈,符号站,余串出栈。
2.如果Action为ri,那么通过初始产生式将现有符号栈归约。
比如步骤3:
5和d匹配查表得到r6,那么将现有符号栈匹配产生式6进行归约,归约了几个符号那么状态对应出栈几位。
结果为 05 #bB d#
那么将5和B匹配找到GOTO为7,填入下一个状态。
于是为057 #bB d# GOTO 7。
直到ACTION为acc。
Ri看归约结果,Si看剩余输入串。
于是有
初始状态
结束状态