算是考完了 真难啊。。 学弟学妹们看到了可以参考下 有一套真题 一堆有点混乱的复习笔记 不建议全部相信 因为我复习的比较拉胯。 参考下是ok的 语雀链接食用体验更好 戳这里~
考试结束后简单总结一下 题目和往年差别不大
- 语法树
- FIRSTVT表 LASTVT集
- FIRST集 FOLLOW集 结构预测分析表
- 中间代码分析
- SLR(1)分析法
- 翻译语义子程序
经验总结:ppt直接看根本看不懂 顺序也很奇怪 建议先通读ppt 不懂的先跳过 然后重要的知识点是百度 可以去bilibili听一些up主讲一下
我晕 因为图片是语雀导出的,所以是语雀导出的 所以链接有点问题 懒得改了 咱就是说 建议查看语雀上的内容,哈哈 戳这里~
语言部分
1-变量及其属性
变量是一个(或多个)存储单元的抽象,赋值语句是修改存储单元内容的抽象。
属性:
- 功能域:可访问变量的程序范围
- 生存期:一个储存区绑定于一个变量的时间区间
- 值:变量对应存储单元的内容
- 类型:与变量相关的值类, 以及对这些值的操作说明。
1-虚拟机概念

1-程序单元 & 单元实例
 
- ,以及该单元的局部变量所绑定的数据对象的
存储区
2-数据类型的作用
简答题~
- 实现数据抽象
- 从机器的具体特性中解脱程序员
- 提高编程效率
2-数据聚合的六种方式
填空题~ 
2-类型检查和分类
检查数据对象的类型和操作是否匹配,称为类型检查 - 静态检查
- 动态检查

2-抽象数据类型的条件
- 在这类程序单元中,建立与表示相关的基本操作;
- 对于使用该类型的程序单元,该类型的表示是隐藏的。

2-类型等价是什么?

3-语句级控制结构——顺序、选择、重复
- 顺序

- 选择
 
- 重复
 
- 语句级控制结构分析

3-单元级控制结构
3-副作用、别名
非局部变量 一个程序单元可以引用未被本单元说明而被其他单元说明的变量
int a; int b = 666; a = 666; —— a为非局部变量 可以这么理解?
- 非局部变量绑定于其他的程序单元(定义该非局部变量的程序单元)的活动记录中的数据对象;
- 或非局部变量绑定全局数据区中的数据对象称为非局部环境
  哪俩属于别名?   
4-语言的定义
4-语法描述的基本用途

4-文法的定义
 用英文大写字母表示非终结符;小写字母表示终结符;希腊小写字母表示串
4-文法的分类
- 0型文法 产生式形如α→b
- α中至少含一个非终结符
- 1型文法 │α│<=│β│(S→e例外)或产生式形如αAβ→αwβ,w∈V+ (上下文有关文法)
- α中终结符个数小于β
- 2型文法 产生式形如A→α (上下文无关文法)
- 产生式右端均为终结符
- S—>aB|bA
- A—>aS|bAA|a
- B—>bS|aBB|b
- 产生式右端均为终结符
- 3型文法 产生式形如A→α或A→αB (正则文法,右线性文法) α∈VT*
- 在2型的基础上
要求右端最多有一个非终结符,且位于最右端 - S—>bA
- A—>(B|a
- B—>aA
- 在2型的基础上

4-文法产生的语言
推导(与归约)
 
句型 & 句子
 
文法产生的语言L(G)

- 例一

- 例二
 
短语、句柄、素短语
- 短语——叶子节点
- 句柄——最左直接短语

语法树(推导树)
字面意思~
4-例题:推导、句型、句子、短语、句柄
- 例一
 
- 例二

- 例三

编译部分
5-编译等概念
**宿主语言:**编写编译程序的语言。运行翻译程序的机称为宿主机
静态语言需要先进行编译,才能执行代码  动态语言则是可以边解释 边执行代码 
5-编译步骤
- 词法分析
- 输入字符串 根据词法规则识别出单词符号
- 语法分析
- 根据语法规则 将单词符号构成各类语法单位 并进行语法检查
- 语义分析
- 根据语义规则,进行初步编译
- 优化
- 对中间代码进行等价变换 以使代码更有效
- 目标代码生成
- 生成机器语言程序或汇编语言程序
- 符号表管理
- 完成符号表的建立、查找、更新
- 出错处理

6-词法分析器的功能
-
扫描源程序的字符串,按照词法规则,识别出单词符号作为输出
-
对识别过程中发现的词法错误输出有关的错误信息。
-
词法分析器是子程序
- 
- 
6-单词符号的分类
- 标识符
- 基本字
- 常数
- 运算符
- 界符
单词类别的划分(编码的方式)
 
6-状态转换图
简称转换图,是一张有限方向图,是设计词法分析器的有效工具;它由如下成分构成: 1.结点(node):圆圈表示结点,代表状态(state) 2.有向边(弧):连接结点,边上的标记字符表示该状态下可能接收或识别的字符;  
例子

第六章 ppt p21

重点——语法分析
语法分析分为两种 第七章——自上而下(自顶而下) 第八章——自下而上(自底而上) 
7-回溯分析法
 
7-公共左因子
这个例子是啥意思?👇 
提取公共左因子  先提取左公因子 再消除左递归也ok

7-左递归

消除左递归
- 公式

- 例题

间接左递归的消除

复杂的间接左递归消除

- 这个产生的语言是怎么出来得?
 
7-ε产生式

提取公共左因子、消除左递归例题
对于文法G=({a,b,c,d,},{S,A},S,P); 其中P为: S → Aa|Ac|bc A → Ad|Sbc|d 请先提取文法G的工共左因子,再消除左递归 
7-递归下降分析法
这个不在老师画的重点中 要考察麽?  
7-预测分析法
7-预测分析表的构建方法
预测分析表 对于LL(1)文法来说,在使用最左推导时,非终结符号的每一步推导使用的产生式是确定的,不用进行试探和回溯。 求预测分析表 要先求出来FIRST表

预测分析方法

例题
  
7-FIRST集
 大白话:
- 非空串产生式
- 在所要求的字符产生式的右边的第一位寻找终结符,假设该字符产生式集的第一位就是终结符,那么该终结符就是所要求的first集;
- 假设产生式的右边第一位是非终结符,那么继续寻找该非终结符的first集,直至寻找到一个终结符,即是起初所要求字符的first集;       
7-FOLLOW集
https://www.jianshu.com/p/210fda081c76
- 如果存在产生式A -> αBβ ,那么 FIRST(β)中所有非ε的符号都在FOLLOW(B)中;
- 
- 如果存在产生式A -> αB,或者A -> αBβ 且FIRST(β)包含ε,那么FOLLOW(A)中的所有符号都加入到FOLLOW(B)中
- 
($=>#)
- 
follow集的意义是寻找所要求字符的下一个字符可能产生的集合,所以寻找follow集应从产生式的右边进行寻找。
大白话求FOLLOW集
- 在产生式的右边找到相应的字符(从左到右第一个非终结符),假设紧跟其后的是一个终结符,那么该终结符就是所要求的follow集;
- 假设跟在其后的是一个非终结符,那么需要判断该非终结符是否可以为空:
- 假如可以为空,那么将该产生式的左边的follow集加入到寻找集合当中,
- 因为假如该非终结符为空的话,那么需要寻找产生这个非终结符的产生式左边的非终结符,因为产生式左边的非终结符的follow集就有可能是该非终结符的follow集;
- 假如不为空,那么寻找该非终结符的first集,并将结果加入到搜索集合当中。
- 直到不再有非终结符产生,找到所有的终结符,计算结束。
找L的Follow集,先从式子右边找到L——

求follow集的算法
- 默认将右端结束标记 # 放到 FOLLOW(S) 中
- 按照下面两个规则
不断迭代 ,直到所有的FOLLOW集合都不再增长为止- 如果存在产生式A -> *B),那么FOLLOW(B) = { ), # };——对应上面大白话的1
- 
- 如果存在产生式A -> *BC ,那么FOLLOW(B) = FIRST© - ε;——对应上面的2.b
- 
- 
- 如果存在产生式A -> *B,或者A -> xxBC 且FIRST©包含ε,那么FOLLOW(B)=FOLLOW(A)——对应上面的2.a.i
- 如果存在产生式A -> *B),那么FOLLOW(B) = { ), # };——对应上面大白话的1
求预测分析表过程中的应用
- 空串产生式
- 
- 
LL(1)文法的判定
 每一个推导式经过推导其对应的SELECT集的交集为空,其为LL(1)文法。
7-求first follow 预测分析表例题
p55之后
8-自下而上的语法分析——规约
  
算符优先文法的判定
上下文无关文法G,没有形如P→ε或P→. . .QR. . .的产生式,则称G为
最左素短语分析法——基于算符优先表的下堆栈分析过程
![image.png](https://img-blog.csdnimg.cn/img_convert/c9f1e83d6a3a3e3206858988338a547f.png#clientId=ub82bd813-5d31-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=334&id=ue30211a8&margin=[object Object]&name=image.png&originHeight=417&originWidth=600&originalType=binary&ratio=1&rotation=0&showTitle=false&size=368