自顶向下推导 LL(1)文法

自顶向下推导 LL(1)文法

  • 理解
  • 证明LL(1)文法
    • 证明条件select集
    • first集
    • 求follow集
    • 求select集
    • 判断LL(1)文法

理解

自顶向下文法:通过左边当前输入字符唯一确定地推导出产生式
自顶向下推导 LL(1)文法_第1张图片

证明LL(1)文法

证明是LL(1)文法:因为要求S的推导是唯一的,即推导后每个最左字符只有一个对应的终结符,即无二异性。

证明条件select集

证明条件:select(A)=> {X} 表示有可能的跟着的终结符。

first集

首先是求first集:first(A)=>{X} 表示一开始产生式中第一个跟着的终结符。
如上,因为产生式中直接第一个字符就是终结符,first(B)={b,d}
自顶向下推导 LL(1)文法_第2张图片

在例二中,S->Ap产生式第一个字符为非终结符,所以first(S)加上First(A)-{ϵ}因为如果存在A->a….(终结符),S->A…. 能推导出 S->a…. 。
如果存在产生式S->AB 且first(A)=>{ϵ} 就要在first(S)加上first(B)。同上,如果first(A)=>{ϵ},A可能推导为空,则第一个终结符在第二个非终结符的推导下。依次类推,可能在第三,第四…终结符下。
特殊:要令类似S->ABC的产生式,要令first(S->ABC)=>{ϵ},即S推导为空,则需要first(A,B,C)=>{ϵ} ,即推导非终结符全部为空,式子才为空。

求follow集

然后求follow集:follow(A)表示在所有产生式中 跟在A后面的终结符(#表示结尾)
自顶向下推导 LL(1)文法_第3张图片
求follow集原因:如果A为空,在推导自顶向下文法时可能跳过当前非终结符(如上图第三步推导),将当前推导变成推导紧跟A的字符,所以需要follow集
起始集S的follow集默认增加{#}。
如果存在一个产生式A→αB,或存在产生式A→αBβ且first(β)包含ε,那么follow(A)中的所有符号都在follow(B)中。因为A出现的地方都可转化为aB。例如C->Aa;此时A的FOLLOW(A)中有a。此时将A->cB转化,就是C->cBa,A跟着的字符B也跟着

求select集

当某非终结符A的first集不包含ϵ,即不可能为空,select(A)=first(A),反之A的first集包含ϵ,first可能为空,则其跟着的终结符可能为A后面跟着的终结符follow集,select(A)=first(A)-{ϵ}+follow(A)。

判断LL(1)文法

能使用自顶向下文法,即是LL(1)文法,即能通过最左的字符推导,而且推导不出第二个结果(无二异性)则同左步的产生式不会有共同生成最左终结符:
在这里插入图片描述

你可能感兴趣的:(编译器)