语法分析--左递归的消除,FIRST集合FOLLOW集的求解

语法分析–左递归的消除,FIRST集合FOLLOW集的求解

左递归的消除

如果自一个文法中,存在一个非终端符号A,使得对某个串α,存在一个推导A→(*)Aα.(其中 →(*)表示可以经过多步推导。)则该文法为左递归文法(left recursive).由于自顶向下语法分析方法不能处理左递归的文法,因此需要一个转换方法来消除左递归。

对于左递归的产生式 A → Aα | β, 替换为非左递归的产生式如下(其中,ε表示空串):
A → βA’
A’ → αA’ | ε

这样的替换不会改变可从A推导得到的串的集合(证明省略)。该规则本身已经足够用来处理许多文法。

Example

对文法
E → E+T | T
T → T*F | F
F → (E) | id

通过使用上述的方法,将其转换为非左递归的文法,结果如下:

E → TE’
E’ → +TE’ | ε
T → FT’+
T’ → +FT’ | ε
F → (E) | id

在上述过程中,E → E+T | T被替换为E→TE’ 和E’ → +TE’|ε。类似的,T和T’的新产生式也是通过消除立即左递归得到的。

FIRST和FOLLOW集

在语法分析部分,使用自顶向下和自底向上的语法分析器的构造可以使用文法G相关的两个函数,即FIRST和FOLLOW。

FIRST

FIRST(α)被定义为可从α推导得到的串的首符号的集合,其中α是任意的文法符号串。如果α→(*)ε,那么ε也在FIRST(α)中。
FIRST集的产生规则。计算各个文法符号X的FIRST(X)时,运用下面的规则,知道没有新的终端符号或ε可以被加入到任何的FIRST集合中为止:

1) 如果X是一个终端字符,那么FIRST(X)=X
2) 如果X是一个非终端字符,且X→Y1Y2Y3…Yk是一个产生式,其中k≥1,那么如果对于某个i,a在FIRST中(Yi)中且ε在所有FIRST(Y1),FIRST(Y2)..FIRST(Yi-1)中,就把a加入到FIRST(X)中。Y1Y2Y3..Yk Yi 中的123ki表示的为小标 而不是终端符号
3) 如果X→ε是一个产生式,那么将ε加入到FIRST(X)中。

对于第二条规则,也就是说,FIRST(Y1)中的每个元素都在FIRST(X)中,且,如果FIRST(Y1)中存在ε(空串),则FIRST(Y2)也存在FIRST(X).对后面的同理

FOLLOW

对于非终端符号,FOLLOW(A)被定义为可能在某些句型中紧跟在A右边的终端字符的集合。例如,如果有S→αAaβ(其中α,β是文法符号),那么终端符号a就在FOLLOW(A)中。如果A是某些句型的最右符号,则 FOLLOW(A) 为特殊的“结束标记”符号。
FOLLOW集的产生规则计算各个文法符号X的FOLLOW(A)时,运用下面的规则,知道没有新的终端符号可以被加入到任何的FOLLOW集合中为止:

1) 将 FOLLOW(S)S 是输入右端的结束标记
2) 如果存在一个产生式A→αBβ,那么FIRST(β)中除了ε外的所有符号都在FOLLOW(B)中。
3) 如果存在一个产生式A→αB,或存在产生式A→αBβ且FIRST(β)包含ε,那么FOLLOW(A)中的所有符号都在FOLLOW(B)中。

相关例子等待更新。

你可能感兴趣的:(编译原理,记录文档)