Skip to content

四则运算的 BNF 产生式

js
<expression> ::= <term>
                | <expression> "+" <term>
                | <expression> "-" <term>

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

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

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

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

bnf
<expression> "+" <term>
<expression> "-" <term>

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

过程:

sh
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)))

Last updated: