适用于电子科技大学编译原理期末考试复习。
1. 自顶向下的语法分析
从分析树的顶部(根节点)向底部(叶节点)方向构造分析树,可以看成是从文法开始符号S推导出词串w的过程。
但是,并不是所有文法都适合使用自顶向下的语法分析,对于某些文法,我们需要对其进行一定的改造。
1.1 文法改造
1.1.1 提取公共左因子
公共左因子是指一个产生式的两个或多个候选式的最长公共前缀。这个公共前缀是指从开始位置开始的连续的终结符号或非终结符号。
例如,在产生式 A → αβ1|αβ2
中,α
就是公共左因子。这个公共左因子会导致非终结符A
在遇到输入符号α
时,不知道应该选取哪一个产生式。
我们可以通过提取公共左因子的方式来进行改造:
改造前:A → αβ1|αβ2
改造后:A → αA' A' → β1|β2
1.1.2 消除左递归
左递归指的是在上下文无关文法中,一个非终结符通过一系列的产生式规则,可以推导出一个以其自身作为最左符号的句型。左递归可以分为直接左递归和间接左递归。
左递归会导致自顶向下的语法分析器陷入无限循环,因此在编译过程中需要消除左递归。
而左递归有两种形式:直接左递归和间接左递归。这两种形式的处理方式不同,我们分别讨论。
1.1.2.1 消除直接左递归
直接左递归是指一个非终结符的产生式规则中,其最左边的符号就是该非终结符本身。
例如,产生式 A -> Aα | β
就是一个直接左递归的例子,其中 A
是非终结符,α
和 β
是任意的终结符或非终结符序列。
分析可知,使用该产生式不断进行推导,最终会得到形如βααααα...
的串。
于是我们可以通过下面的方式来改造:
改造前:A → Aα|β
改造后:A → βA' A' → αA'|ε
1.1.2.2 消除间接左递归
间接左递归是指一个非终结符通过多个产生式规则的组合,最终可以推导出一个以其自身作为最左符号的句型。
例如,如果有产生式 A -> Bα
和 B -> Aβ
,那么 A
就是间接左递归的,因为通过这两个产生式的组合,可以得到 A -> Aβα
的形式。
处理间接左递归,我们采用代入得方式:
1. 将B得产生式代入A的产生式
A → Aβα
2. 消除直接左递归
1.2 LL(1)文法
1.2.1 FIRST集
串首终结符:串首第一个符号,并且是终结符。简称首终结符。
给定一个文法符号串α,α的串首终结符集FIRST(α)被定义为可以从α推导出的所有句型的串首终结符构成的集合。并且,假如α可以推导出ε ,那么。
计算方法:
对于终结符,FIRST集就是该终结符本身。
对于非终结符,FIRST集是由该非终结符的所有产生式的FIRST集的并集组成。
如果一个非终结符的产生式可以推导出空串,那么空串也包含在FIRST集中。
1.2.2 FOLLOW集
对于一个非终结符,FOLLOW集是由所有可能出现在该非终结符之后的终结符组成的集合。FOLLOW集不包含空串。
计算方法:
对于文法的开始符号,FOLLOW集包含一个特殊的终结符,表示输入的结束。
对于每个产生式,如果一个非终结符后面跟着另一个非终结符,那么将第二个非终结符的FIRST集(不包含空串)加入到第一个非终结符的FOLLOW集中。
如果一个非终结符后面跟着一个终结符,那么将该终结符加入到第一个非终结符的FOLLOW集中。
如果一个非终结符后面跟着一个可以推导出空串的非终结符,那么将该非终结符的FOLLOW集加入到第一个非终结符的FOLLOW集中。
1.2.3 SELECT集
PPT没有,应该不考。
1.2.4 LL(1)文法的定义
我们先前做的文法改造,实质上就是将非LL(1)的文法改造成LL(1)的。
由此可见,能够使用自顶向下的分析方法的文法就是LL(1)文法。
1.3. 递归的预测分析法
也叫递归下降分析法,其基本思想是:将复杂的语法结构分解为一系列简单的语法单元,并通过递归函数调用来处理这些单元。
应该不会考,记住基本思想即可。
1.4. 非递归的预测分析法
非递归的预测分析法(Non-Recursive Predictive Parsing)是一种自顶向下的语法分析方法,它不需要使用递归调用,而是通过一个分析栈和一个预测分析表来实现。这种方法通常用于编译器的设计中,特别是在处理上下文无关文法时。
主要就考结合FIRST集和FOLLOW集来构造预测分析表,借助预测分析表来分析不会考。
预测分析表的两个维度分别为终结符和非终结符:
它代表某个终结符遇到某个非终结符时可选的产生式。
一格中至多只能有一个产生式,否则就是发生冲突了;一格中没有产生式,代表该非终结符遇到对应终结符时无法进行推导。
非终结符的某个产生式能否填入当前格,需要按照下面的规则进行检验:
产生式右部不为空串:若产生式右部的FIRST集包含该格对应的终结符,则可选;否则不可选。
产生式右部为空串:若当前非终结符的FOLLOW集包含该格对应的终结符,则可选;否则不可选。
可以看看下面的视频:
2. 自底向上的语法分析
自底向上的语法分析主要是通过LR分析法实现,LR分析法可以细分为4种:LR(0)、SLR、LALR、LR(1)。分析能力依次上升。
能够使用LR(0)进行分析的文法叫做LR(0)文法,其他同理。
自底向上的分析主要任务在于构造对应的分析表,构造分析表首先要构造出有穷自动机,除了LR(0)以外,在构造自动机时都会借助FOLLOW集来消解冲突。所以又需要先构造出FIRST集和FOLLOW集。
考试必有一道大题会像上面说的这样来考,且只考LR(0)和SLR。
这部分文章阐释不清楚,还是去看视频吧:4-9LR分析法概述_哔哩哔哩_bilibili
SLR分析法相对于LR(0)分析法,区别在于,其归约项目需要在遇到归约成的非终结符的FOLLOW集中的元素时才能进行归约。这一约定使得SLR分析法能够在一定程度上消解LR(0)分析中的移入-归约冲突/归约-归约冲突。
考试中叫你构造项目集规范族,实际上就是构造自动机,例如下面的题: