将文法G[S] 改写为等价的G′[S],使G′[S]不含左递归和左公共因子。 G[S]: S→SAe|Ae A→dAbA|dA|d
时间: 2023-11-12 13:04:33 浏览: 239
好的,让我来回答你的问题。根据题目要求,我们需要将文法G[S]改写为等价的G′[S],使G′[S]不含左递归和左公共因子。
首先,我们需要消除左递归。文法中的产生式S→SAe可以改写为S→AeS',其中S'→AS'e。同理,A→dAbA|dA|d可以改写为A→dA',A'→bAA'|ε。
接下来,我们需要消除左公共因子。我们可以将A→dA',A'→bAA'|ε改写为A→dA'',A''→ε|bAA',其中A'→A''。
经过上述处理,我们得到了等价的文法G′[S]:
S → AeS'
S' → AS'e | ε
A → dA''
A'' → ε | bAA'
至此,我们成功地将文法G[S]改写为了等价的G′[S],并且消除了左递归和左公共因子。
相关问题
简答题(30.0分) 9将文法G改写成等价的LL(1)文法。并构造相应的 预测分析表。 G[S]: S→S*aTlaTl'aT T→+aT+a (1)将上述文法进行改造。 (2)判断(1)文法是否为LL(1)文法。 (3)构造预测分析表。 (4)写出对符号串a+a的分析过程。
(1) 改写后的文法如下:
```
S -> T S'
S' -> * a T l S' | ε
T -> + a T'
T' -> a | ε
```
(2) 判断是否为LL(1)文法:
- 消除左递归:已经消除了左递归
- 提取左公因子:
```
S -> T S'
S' -> * a T l S' | ε
T -> + a T'
T' -> a T''
T''-> ε
```
- 构造FIRST集和FOLLOW集:
FIRST(S) = {+, ε}
FIRST(S') = {*, ε}
FIRST(T) = {+}
FIRST(T') = {a, ε}
FIRST(T'') = {ε}
FOLLOW(S) = {$}
FOLLOW(S') = {l, $}
FOLLOW(T) = {l, *}
FOLLOW(T') = {l, *}
FOLLOW(T'') = {l, *}
- 构造预测分析表:
| | + | * | a | l | $ |
|---|-------|-------|-------|-------|-------|
| S | | | S -> T S' | | |
| S'| ε | S' -> * a T l S' | | S' -> ε | S' -> ε |
| T | T -> + a T' | | | | |
| T'| ε | | T' -> a T'' | T' -> ε | T' -> ε |
|T''| ε | | T''-> ε | T''-> ε | T''-> ε |
(4) 对符号串a+a的分析过程如下:
| 栈 | 剩余输入 | 动作 |
|----------|----------|--------------------------|
| $S | a+a$l | S -> T S' |
| $T S' | a+a$l | T -> + a T' |
| $+aT' S' | a+a$l | T'-> a T'' |
| $aT'' S' | +a+l | 匹配a,弹出栈顶符号 |
| $T'' S' | +a+l | 匹配+,弹出栈顶符号 |
| $S' | a+l | S'->* a T l S' |
| $*aTlS' | a+l | 匹配a,弹出栈顶符号 |
| $TlS' | +l | 匹配*,弹出栈顶符号 |
| $S' | l | 匹配l,弹出栈顶符号 |
| $S' | +l | 匹配ε,弹出栈顶符号 |
| $S' | $ | 匹配ε,弹出栈顶符号 |
| $ | $ | 分析成功 |
1、设将文法G改写成等价的LL(1)文法,并构造预测分拼表。 GS→S*aT|aT*aT;T→+aT|+a(15分)
首先,我们需要消除G中的左递归和提取左公因子。对于文法G:
```
S → S*aT | aT*aT
T → +aT | +a
```
我们可以先消除左递归:
```
S → aT*S'
S' → *aTS' | ε
T → +aT | +a
```
然后,我们可以提取左公因子:
```
S → aT S'
S' → * a T S' | ε
T → + a T'
T' → a T | ε
```
现在,我们得到了一个等价的LL(1)文法。下面我们可以构造预测分析表。
首先,我们需要求出每个非终结符的FIRST集和FOLLOW集。对于该文法,有:
```
FIRST(S) = {a}
FIRST(S') = {* , ε}
FIRST(T) = {+ , ε}
FIRST(T') = {a , ε}
FOLLOW(S) = {$}
FOLLOW(S') = {a , $}
FOLLOW(T) = {S' , $}
FOLLOW(T') = {S' , $}
```
然后,我们可以根据每个产生式的FIRST集和FOLLOW集来填写预测分析表:
```
+ * a $
S | | | S → aTS' |
S' | | S' → ε | S' → *aTS' | S' → ε
T | T → +aT' | | |
T' | | | T' → aT | T' → ε
```
最终,我们得到了该文法的预测分析表。
阅读全文