文法G1为: E→E+T|T T→T*F|F F→(E)|i 给出句型 (E+F)*i 的最左推导,画出对应的语法分析树,并求出所有的短语、直接短语和句柄。
时间: 2023-08-23 18:06:53 浏览: 99
最左推导过程如下:
E → T → F → (E) → (E+F) → (E+F)* → (T*F)* → (F*i)* → (i*i)*
对应的语法分析树如下:
```
E
|
E
/ \
E T
| / \
T F *
/| | |
T * F F
| | |
F ( E )
| |
i E
|
F
|
i
```
所有的短语为:(i), (F), (T*F), (E+F), (E+F)*, (T*F)*, (F*i), (i*i)
直接短语为:(i), (F), (T*F), (E+F), (F*i), (i*i)
句柄为:i, F, T*F, E+F, F*i, i*i
相关问题
令文法G为: E —> E + T | T T —> T * F | F F —> (E) | i 句型 F+T*i的句柄是
句型 F T*i 的句柄为 T * F。
解析:
我们从句型 F T*i 开始,可以依次使用 T -> T * F 和 F -> i 规则,得到以下推导过程:
F T*i
→ T * F T*i (使用 T -> T * F 规则)
→ T * i T*i (使用 F -> i 规则)
此时,句型 T * F 出现,而且推导到了 F T*i 的最终状态,所以句型 F T*i 的句柄为 T * F。
消除下列文法的左递归:E→E+T|E-T|T T→T*F|T/F|F F→(E)|a
要消除给定文法的左递归,我们首先需要理解什么是左递归。左递归是指一个产生式A → A * B 形式的规则,其中A可以出现在B的右边。对于这个例子:
```text
E → E + T | E - T | T
T → T * F | T / F | F
F → (E) | a
```
我们可以看到"E"产生式的第一个选项里有"E"自身,这就构成了左递归。为了消除它,我们通常会通过替换和引入新的非终结符来改写文法规则。以下是消除左递归后的转换过程:
1. 首先,创建一个新的非终结符N,表示原来的E的右部:
```text
N → +T N | -T N | ε (ε 表示空串)
```
2. 将E的原始产生式替换为E → N。这样E不再直接依赖于自身了:
```text
E → N
```
3. 更新剩余的产生式,将T和F处理类似,使其只包含非递归的部分:
```text
T → T * F | T / F | (E)
F → a
```
4. 最后,合并所有涉及N的规则,形成新的文法:
```text
E → N
N → +T N | -T N | ε
T → T * F | T / F | (E)
F → a
```
现在文法已经消除了左递归,更易于理解和分析。
阅读全文