消除下述文法的左递归 S->BAB A->aBb B->cB|dB丨ε
时间: 2024-12-19 20:25:52 浏览: 3
quadsim-消除文法的左递归demo
要消除给定文法 `S->BAB`, `A->aBb`, `B->cB|dB|ε` 的左递归,我们同样需要采用替换法。首先识别出左递归部分在 `B` 非终结符上,因为 `B` 可能无限次自递归生成。
1. **创建新的非终结符**:引入新的非终结符,比如 `Z`,来代替当前的 `B` 状态。
2. **替换规则**:
- 将 `B` 替换为 `Z`,并添加从 `Z` 到 `B` 的转换规则:
```
S -> ZAB
A -> aBb
Z -> dB | cB | ε
```
- 更新原有的 `B->cB` 和 `B->dB` 为 `Z->cB` 和 `Z->dB`。
3. **处理初始生产**:
- 添加一个新的起始非终结符 `X`,关联到 `S` 的开始:
```
X -> S
```
4. **调整 `S` 规则**:
```
X -> ZAB
```
现在文法已去除了左递归。`Z` 表示之前 `B` 所能产生的所有可能状态,而 `X` 成为了新的起始非终结符。
阅读全文