定义
Arithmetic expressions like 3 x 2 + 2 x + 1 3x^{2}+2x+1 3x2+2x+1 involving only one variable x x x. We’ll refer to the data type of such expressions as Aexp \operatorname{Aexp} Aexp.
- Base cases:
- The variable x ∈ Aexp x\in\operatorname{Aexp} x∈Aexp.
- The arabic numeral k ∈ Aexp k\in\operatorname{Aexp} k∈Aexp for any nonnegative integer k k k.
- Constructor cases: If
e
,
f
∈
Aexp
e, f\in\operatorname{Aexp}
e,f∈Aexp, then
- [ e + f ] ∈ Aexp [e+f] \in\operatorname{Aexp} [e+f]∈Aexp.
- [ e ∗ f ] ∈ Aexp [e*f] \in\operatorname{Aexp} [e∗f]∈Aexp.
- − [ e ] ∈ Aexp -[e] \in\operatorname{Aexp} −[e]∈Aexp.
CFG文法
G
=
(
N
,
T
,
P
,
S
)
G = (N, T, P, S)
G=(N,T,P,S)
其中:
- N = { E } N = \{E\} N={E}
- T = { x , num , + , ∗ , − , [ , ] } T = \{\text{x}, \text{num}, +, *, -, [, ]\} T={x,num,+,∗,−,[,]}
- S = E S = E S=E 是开始符号
-
P
P
P 是产生式集合:
- E → x E \rightarrow \text{x} E→x
- E → num E \rightarrow \text{num} E→num
- E → [ E + E ] E \rightarrow [ E + E ] E→[E+E]
- E → [ E ∗ E ] E \rightarrow [ E * E ] E→[E∗E]
- E → − [ E ] E \rightarrow - [ E ] E→−[E]
示例
示例1:推导 [ [ 3 ∗ [ x ∗ x ] ] + [ [ 2 ∗ x ] + 1 ] ] [[3*[x*x]] + [[2*x] + 1]] [[3∗[x∗x]]+[[2∗x]+1]]
E ⇒ [ E + E ] 目标表达式最外层是加法,应用规则 3 ⇒ [ [ E ∗ E ] + E ] 左边的 E 是乘法 [ 3 ∗ [ x ∗ x ] ] ,应用规则 4 ⇒ [ [ num ∗ E ] + E ] 左边乘法的第一个因子是 3,应用规则 2 ⇒ [ [ 3 ∗ E ] + E ] 将 num 替换为 3 ⇒ [ [ 3 ∗ [ E ∗ E ] ] + E ] 乘法的第二个因子是 [ x ∗ x ] ,应用规则 4 ⇒ [ [ 3 ∗ [ x ∗ E ] ] + E ] 内部乘法的第一个因子是 x,应用规则 1 ⇒ [ [ 3 ∗ [ x ∗ x ] ] + E ] 内部乘法的第二个因子是 x,应用规则 1 ⇒ [ [ 3 ∗ [ x ∗ x ] ] + [ E + E ] ] 右边的 E 是加法 [ [ 2 ∗ x ] + 1 ] ,应用规则 3 ⇒ [ [ 3 ∗ [ x ∗ x ] ] + [ [ E ∗ E ] + E ] ] 右边加法的第一个加数是 [ 2 ∗ x ] ,应用规则 4 ⇒ [ [ 3 ∗ [ x ∗ x ] ] + [ [ num ∗ E ] + E ] ] 乘法的第一个因子是 2,应用规则 2 ⇒ [ [ 3 ∗ [ x ∗ x ] ] + [ [ 2 ∗ E ] + E ] ] 将 num 替换为 2 ⇒ [ [ 3 ∗ [ x ∗ x ] ] + [ [ 2 ∗ x ] + E ] ] 乘法的第二个因子是 x,应用规则 1 ⇒ [ [ 3 ∗ [ x ∗ x ] ] + [ [ 2 ∗ x ] + num ] ] 右边加法的第二个加数是 1,应用规则 2 ⇒ [ [ 3 ∗ [ x ∗ x ] ] + [ [ 2 ∗ x ] + 1 ] ] 将 num 替换为 1 \begin{align*} E &\Rightarrow [E + E] && \text{目标表达式最外层是加法,应用规则 3} \\ &\Rightarrow [[E * E] + E] && \text{左边的 } E \text{ 是乘法 } [3 * [x * x]],\text{应用规则 4} \\ &\Rightarrow [[\text{num} * E] + E] && \text{左边乘法的第一个因子是 3,应用规则 2} \\ &\Rightarrow [[3 * E] + E] && \text{将 num 替换为 3} \\ &\Rightarrow [[3 * [E * E]] + E] && \text{乘法的第二个因子是 } [x * x],\text{应用规则 4} \\ &\Rightarrow [[3 * [\text{x} * E]] + E] && \text{内部乘法的第一个因子是 x,应用规则 1} \\ &\Rightarrow [[3 * [\text{x} * \text{x}]] + E] && \text{内部乘法的第二个因子是 x,应用规则 1} \\ &\Rightarrow [[3 * [\text{x} * \text{x}]] + [E + E]] && \text{右边的 } E \text{ 是加法 } [[2 * x] + 1],\text{应用规则 3} \\ &\Rightarrow [[3 * [\text{x} * \text{x}]] + [[E * E] + E]] && \text{右边加法的第一个加数是 } [2 * x],\text{应用规则 4} \\ &\Rightarrow [[3 * [\text{x} * \text{x}]] + [[\text{num} * E] + E]] && \text{乘法的第一个因子是 2,应用规则 2} \\ &\Rightarrow [[3 * [\text{x} * \text{x}]] + [[2 * E] + E]] && \text{将 num 替换为 2} \\ &\Rightarrow [[3 * [\text{x} * \text{x}]] + [[2 * \text{x}] + E]] && \text{乘法的第二个因子是 x,应用规则 1} \\ &\Rightarrow [[3 * [\text{x} * \text{x}]] + [[2 * \text{x}] + \text{num}]] && \text{右边加法的第二个加数是 1,应用规则 2} \\ &\Rightarrow [[3 * [\text{x} * \text{x}]] + [[2 * \text{x}] + 1]] && \text{将 num 替换为 1} \end{align*} E⇒[E+E]⇒[[E∗E]+E]⇒[[num∗E]+E]⇒[[3∗E]+E]⇒[[3∗[E∗E]]+E]⇒[[3∗[x∗E]]+E]⇒[[3∗[x∗x]]+E]⇒[[3∗[x∗x]]+[E+E]]⇒[[3∗[x∗x]]+[[E∗E]+E]]⇒[[3∗[x∗x]]+[[num∗E]+E]]⇒[[3∗[x∗x]]+[[2∗E]+E]]⇒[[3∗[x∗x]]+[[2∗x]+E]]⇒[[3∗[x∗x]]+[[2∗x]+num]]⇒[[3∗[x∗x]]+[[2∗x]+1]]目标表达式最外层是加法,应用规则 3左边的 E 是乘法 [3∗[x∗x]],应用规则 4左边乘法的第一个因子是 3,应用规则 2将 num 替换为 3乘法的第二个因子是 [x∗x],应用规则 4内部乘法的第一个因子是 x,应用规则 1内部乘法的第二个因子是 x,应用规则 1右边的 E 是加法 [[2∗x]+1],应用规则 3右边加法的第一个加数是 [2∗x],应用规则 4乘法的第一个因子是 2,应用规则 2将 num 替换为 2乘法的第二个因子是 x,应用规则 1右边加法的第二个加数是 1,应用规则 2将 num 替换为 1