编译原理读书笔记(4/12)

本文深入探讨了自顶向下的语法分析方法,重点讲解了LL(1)文法及其特征。内容包括确定的自顶向下分析、LL(1)文法的判断与实现,以及非LL(1)文法如何通过消除左公因子和左递归转换为LL(1)文法。此外,还介绍了不确定的自顶向下分析方法及其效率问题。
摘要由CSDN通过智能技术生成

自顶向下的语法分析方法

语法分析是识别单词符号组成的序列是否是给定文法的正确句子。目前常用的分析方法有两种,一种是自顶向下分析,另一种是自底向上分析。

自顶向下分析方法从开始符号出发,试图推导出与输入符号相匹配的句子。分为确定的和不确定的自顶向下分析两种,常用的有递归子程序法和LL分析法。自底向上分析采取的是规约的方法,从输入符号开始一步步归约到文法的开始符号。分为算法优先分析和LR分析。

不管是推导还是规约的方法,都需要文法的支持。此处的文法是语法分析的文法,与 词法分析的文法不太一样。词法分析的文法生成的是单词的语言,而语法分析的句子是符合语法含义的句子。

4.1 确定的自顶向下分析思想与LL(1)文法

从文法的开始符号出发,每次根据当前输入符号,确定选用哪个产生式进行推导。如果每次产生式是唯一确定的,则是确定的自顶向下分析。该方法中的第一个问题在于产生式的右端,如果第一个符号是非终结符,由于输入串都是终结符,则无法通过终结符确定非终结符的选择。为此构建非终结符的开始符号集合。非终结符的开始集合中的元素是所有产生式中该非终结符产生式右部以终结符开始的所有终结符集合。第二个问题是存在空产生式,通过空产生式无法选择终结符,解决方法是构建所有非终结符的后跟符号集合,后更符号集合即某个有空产生式的非终结符后面可以跟随的终结符集合。有了上述开始符号结合和后跟符号集合,就可以计算产生式的选择集合。产生式的选择就是即对所有的文法产生式,计算该产生式遇到哪些输入串终结符后能够被触发。

有了产生式的选择集合,如果对于任意两条产生式的选择集合,他们的交集为空,并且产生式右部不同时为空,则该文法就是LL(1)文法,即自左向右推导的最左推导看一个符号即可确定产生式进行推导。

由上述过程可知,判断一个文法是否式LL(1)文法,首先计算所有非终结符的开始符号集,再计算所有非终结符的后更符号集合,最后计算产生式的选择集合,基于选择结合和LL(1)文法的定义可进行判断。

4.2 非LL(1)文法与LL(1)文法的等价变换

对于某些存在左递归和左公因子的非LL(1)型文法而言,由于左递归和左公因子的存在,文法不是LL(1)文法,可以对其进行转换。

消除左公因子,左公因子是指同一个非终结符号在不同的产生式中有相同的产生式右部开始符号。因此对应产生式有相同的开始符号集,所以无法其选择符号集也存在交集,从而不是LL(1)型文法。解决的方法是提取左公因子,将左公因子提取出来,右部使用非终结符构建一个新的产生式。如
A->ar|ac 转换为 A->aB; B->r|c

左递归包含直接左递归和间接左递归,是由一个非终结符推导出了自身。出现左递归时,产生式的选择符号集也存在交集,也不是LL(1)文法。对于直接左递归,通过转换变成右递归。如A->Aa, A->b转换为 A->bA, B->a.
对于间接左递归,先将其转化为直接左递归,再将直接左递归转化为右递归。

4.3 不确定的自顶向下分析思想

不确定的自顶向下分析法,通过试探-回溯的方式,当当前的状态陷入死胡同时,需要回溯到之前的状态,重新选择其他的产生式进行试探。这个 过程中需要记录试探过程中的各种符号,分析效率较低,实际中应用较少。

4.4 LL(1)分析的实现

LL(1)文法的实现使用递归下降分析法。对于每个非终结符,对应每一个产生式定义相应的子程序,通过子程序之间的相互调用实现对输入串的识别。整个程序的编写使用递归实现。

除了递归分析法以外, 对于LL(1)型文法,还有表驱动的实现方法,此方法也被称为LL(1)分析法。包括预测分析程序、分析栈、预测分析表,基本按照LL(1)文法的定义实现的方法。

总结

自顶向下的语法分析是从开始符号出发,通过正向推导,不断运用产生式生成目标符号串。在文法中,LL(1)文法较为适用自顶向下分析方法。本章详细描述了LL(1)文法的定义,包括非终结符的开始符号集、后跟符号集合、产生式的选择符号集合等概念,以及由这些概念判断一个文法是否为LL(1)文法的方法。然后对于LL(1)文法,由采用递归实现的下降分析实现方法和非递归实现的表驱动方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值