针对SysY语言中简单算术表达式文法G[E]: E→TE’ E’→ATE’|ε T→FT’ T’→MFT’ |ε F→(E) | i A → + | - M → * | / 求解相应的FIRST、FOLLOW集,构造预测分析表,并编写LL(1)语法分析程序,并给出测试句子的分析过程。
时间: 2024-01-23 14:02:38 浏览: 150
JESD22-B102E_焊錫性_中文翻译版本ate
5星 · 资源好评率100%
首先,我们需要求解该文法的FIRST集和FOLLOW集,具体步骤如下:
1. 计算终结符的FIRST集:
```
FIRST(id) = {id}
FIRST(+) = {+}
FIRST(-) = {-}
FIRST(*) = {*}
FIRST(/) = {/}
FIRST(() = {(}
FIRST() = {)}
```
2. 计算非终结符的FIRST集:
```
FIRST(E) = {id, (}
FIRST(E') = {+, -, ε}
FIRST(T) = {id, (}
FIRST(T') = {*, /, ε}
FIRST(F) = {id, (}
FIRST(A) = {+, -}
FIRST(M) = {*, /}
```
3. 计算非终结符的FOLLOW集:
```
FOLLOW(E) = {$, ), +, -}
FOLLOW(E') = {$, ), +, -}
FOLLOW(T) = {+, -, $, ), *, /}
FOLLOW(T') = {+, -, $, ), *, /}
FOLLOW(F) = {+, -, $, ), *, /}
```
接着,我们需要构造预测分析表,表格中的每个元素表示使用哪个产生式进行推导。预测分析表如下:
| | id | + | - | * | / | ( | ) | $ |
|---|-------|-------|-------|-------|-------|-------|-------|-------|
| E | E -> T E' | | | | | E -> T E' | | |
| E' | | E' -> + T E' | E' -> - T E' | | | | E' -> # | E' -> # |
| T | T -> F T' | | | | | T -> F T' | | |
| T' | | T' -> # | T' -> # | T' -> * F T' | T' -> / F T' | | T' -> # | T' -> # |
| F | F -> id | | | | | F -> ( E ) | | |
最后,我们可以编写LL(1)语法分析程序,具体步骤如下:
1. 定义预测分析表并初始化。
2. 读入输入串并将$和起始符号E压入栈中。
3. 重复以下操作:
1. 从栈顶弹出一个符号X,并读入输入串中的下一个符号a。
2. 如果X是终结符,则执行以下操作:
1. 如果X和a匹配,则弹出X和a。
2. 如果X和a不匹配,则分析失败。
3. 如果X是非终结符,则执行以下操作:
1. 查找预测分析表中X和a的交点,得到产生式X -> Y1 Y2 ... Yk。
2. 将Yk, Yk-1, ..., Y1依次压入栈中。
3. 如果预测分析表中的产生式是空产生式,则不需要将任何符号压入栈中。
4. 如果栈为空并且输入串已经被完全扫描,则分析成功;否则分析失败。
接下来给出一个测试句子id + id * id的分析过程:
```
分析栈 输入串 动作
$E id + id * id 移入id,使用E -> TE'产生式
$T E' id + id * id 移入+,使用E' -> +TE'产生式
$+ T E' id + id * id 移入id,使用T -> FT'产生式
$F T' E' id + id * id 移入*,使用T' -> *FT'产生式
$* F T' E' id + id * id 移入id,使用F -> id产生式
$id T' E' + id * id 弹出id,移入*,使用T' -> #产生式
$F T' E' + id * id 移入id,使用T -> FT'产生式
$F T' E' + id * id 弹出id,移入$,使用F -> id产生式
$T' E' + id * id 弹出F,移入$,使用T' -> #产生式
$E' + id * id 弹出T',使用E' -> #产生式
$+ E' + id * id 弹出E',移入id,使用E -> TE'产生式
$T E' + id * id 移入id,使用E' -> ATE'产生式
$A T E' + id * id 移入id,使用T -> FT'产生式
$F T' E' + id * id 移入*,使用T' -> *FT'产生式
$* F T' E' + id * id 移入id,使用F -> id产生式
$id T' E' + id * id 弹出id,移入$,使用T' -> #产生式
$F T' E' + id * id 弹出id,移入$,使用F -> id产生式
$T' E' + id * id 弹出F,移入$,使用T' -> #产生式
$E' + id * id 弹出T',使用E' -> #产生式
$+ E' + id * id 弹出E',移入$,使用E -> TE'产生式
$T E' + id * id 移入$,使用E' -> #产生式
$E' + id * id 弹出T,移入$,使用E' -> #产生式
$ + id * id 弹出E',输入串已被完全扫描,分析成功
```
阅读全文