题目
设文法G(S):S→(T) | aS | aT→T,S | S(1)消除左递归和提公共左因子;(2)构造相应的FIRST和FOLLOW集合;(3)构造预测分析表。
设文法G(S):
S→(T) | aS | a
T→T,S | S
(1)消除左递归和提公共左因子;
(2)构造相应的FIRST和FOLLOW集合;
(3)构造预测分析表。
题目解答
答案
(1) S →(T) | aS’
S’→S |ε
T→ST’
T’→,ST’ |ε
(2) FIRST(S)={a, (} FIRST(S’)={a, (, ε}
FIRST(T)={a, (} FIRST(T’)={,, ε}
FOLLOW(S)={,, ), #} FOLLOW(S’)={,, ), #}
FOLLOW(T)={ )} FOLLOW(T’)={ )}
(3)
(
)
a
,
#
S
S →(T)
S → aS’
S’
S’→S
S’→ε
S’→S
S’→ε
S’→ε
T
T→ST’
T→ST’
T’→,ST’
T’
T’→ε
解析
步骤 1:消除左递归
对于文法中的非终结符T,存在左递归T→T,S。我们可以通过以下步骤消除左递归:
- 将T的产生式分为两部分:T→T,S 和 T→S。
- 将T→T,S中的T替换为T',得到T→S,T'。
- 将T'定义为T'→,S,T' | ε。
- 最终得到T→S,T' 和 T'→,S,T' | ε。
步骤 2:提公共左因子
对于文法中的非终结符S,存在公共左因子a。我们可以通过以下步骤提公共左因子:
- 将S的产生式分为两部分:S→(T) 和 S→aS | a。
- 将S→aS | a中的a提出来,得到S→aS'。
- 将S'定义为S'→S | ε。
- 最终得到S→(T) | aS' 和 S'→S | ε。
步骤 3:构造FIRST和FOLLOW集合
- FIRST(S) = {a, (},因为S→(T) | aS | a。
- FIRST(S') = {a, (, ε},因为S'→S | ε。
- FIRST(T) = {a, (},因为T→S,T'。
- FIRST(T') = {,, ε},因为T'→,S,T' | ε。
- FOLLOW(S) = {,, ), #},因为S→(T) | aS | a,且S在T的产生式中。
- FOLLOW(S') = {,, ), #},因为S'→S | ε。
- FOLLOW(T) = { )},因为T在S的产生式中。
- FOLLOW(T') = { )},因为T'在T的产生式中。
步骤 4:构造预测分析表
根据FIRST和FOLLOW集合,构造预测分析表如下:
| | ( | ) | a | , | # |
|---|---|---|---|---|---|
| S | S→(T) | - | S→aS' | - | - |
| S' | - | - | S'→S | S'→ε | S'→ε |
| T | T→ST' | - | T→ST' | - | - |
| T' | - | T'→ε | - | T'→,ST' | T'→ε |
对于文法中的非终结符T,存在左递归T→T,S。我们可以通过以下步骤消除左递归:
- 将T的产生式分为两部分:T→T,S 和 T→S。
- 将T→T,S中的T替换为T',得到T→S,T'。
- 将T'定义为T'→,S,T' | ε。
- 最终得到T→S,T' 和 T'→,S,T' | ε。
步骤 2:提公共左因子
对于文法中的非终结符S,存在公共左因子a。我们可以通过以下步骤提公共左因子:
- 将S的产生式分为两部分:S→(T) 和 S→aS | a。
- 将S→aS | a中的a提出来,得到S→aS'。
- 将S'定义为S'→S | ε。
- 最终得到S→(T) | aS' 和 S'→S | ε。
步骤 3:构造FIRST和FOLLOW集合
- FIRST(S) = {a, (},因为S→(T) | aS | a。
- FIRST(S') = {a, (, ε},因为S'→S | ε。
- FIRST(T) = {a, (},因为T→S,T'。
- FIRST(T') = {,, ε},因为T'→,S,T' | ε。
- FOLLOW(S) = {,, ), #},因为S→(T) | aS | a,且S在T的产生式中。
- FOLLOW(S') = {,, ), #},因为S'→S | ε。
- FOLLOW(T) = { )},因为T在S的产生式中。
- FOLLOW(T') = { )},因为T'在T的产生式中。
步骤 4:构造预测分析表
根据FIRST和FOLLOW集合,构造预测分析表如下:
| | ( | ) | a | , | # |
|---|---|---|---|---|---|
| S | S→(T) | - | S→aS' | - | - |
| S' | - | - | S'→S | S'→ε | S'→ε |
| T | T→ST' | - | T→ST' | - | - |
| T' | - | T'→ε | - | T'→,ST' | T'→ε |