第一章
第二章
- 基本定义
- 怎么理解上下文有关和无关文法:
- 四种文法的理解
- 《编译原理》求短语,直接短语,句柄,素短语,最左素短语 - 例题解析
- 编译原理之 短语&直接短语&句柄 定义与区分
- 编译原理之 句型&句子&短语&直接短语&句柄&素短语&最左素短语 定义实例详解
- 如何消除文法二义性、如何判断二义文法
第三章
第四章
- 怎么求FIRST集
- 怎么求FOLLOW集
- LL(1)文法
- 自顶向下的语法分析方法有:LL(1)文法的(递归下降分析法,预测分析法)
- 自下向上的语法分析方法有:LR(0),LR(1),SLR(1),LALR(1),算符优先分析方法
- 如何将非LL(1)文法改为LL(1)文法,有下面2步:
- 消除左递归(Eliminate Left Recursion)
- 提取共有前缀(Left Factoring Algorithm)
最后还需要判断得到的文法是不是LL(1)文法,因为不是所有的文法都能改成LL(1)文法。
- 最左推导:每一步推导都是对句型中的最右非终结符用相应的产生式的右部进行替换
- 最右推导:每一步推导都是对句型中的最左非终结符用相应的产生式的右部进行替换
- 编译原理-消除左递归
- 算符优先文法
- 活前缀
之前看到有人说 活前缀是句柄的子集,这是不对的,差点被误导了。准确的应该是这样:
- LR语法分析器
- 四种文法区分:
表示范围:LR(1)>LALR(1)>SLR(1)>LR(0),区别有:LR(0)文法不能解决移进--归约冲突和归约--归约冲突,一旦出现这两种冲突就不是LR(0)文法,所以可表示范围最小。SLR(1)文法可能解决LR(0)文法的移进--归约冲突和归约--归约冲突,也有可能解决不了。LR(1)文法表示范围最大,只是同一个文法,如果构造起自动机来的话LR(1)文法的状态会非常多。解决办法就是使用LALR文法,LALR文法本身不存在移进--归约冲突,如果存在只能是归约--归约冲突。
- 短语,直接短语,素短语与最左素短语(语法树求法)
- 算符文法:任何产生式的右部都不含两个相邻的非终结符。
- 算符优先文法:满足算符文法的情况下,任意一对终结符的关系(a,b)最多只有一种情况
第五章
-
综合属性(synthesized attribute)
在分析树结点 N上的非终结符A的综合属性只能通过N的子结点或 N本身的属性值来定义终结符可以具有综合属性:终结符的综合属性值是由词法分析器提供的词法值,因此在SDD中没有计算终结符属性值的语义规则
-
继承属性(inherited attribute)
在分析树结点 N上的非终结符A的继承属性只能通过N的父结点、N的兄弟结点或 N本身的属性值来定义终结符没有继承属性:终结符从词法分析器处获得的属性值被归为综合属性值
-
S-属性定义
仅仅使用综合属性的SDD称为S属性的SDD,或S-属性定义、S-SDD如果一个SDD是S属性,可以按照语法分析树节点的任何自底向上顺序来计算它的各个属性值
S-属性定义可以在自底向上的语法分析过程中实现 -
L-属性定义
一个SDD是L-属性定义,当且仅当它的每个属性要 么是一个综合属性,要么是满足如下条件的继承属 性:假设存在一个产生式A→X1X2…Xn,其右部符 号Xi (1<= i <= n)的继承属性仅依赖于下列属性:1. A的继承属性(如果是综合属性,可能会形成环)
2. 产生式中Xi左边的符号 X1, X2, … , Xi-1 的属性
3. Xi本身的属性,但Xi 的全部属性不能在依赖图中形成环路
注:每个S-属性定义都是L-属性定义
第七章
例题及复习笔记:
实验部分
Fle符号规则表
符号 | 含义 |
---|---|
| | 或 |
[] | 括号中的字符取其一 |
- | a-z表示ascii码中介于a-z包括a、z的字符 |
\ | 转义(flex不能识别除字母外的字符) |
* | 0或多个字符 |
? | 0或1个字符 |
+ | 1或多个字符 |
^ | 除此之外的其余字符 |
. | 除\n外的所有字符,等价于^\n |
做flex相关题主要理解两点:
1.优先选择最长的匹配
2.如果遇到匹配长度一样的,按照从上到下的顺序选择,也就是选择序号小的
参考flex官网原文: