考虑以下BNF语法(其中非终端用尖括号括起来,<identifier>
与任何合法的Java变量标识符匹配)。
<exp> ::= <exp> + <term>
| <exp> - <term>
| <term>
<term> ::= <term> * <factor>
| <term> / <factor>
| <factor>
<factor> ::= ( <exp> )
| <identifier>
为以下表达式生成三个派生词:
(x - a) * (y + b)
盯着exp:
<exp>
用术语替换exp:
<term>
将术语替换为:
<term> * <factor>
用因子替换术语:
<factor> * <factor>
用(exp)代替两个因子:
( <exp> ) * ( <exp> )
用exp - term替换第一个exp,用exp + term替换第二个exp
( <exp> - <term> ) * ( <exp> + <term> )
将exp替换为term,然后用因子替换所有4个术语。
( <factor> - <factor> ) * ( <factor> + <factor> )
用标识符替换所有因子
( <identifier> - <identifier> ) * ( <identifier> + <identifier> )
这样就够了吗?
答案 0 :(得分:6)
您需要更进一步 - <factor>
是非终结者,您应该将其降低到<identifier>
。
此外,您应该从<expr>
开始(然后将其缩减为<term>
),而不是直接从<term>
开始。