(1)L →E;L|ε (2)E →TE' (3)E' →+TE'|-TE'|ε (4)T →FT' (5)T' →*FT'|/FT'|mod FT'|ε (6)F →(E)|id|num 对上述文法构造FIRST集和FLLOW集,并构造预测分析表
时间: 2023-08-21 19:33:16 浏览: 106
根据上述文法,我们可以按照如下步骤来构造 FIRST 集、FOLLOW 集以及预测分析表。
1. 求解 FIRST 集。对于每个非终结符 X,我们可以按照如下规则来计算 FIRST(X):
- 如果 X 是一个终结符,则 FIRST(X) = {X}。
- 如果 X -> ε 是一个产生式,则 ε 属于 FIRST(X)。
- 如果 X -> Y1 Y2 ... Yk 是一个产生式,则对于 1 <= i <= k,将 FIRST(Yi) 中除了 ε 以外的所有元素添加到 FIRST(X) 中。如果对于所有的 i 都有 ε 属于 FIRST(Yi),则将 ε 添加到 FIRST(X) 中。
按照上述规则,我们可以计算出每个非终结符的 FIRST 集:
```
FIRST(L) = {ε, (, id, num}
FIRST(E) = {ε, (, id, num}
FIRST(E') = {+, -, ε}
FIRST(T) = {(, id, num}
FIRST(T') = {*, /, mod, ε}
FIRST(F) = {(, id, num}
```
2. 求解 FOLLOW 集。对于每个非终结符 X,我们可以按照如下规则来计算 FOLLOW(X):
- 对于文法的开始符号 S,我们将 $ 加入到 FOLLOW(S) 中。
- 对于产生式 A -> αBβ,我们将 FOLLOW(A) 中的所有元素添加到 FOLLOW(B) 中,除非 β 可以推导出 ε,此时将 FOLLOW(A) 中的所有元素添加到 FOLLOW(B) 中。
按照上述规则,我们可以计算出每个非终结符的 FOLLOW 集:
```
FOLLOW(L) = {$}
FOLLOW(E) = {;, $}
FOLLOW(E') = {;, $}
FOLLOW(T) = {+,-,;, $}
FOLLOW(T') = {+,-,;, $}
FOLLOW(F) = {*, /, mod, +, -, ;, $}
```
3. 构造预测分析表。预测分析表的行对应于文法的非终结符,列对应于文法的终结符(加上一个特殊的“结束符号” $),每个格子中存储了一个产生式。具体来说,对于每个产生式 A -> α,我们可以把它添加到所有能够推导出 FIRST(α) 中的终结符对应的格子中。如果 FIRST(α) 中包含 ε,则把它添加到所有能够推导出 FOLLOW(A) 中的终结符对应的格子中。
按照上述规则,我们可以构造出如下的预测分析表:
```
( ) id num + - * / mod ; $
L E;L - E;L E;L - - - - - ε ε
E T E' - T E' T E' +TE' -TE' - - - - -
E' - ε - - +TE' -TE' - - - ε ε
T F T' - - F T' - - - - - - -
T' - ε - - ε ε *F T' /F T' mod F T' ε ε
F (E) - - id num - - - - - -
```
例如,如果当前栈顶符号是 L,读入符号为 id,则可以查找预测分析表中 L 列和 id 行的交叉格子,发现格子中对应的产生式是 E;L。因此,我们可以用 E;L 替换栈顶的 L 符号。
阅读全文