语法分析器2--自顶向下递归下降

        自顶向下语法分析器从语法分析树的根开始,系统化地向下扩展树,直至树的叶结点与词法分析
器返回的已归类单词相匹配。自顶向下语法分析器的效率极其依赖于其在扩展非终结符时选择正确产生式的能力。如果语法分析器总是产生正确的选择,自顶向下语法分析是高效的。如果它作出糟糕的选择,语法分析的代价将直线上升。对于某些语法来说,最坏情况下的行为是语法分析器无法终止。

自顶向下语法分析可以高效进行的一个关键点是:上下文无关语法的很大一个子集不进行回溯即
可完成语法分析。

消除左递归

左递归:对于CFG中的一个规则来说,如果其右侧第一个符号与左侧符号相同或者能够推导出左侧符号那么称该规则是左递归的。
        前一种情况称为直接左递归,而后一种情况称为间接左递归。

在使用左递归的情况下,自顶向下语法分析器可能会无限循环,而不会生成与输入匹配的起始终结符(也不会前移输入位置)。我们可以重新表示左递归语法,使之使用右递归:即规则中的递归只涉及最右侧的符号。

左递归——>右递归

举例:

无回溯语法分析

        最左匹配的自顶向下语法分析器中,低效的主要原因是回溯。如果语法分析器用错误的产生式扩展语法分析树的下边缘,在语法分析树的下边缘与词法分析器返回的单词(在语法分析能够正确完成的情况下,对应于语法分析树的叶结点)之间,最终会出现不匹配的情况。在语法分析器发现这种不
匹配情形时,它必须撤消构建出错误的语法分析树下边缘的操作
,并尝试其他产生式。扩展、收缩、
再扩展语法分析树下边缘的操作,费时费力。

        对该语法而言,语法分析器可以利用一个简单的修改来避免回溯。在语法分析器去选择下一条规则时,它可以同时考虑当前关注的符号以及下一个输入符号,称为前瞻符号(lookahead symbol)。通过前瞻一个符号,语法分析器可以消除在解析右递归表达式语法时多种选择造成的不确定性。因而,我们说该语法在前瞻一个符号时是无回溯的。无回溯语法也称为预测性语法

FIRST集合

求FIRST集合

求文法符号X的FIRST( X ) ,直到没有终结符或空字符可以加入。
① 如果X属于终结符,则FIRST(X) = { X } 。
② 如果X属于非终结符,且有产生式形如X → a…,则FIRST( X ) = { a }。
③ 如果X属于非终结符,且有产生式形如X → ABCdEF…(A、B、C均属于非终结符且包含 ε,d为终结符),需要把d、FIRST( A )、FIRST( B )、FIRST( C )加入到FIRST( X)中。
④ 如果X经过一步或多步推导出空字符ε,将ε加入FIRST( X )。

FOLLOW集合

求FOLLOW集合

求非终结符X的FOLLOW( X ) ,直到没有终结符可以加入。
① 如果X是开始符号,则将$加入到FOLLOW(X)中 。
② 如果存在一个产生式S->αXβ,那么将集合FIRST(β)中除ε外的所有元素加入到FOLLOW(X)当中。
③如果存在一个产生式 S->αX , 或者S->αXβ且FIRST(β)中包含ε , 那么将集合FOLLOW(S)中的所有元素加入到集合FOLLOW(X)中。

提取左因子

在一组产生式中,提取并隔离共同前缀的过程。

LL(1)分析器

LL(1)得名于下述事实:这种语法分析器由左(Left,L)到右扫描其输入,构建一个最左推导(Leftmost,L),其中仅使用一个前瞻符号(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值