在这里我们需要掌握两个知识点。

1.LL(1)文法定义

一个文法如果满足以下三条:
1)文法不含左递归 像这个样子A->Ab是不允许的
2)对于文法中每一个非终结符A的各个产生式的候选首符集两两不相交。
即对于A->α1|α2|…|αn
要求FIRST(αi)∩FIRST(αj)=Ø (i≠j)
3)对于文法中的每个非终结符A,若它存在某个候选首符集包含ε,则
FIRST(A)∩FOLLOW(A)=Ø
那么该文法就是LL(1)文法。这三条既是定义也是判断条件,稍后我们会使用到。

2.FIRST集和FOLLOW集求法

FIRST集求法:
1.由非终结符直接推出的终结符或者是空字,加入到FIRST集中。
2.形如P->Q…,FIRST(Q)(非ε)加入到FIRST(P)中。
3.形如P->Y1Y2Y3…Yk,Y1,Y2…Y(i-1)都是非终结符,而且它们的FIRST集都含有ε,那么要把FIRST(Yi)中的非ε元素加入到FIRST(P)中,特别的要是所有的FIRST(Yi)都含有ε,(i=1,2…k),那我们就把ε也加里。
FOLLOW集求法:
1.先把#放在开始符号(第一个非终结符)的FOLLOW集中
2.若A->αBβ是个产生式,那么把FIRST(β)(除了ε)放在FOLLOW(B)中。
3.若A->αB或A->αBβ(ε∈FIRST(β)),那么把FOLLOW(A)加入到FOLLOW(B)中。
这里的αBβ中的α和β形式很自由,可以是一个终结符或者非终结符,也可以是多个,甚至是空字也是可以的,比如A->aCBd,这里你可以把α看成aC,β看成d,也可以把α看成a,β看成Bd。
感觉还是不好理解?那我们直接
在这里插入图片描述
设有文法G:
A→aB|ε
B→Ab|d
(1)判断是否为LL(1)文法
(2)构造分析表
首先求A,B对应的FIRST集和FOLLOW集
FIRST(A)={a,ε},一眼就能看出来吧,FIRST(B)={d,b,a}(a用到了求FIRST的第二条,b用到第三条)。
FOLLOW(A)={#,b}(根据第一条直接就是#号,然后根据B->Ab,这里用第二条,α是空字,B就是A,β就是b,所以把FIRST(b)加入到FOLLOW(A)中),FOLLOW(B)={#,b}(这里用到第三条,A->aB,α是a,B还是B,那么把FOLLOW(A)加到FOLLOW(B)中)。


接下来做题。
还记得LL(1)文法的判断方法不
1.它不含左递归。
2.FIRST(aB)={a},FIRST(ε)={ε},它们的交集是Ø
FIRST(Ab)={a,b},FIRST(d)={d},它们的交集也是Ø
3.FIRST(A)和FOLLOW(A)交集是Ø
所以该文法是LL(1)文法。
接下来构造分析表,这个样子(图片有误,b那里少了一个)
在这里插入图片描述
方法很简单,
1.先看终结符出现在哪个产生式的FIRST集中,就把那个产生式填进去。比如对于a,在FIRST(aB)和FIRST(Ab)中出现,那就把对应产生式填进去。(第二列),
2.如果像A->α,ε∈FIRST(α)这样的,把FOLLOW(A)中的元素那里都填上A->α。在这里FIRST(ε)={ε},FOLLOW(A)={#,b},那么把A->ε填在b和#下。


有没有学会呢?加个鸡腿吧!
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐