考虑以下BNF语法

Bob*_*y S 1 grammar bnf expression-trees

考虑以下BNF语法(其中非终端包含在尖括号中并<identifier>与任何合法的Java变量标识符匹配).

<exp> ::= <exp> + <term>
      |   <exp> - <term>
      |   <term>
<term> ::= <term> * <factor>
       |   <term> / <factor>
       |   <factor>
<factor> ::= ( <exp> )
         |   <identifier>
Run Code Online (Sandbox Code Playgroud)

为以下表达式生成三个派生:

(x - a) * (y + b)
Run Code Online (Sandbox Code Playgroud)

盯着exp:

<exp>
Run Code Online (Sandbox Code Playgroud)

用术语替换exp:

<term>
Run Code Online (Sandbox Code Playgroud)

替换术语:

<term> * <factor>
Run Code Online (Sandbox Code Playgroud)

用因子代替术语:

<factor> * <factor>
Run Code Online (Sandbox Code Playgroud)

用(exp)替换这两个因子:

( <exp> ) * ( <exp> )
Run Code Online (Sandbox Code Playgroud)

用exp - term替换第一个exp,用exp + term替换第二个exp

( <exp> - <term> ) * ( <exp> + <term> )
Run Code Online (Sandbox Code Playgroud)

将exp替换为term,然后用因子替换所有4个术语.

( <factor> - <factor> ) * ( <factor> + <factor> )
Run Code Online (Sandbox Code Playgroud)

用标识符替换所有因子

( <identifier> - <identifier> ) * ( <identifier> + <identifier> )
Run Code Online (Sandbox Code Playgroud)

这样就够了吗?

Ano*_*on. 6

你需要更进一步 - <factor>是一个非终结者,你应该减少它<identifier>.

此外,您应该从<expr>(然后将其减少到<term>)开始,而不是从<term>直接开始.