【编译原理】LL(1)文法

语法分析基本概念


image.png
前置知识
词法层面:采用正规式有限自动机描述和识别语言的单词符号
语法层面:用上下文无关文法描述语法规则

上下文无关文法(CFG)
四元式G=( V T V_T VT, V N V_N VN, S S S, P P P)
V T V_T VT: 终结符集合,非空
V N V_N VN: 非终结符集合,非空,表示各层次的句法单位
S: 文法的开始符号,S ∈ V N \in V_N VN 指程序这个句法单位
P: 产生式集合,产生式形为 P − > α P-> \alpha P>α , P ∈ V N P \in V_N PVN , α ∈ ( V N ∪ V T ) ∗ \alpha \in (V_N \cup V_T)^* α(VNVT)

直接推出和推导
直接推出:根据产生式得到,举个例子,当 A − > γ ∈ P A-> \gamma \in P A>γP α 、 β ∈ ( V T ∪ V N ) ∗ \alpha、\beta \in (V_T \cup V_N)^* αβ(VTVN) 是,则有 α A β − > α γ β \alpha A \beta -> \alpha \gamma \beta αAβ>αγβ ,即 α A β \alpha A \beta αAβ直接推出 α γ β \alpha \gamma \beta αγβ
推导:经过多步直接推出得到,若 α 1 − > α 2 − > . . . − > α n \alpha_1 -> \alpha_2 ->...-> \alpha_n α1>α2>...>αn,则 α 1 \alpha_1 α1可以推导出 α n \alpha_n αn

句子、句型、语言的概念
句型:S推导得到的串
image.png
句子:仅含终结符的句型
语言:文法G产生的所有句子的集合,记为 L ( G ) L(G) L(G)
image.png

语法分析的任务
分析一个文法的句子的结构,用语法分析树表示

语法分析器的功能
按照文法产生式P,识别输入串(词法分析结果)是否为一个句子(一个形式上正确的程序)

语法分析的地位
在编译器中起主导、推动作用

语法分析分类
image.png

自上而下语法分析

基本思想
从文法的开始符号开始,向下推导,推出句子/从语法分析树的根开始,自上而下逐步构建出整个树
分析示例
image.png
说明:IP可以视为调用词法分析器,调用一次就得到输入单词

自上而下语法分析的问题

回溯问题
候选式重新选择
image.png
如何避免回溯问题的出现,即是说当自上而下进行推导的过程中出现某一非终结符有多个候选式的情况,如何选择正确的候选式进行语法分析?

文法左递归
出现输入串的语法分析停止向前推进但语法分析树不断增长的情况
image.png

消除文法左递归

文法左递归分为直接左递归和间接左递归两种,下面将分别叙述这两种左递归的消除方法

消除直接左递归

左递归变为右递归,需要满足的条件在于产生式转换后得到的短语不会变化
image.png
一个适用更普遍的消除直接左递归的示例
image.png
习题(ps: 产生式不要忘记 ϵ \epsilon ϵ
image.png

消除间接左递归

一个间接左递归的例子
image.png
方法的适用条件
image.png
如何改造
将间接左递归通过推导转化为某非终结符的直接左递归,再通过左递归转右递归的方式消除得到的直接左递归
image.png

消除左递归的算法

image.png
习题
image.png
需要注意的问题:

  1. 算法中最后一步是消除从S(开始符号)永远无法到达的非终结符的产生式。在习题中即是说Q、R是S推导无限多步也不会得到的,因而是无用的,这两个非终结符的作用已经被 S ′ S' S发挥了
  2. 消除左递归算法中对非终结符的排序是feel free的,不同的排序方式会得到不同的文法形式,但他们所定义的语言是相同的

解决回溯问题

消除回溯的前提
image.png

FIRST集与提出公共左因子

怎么选择合适的候选式,根据当前输入字符,选择以当前输入字符开头的候选式,或是以能够推出当前输入字符的非终结符开头的候选式

FIRST集

终结首符集,G中每个非终结符的每个候选式都有一个FIRST集 F I R S T ( α ) FIRST(\alpha) FIRST(α)
image.png
消除回溯的必要条件之一
image.png
image.png

提取左公共因子

使得一个非终结符的多个候选式的首字符集尽可能不相交
引入新的非终结符,使得左公共因子只出现一次
image.png

FOLLOW集合

考虑 ϵ \epsilon ϵ 候选的情况
文法定义如下
image.png
分析结果
image.png
考虑这样一个格局,这这个格局里面出现句型 i T ′ + iT'+ iT+,即是说+会跟在T’后面,于是在匹配输入时,我们将T’推为了 ϵ \epsilon ϵ
image.png
FOLLOW集合
用来说明一个非终结符号后面能跟什么终结符
定义
image.png
怎么用
image.png
当当前输入符号不在A的任何候选首符集中时,若a出现在了A的FOLLOW集中,并且A有 ϵ \epsilon ϵ候选,则这里可将A推导为 ϵ \epsilon ϵ
注意
image.png

构造FIRST集和FOLLOW集

将对无穷推导空间的考察转变为对有限产生式的反复扫描得到结果

构造FIRST集合

image.png

构造每个文法符号的FIRST集合

image.png
注意:

  1. X − > Y . . . X->Y... X>Y... ϵ ∈ F I R S T ( Y ) \epsilon \in FIRST(Y) ϵFIRST(Y)并不能说明 ϵ \epsilon ϵ属于FIRST(Y),因为我们不知道…里面是否包含了其他非 ϵ \epsilon ϵ的终结符
  2. 注意终止扫描的条件

构造任何符号串的FIRST集合

image.png

构造FOLLOW集合

在每个句型中,能够跟在该非终结符后面的终结符
image.png
构造方法
扫描产生式右部,寻找非终结符
image.png
注意:

  1. 终止条件为不再有任何非终结符的FOLLOW集发生变化
  2. A − > α B β A->\alpha B \beta A>α 中B为一非终结符, α \alpha α β \beta β为终结符或非终结符

LL(1)文法

文法条件

image.png
LL(1)文法:
第一个L指从左到右扫描输入串
第二个L指最左推导
1指每一步都是根据当前的单词来找候选式,即每一步只需向前查看一个符号
判断方式

  1. 消除文法的左递归
  2. 提取左公共因子
  3. 验证处理后的文法是否满足这三个条件

LL(1)分析法
image.png

分析过程

  1. 消除左递归
  2. 提取左公共因子
  3. 计算FIRST集和FOLLOW集
  4. 判断该文法是否为LL(1)文法,若满足,则对其进行自上而下的分析

一个示例

下图中展示的为一消除了左递归的文法G
image.png
image.png
技巧:FIRST集计算看产生式的左部
image.png
FOLLOW集求解技巧:看产生式右部,一个非终结符的右部符号的first集?最右部的非终结符需要考虑产生式左部的follow集,一个非终结符的右部符号是否能推为 ϵ \epsilon ϵ

参考资料

  1. 国防科技大学编译原理课程视频
  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本程序的所用的存储结构都是string类型的,最主要的存储文法的数据结构为自定义结构,里面包括一个产生式的左部,右部以及select合,至于非终结符的first和follow合,则是定义了一个string类型的数组进行存储。 本程序的求first,follow,select合的算法即为书上所介绍的方法,即求first的合时,只看本产生式,求follow合时,要进行递归查找一个非终结符的所有后跟字符,求select其实就是对first与follow合的运算,最终根据所有的select合,便可以判断此文法是否为LL(1)文法。 对于不是LL(1)文法的产生式,本程序在判断后进行转换,先进行消除左递归,然后提取左公因子,在这两步的每一步结束之后,都要对产生式进行整合,去掉空存储,去掉无法到达的产生式,将select全部置空。 每进行一次非LL(1)到LL(1)的转换之后,都要对其文法性质进行判断,如果是LL(1),则跳出,不是则继续,但是当循环一定次数之后仍不是,程序判定其无法转换,也要跳出。 其中还有对第一个非终结字符的右部替换与否进行选择,原因是,有些通过替换就可以很方便的进行转换,这个要通过人为进行输入。 提取公因子中也有上一段所说的类似的判断机制,目的是为了防止文法的左公因子无法提取完的情况出现。 最终有三种结果,一种是是LL(1)文法,一种是不是LL(1),但是经过转换变成了LL(1),还有一种是经过转换也无法变成LL(1)。 输入文本格式样例: A A->ad A->Bc B->aA B->bB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值