四则运算的 BNF 产生式

1
2
3
4
5
6
7
8
9
10
<expression> ::= <term>
| <expression> "+" <term>
| <expression> "-" <term>

<term> ::= <factor>
| <term> "*" <factor>
| <term> "/" <factor>

<factor> ::= <number>
| "(" <expression> ")"

这两句描述决定了四则运算的计算顺序是乘除优先,加减次之,因为遇到+/-运算符后会分割左右两侧作为表达式递归解析,相应的,"(" <expression> ")" 也就决定了括号的运算符最高,因为在遇到括号时会将括号内的表达式单独作为一个factor解析

可以知道,处于bnf树级结构的最低端的表达式,优先级就越高

1
2
<expression> "+" <term>
<expression> "-" <term>

例子:3 + 5 * (10 - 6 / 2)

过程:

1
2
3
4
5
6
7
8
expression → expression "+" term
→ 3 + term
→ 3 + (term "*" factor)
→ 3 + (5 * factor)
→ 3 + (5 * ( "(" expression ")" ))
→ 3 + (5 * (10 - term))
→ 3 + (5 * (10 - (term "/" factor)))
→ 3 + (5 * (10 - (6 / 2)))