first、follow、select集合求法及LL1文法判别

时间:2022-04-07 07:16:33

一、原理部分

原理部分摘自清华大学出版社出版的《编译原理》一书。原理如下:

1.计算能推出空的非终结符。

first、follow、select集合求法及LL1文法判别

2.计算first集合

求出每个非终结符的first集合

first、follow、select集合求法及LL1文法判别

求出每个表达式右部字符串的first集合

first、follow、select集合求法及LL1文法判别

3.计算follow集合

first、follow、select集合求法及LL1文法判别

4.计算select集合

书上的select集合只是给了一个例子,具体的实现思路说明:

first、follow、select集合求法及LL1文法判别

5.判别LL1文法

书上同样给了一个例子,具体的实现思路说明:

first、follow、select集合求法及LL1文法判别



二、实现思路

1.求非终结符能否推出空

原理部分很详细,根据原理部分即可实现。

2.first集合

添加终结符及空

若X∈ε,则ε∈FIRST(X)
若X=a...,若a∈VT,则a∈FIRST(X);

添加非终结符

若有表达式α->X1X2...Xn,Xi为非终结符

<1>将FIRST(X1)中的一切非ε的终结符加进FIRST(α);
<2>若ε∈FIRST(X1),则将FIRST(X2)中的一切非ε的终结符加进FIRST(α);
<3>若ε∈FIRST(X1)且ε∈FIRST(X2),则将FIRST(X3)中的一切非ε的终结符加进FIRST(α);
<4>依此类推,若对于一切1≤i≤n,ε∈FIRST(Xi),则将ε加进FIRST(α)。

3.follow集合

若为开始符号,则把“#”加入FOLLOW(S)中;
若B→aAb(b≠ε),则把FIRST(b)-{ε}加入FOLLOW(A)中; 注:FOLLOW集合中不能有ε 
若B→aA 或B→aAb,且b=>*ε 则把FOLLOW(B)加入FOLLOW(A) 中

4.select集合

对于产生式A—>α。集合select(A—>α)定义如下:
若α不能推出ε,则select(A—>α) = first(α)。
若α能推出ε,则select(A—>α)= {first(α)-{ε}}∪ follow(A)。

5.LL1文法

遍历所有表达式,取具有相同左部的表达式的select集合,将这些具有相同左部表达式的select集合取交集。

只要有一组相同左部表达式交集不为空,则该文法非LL1文法。

只有所有相同左部表达式交集都不为空,则为LL1文法。



三、代码实现部分

LL1文法判别