概念总结
CFG👉上下文无关文法
CSG👉上下文有关文法
LL👉自上而下 从左到右扫描+最左推导
LR家族👉自下而上 从左到右+自底向上
不存在冲突👉LR0
follow集相交为空👉SLR
合并同心集不会产生新冲突👉LALR
合并产生归约归约冲突👉LR1
重要考点
-
编译六步骤⚠️必考
词法分析👉语法分析👉语义分析👉中间代码生成👉代码优化👉目标代码生成 -
字母表运算
1⃣️乘积
2⃣️n次幂
3⃣️正闭包
4⃣️克林闭包 -
文法
G=(Vt,Vn,P,S)
递归文法👉无限集
语言👉句子的集合
1⃣️终结符与非终结符
终结符Vt👉文法定义基本符号
非终结符Vn👉表示语法成分 又称语法变量
产生式T👉合成串的一般形式
开始符号S👉最大语法成分
2⃣️四大类👉逐级包含 0部最大
0型文法👉只要左部包含一个Vn即可
无限制文法/短语结构文法
产生0型语言
1型文法👉上下文有关文法CSG
产生上下文有关语言
左边符号个数必须比右边少
2型文法👉上下文无关文法CFG
产生上下文无关语言
左边必须是Vn
下推自动机识别
3型文法👉正则文法RG
有穷自动机识别
左线性👉右部非终结符没有/只有一个在最左端
右线性👉…在最右端
3⃣️构造语法树⚠️必考
需要结合推导过程
直接短语👉高度为2的部分
直接短语一定是产生式右部
右部不一定是直接短语
一个句子同文法多棵分析树👉二义性文法
-
正则表达式RE👉交换律结合律分配律…
优先级从小到大👉或/连接/克林闭包
有穷自动机👉最长子串匹配原则 -
有穷自动机⚠️NFA转DFA必考
1⃣️DFA 确定的有穷自动机
2⃣️NFA 非确定的有穷自动机
唯一区别👉状态1遇到同种输入可有不同转换
3⃣️正则RE转NFA👉逐层分解
3⃣️NFA转DFA👉列转换表 挨步转换 -
自顶向下/自底向上语法分析
1⃣️最左归约👉规范归约
最右推导👉规范推导
2⃣️最左推导👉自顶向下
最右归约👉自底向上(逆过程)
构造语法树👉按输入指针+最左推导一步步来
- LL(1)
预测分析法
1⃣️判断是不是👉计算FIRST FOLLOW集👉再计算SELECT集👉相同左部的SELECT互不相交👉则为LL1👉构造预测分析表
2⃣️递归的预测分析法
👉为非终结符编写递归下降过程
非递归的预测分析法
👉构造自动机👉由表驱动的预测分析
🐸FIRST集👉串首终结符集合
🐸FOLLOW集👉跟在A后面的终结符集合
🐸SELECT集👉列表筛选
🐸根据SELECT集构造预测分析表
1⃣️提取左公共因子👉设S’👉aAb👉aS’
2⃣️消除左递归👉代公式
-
自底向上语法分析👉最左归约
核心👉移入-归约 -
LR分析法👉无冲突则为LR(0)文法
1⃣️构造LR0分析表
找项目集闭包👉写出DFA👉画图
ACTION GOTO
s代表状态 r代表产生式 acc表示接收成功
2⃣️移进/归约冲突👉SLR(1)👉LR(1)的特例
归约/归约冲突👉LALR可能还有
3⃣️CFG不一定是LR0文法
4⃣️文法处理能力 圆圈越大越强 -
语法制导翻译
SDD👉语法制导定义
SDT👉语法制导翻译方案👉SDD的一种补充 -
运行存储分配
1⃣️静态存储分配👉编译时刻
👉编译时刻确定大小的数据对象,在编译时刻就分配存储空间
2⃣️动态存储分配👉运行时刻
👉不能在编译时刻确定大小(如动态数组),在运行时再分配存储空间
👉栈式存储分配/堆式存储分配
栈👉活动记录👉过程调用时进栈 返回时出栈
堆👉把连续存储区域分块
-
划分基本块
找首指令👉第一个首指令到第二个前即基本块
1⃣️第一个指令2⃣️跳转指令的目标指令
3⃣️跳转指令之后的一个指令 -
画流图👉找连接基本块的边
1⃣️跳转语句直接画
2⃣️两个基本块挨着 且前面结尾没有无条件跳转 -
代码优化
三个原则👉等价 有效 合算
1⃣️窥孔优化👉滑动窗口
删除冗余存取 常量合并 常量传播 代数化简
控制流优化 死代码删除 强度削弱
使用目标机惯用指令
2⃣️局部优化👉在基本块范围内
👉基本块作为窗口的窥孔优化
常量合并 常量传播 删除公共子表达式
复写传播 删除无用赋值 代数化简
3⃣️循环优化👉循环内的代码
代码外提 删除归纳变量
4⃣️全局优化👉整个程序过程
👉跨越多个基本块
常量合并 常量传播 删除公共子表达式
…同2⃣️ -
目标代码生成
指令选择👉寄存器分配👉指令调度 -
中间代码
逆波兰👉运算对象写前面 运算符号写后面
三元式👉列表 序号(运算符 对象1 ,对象2)
四元式👉列表(符op,arg1,arg2,结果t1)