编译原理复习---语法分析

适用于电子科技大学编译原理期末考试复习。

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(α)被定义为可以从α推导出的所有句型的串首终结符构成的集合。并且,假如α可以推导出ε ,那么\varepsilon \in FIRST(\alpha )

计算方法:

  • 对于终结符,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集来构造预测分析表,借助预测分析表来分析不会考。

预测分析表的两个维度分别为终结符和非终结符:

它代表某个终结符遇到某个非终结符时可选的产生式。

一格中至多只能有一个产生式,否则就是发生冲突了;一格中没有产生式,代表该非终结符遇到对应终结符时无法进行推导。

非终结符的某个产生式能否填入当前格,需要按照下面的规则进行检验:

  1. 产生式右部不为空串:若产生式右部的FIRST集包含该格对应的终结符,则可选;否则不可选。

  2. 产生式右部为空串:若当前非终结符的FOLLOW集包含该格对应的终结符,则可选;否则不可选。

可以看看下面的视频: 

k4-6非递归的预测分析法_哔哩哔哩_bilibili

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)分析中的移入-归约冲突/归约-归约冲突。

考试中叫你构造项目集规范族,实际上就是构造自动机,例如下面的题:

猜你喜欢

转载自blog.csdn.net/2302_80372340/article/details/144615775
今日推荐