任务描述
设计一个文法,匹配合法的计算式,并返回正确计算式的结果。
文法
\begin{align}
&A \rightarrow BC \
&C \rightarrow +BC \mid -BC \mid \varepsilon \
&B \rightarrow DE \
&E \rightarrow *DE \mid /DE \mid \varepsilon \
&D \rightarrow digit \mid (A) \
\end{align}
\begin{align}
FIRST(A) = \Big\lbrace digit,( \Big\rbrace &\quad FOLLOW(A) = \Big\lbrace $,) \Big\rbrace\
FIRST(B) = \Big\lbrace digit,( \Big\rbrace &\quad FOLLOW(B) = \Big\lbrace $,),+,- \Big\rbrace\
FIRST(C) = \Big\lbrace +,-,\varepsilon \Big\rbrace &\quad FOLLOW(C) = \Big\lbrace $,) \Big\rbrace\
FIRST(D) = \Big\lbrace digit,( \Big\rbrace &\quad FOLLOW(D) = \Big\lbrace $,),*,/,+,- \Big\rbrace\
FIRST(E) = \Big\lbrace *,/,\varepsilon \Big\rbrace &\quad FOLLOW(E) = \Big\lbrace $,),+,- \Big\rbrace\
\end{align}
LL(1) 预测分析表
$ $ | digit | ( | ) | + | - | * | / | $ |
---|---|---|---|---|---|---|---|---|
A | $A \rightarrow BC$ | $A \rightarrow BC$ | ||||||
B | $B \rightarrow DE$ | $B \rightarrow DE$ | ||||||
C | $C \rightarrow \varepsilon$ | $C \rightarrow +BC$ | $C \rightarrow -BC$ | $C \rightarrow \varepsilon$ | ||||
D | $D \rightarrow digit$ | $D \rightarrow (A)$ | ||||||
E | $E \rightarrow \varepsilon$ | $E \rightarrow \varepsilon$ | $E \rightarrow \varepsilon$ | $E \rightarrow *DE$ | $E \rightarrow /DE$ | $E \rightarrow \varepsilon$ |
SDD
$ $ | 产生式 | 语义规则 |
---|---|---|
0) | $A \rightarrow BC$ | \begin{align} &C.inh=B.syn \\ &A.syn = C.syn \end{align} |
1) | $C \rightarrow +BC_1$ | \begin{align} &C_1.inh=C.inh + B.syn \\ &C.syn=C_1.syn \end{align} |
2) | $C \rightarrow -BC_1$ | \begin{align} &C_1.inh=C.inh-B.syn \\ &C.syn=C_1.syn \end{align} |
3) | $C \rightarrow \varepsilon$ | \begin{align} C.syn=C.inh \end{align} |
4) | $B \rightarrow DE$ | \begin{align} &E.inh=D.syn \\ & B.syn=E.syn \end{align} |
5) | $E \rightarrow *DE_1$ | \begin{align} &E_1.inh=E.inh \times D.syn \\ &E.syn=E_1.syn \end{align} |
6) | $E \rightarrow /DE_1$ | \begin{align} &E_1.inh=E.inh / D.syn \\ & E.syn=E_1.syn \end{align} |
7) | $E \rightarrow \varepsilon$ | \begin{align} &E.syn=E.inh \end{align} |
8) | $D \rightarrow digit$ | \begin{align} &D.syn = digit.lexval \end{align} |
9) | $D \rightarrow (A)$ | \begin{align} &D.syn = A.syn \end{align*} |
程序实现
1 |
|