设计LL(1)简单算数表达式语法分析器,输入为x+y*(3*a+7)-b/5,输出为TRUE
时间: 2023-12-03 14:45:34 浏览: 56
首先,我们需要设计算数表达式的文法。以下是一个可能的文法:
```
E -> T E'
E' -> + T E' | - T E' | ε
T -> F T'
T' -> * F T' | / F T' | ε
F -> ( E ) | id | num
```
其中,E代表表达式,T代表项,F代表因子,id代表变量名,num代表数字,ε代表空串。
接下来,我们需要构造预测分析表。以下是预测分析表的构造过程:
1. 计算FIRST集合和FOLLOW集合
```
FIRST(E) = { (, id, num }
FOLLOW(E) = { $, ) }
FIRST(E') = { +, -, ε }
FOLLOW(E') = { $, ) }
FIRST(T) = { (, id, num }
FOLLOW(T) = { +, -, $, ), ) }
FIRST(T') = { *, /, ε }
FOLLOW(T') = { +, -, $, ), ) }
FIRST(F) = { (, id, num }
FOLLOW(F) = { *, /, +, -, $, ), ) }
```
2. 根据文法和FIRST/FOLLOW集合,构造预测分析表
| | ( | ) | id | num | + | - | * | / | $ |
| --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| E | E->T | | E->T | E->T | | | | | |
| E' | | E'->ε | | | E'->+ T E' | E'->- T E' | | | E'->ε |
| T | T->F | | T->F | T->F | | | | | |
| T' | | T'->ε | | | T'->ε | T'->ε | T'*F | T'/F | T'->ε |
| F | F->( E ) | | F->id | F->num | | | | | |
接下来,我们使用预测分析表进行语法分析:
```
符号栈 输入串 动作
$ x+y*(3*a+7)-b/5$ 移入$
$E$ x+y*(3*a+7)-b/5$ E->T
$T$ x+y*(3*a+7)-b/5$ T->F T'
$FT'$ x+y*(3*a+7)-b/5$ F->id
$iT'$ y*(3*a+7)-b/5$ 匹配id
$T'$ +*(3*a+7)-b/5$ T'->ε
$F*T'$ +*(3*a+7)-b/5$ F->( E )
$(E)T'$ +*(3*a+7)-b/5$ 匹配(
$E)T'$ 3*a+7)-b/5$ E->T
$T)T'$ 3*a+7)-b/5$ T->F T'
$FT')T'$ 3*a+7)-b/5$ F->num
$nT')T'$ a+7)-b/5$ 匹配num
$T')T'$ +/b/5$ T'->/ F T'
$/FT')T'$ +/b/5$ 匹配/
$F'T')T'$ b/5$ F->id
$iT')T'$ /5$ 匹配id
$T')T'$ ε$ T'->ε
$F')T'$ ε$ F->id
$iT'$ ε$ 匹配id
$T'$ ε$ T'->ε
$E'$ ε$ E'->- T E'
$-TE'$ ε$ 匹配-
$TE'$ b/5$ T->F T'
$FT'$ b/5$ F->id
$iT'$ 5$ 匹配id
$T'$ ε$ T'->ε
$E'$ ε$ E'->ε
$E$ ε$ 匹配$
```
最终,分析结束,输入字符串符合文法,输出TRUE。