Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说四则混合运算的BNF推导过程,希望能够帮助你!!!。
expression -> num
| id
| expression + expression
| expression * expression
// expression可以代表:数字、id、加法表达式、乘法表达式
// 推导 3+4*5,先推导为加法
expression -> expression + expression
expression -> num + expresion
expression -> 3 + expresion
expression -> 3 + expression * expression
expression -> 3 + num * expression
expression -> 3 + 4 * num
expression -> 3 + 4 * 5
// 推导 3+4*5,先推导为乘法
expression -> expression * expression
expression -> expression + expression * expression
expression -> num + expression * expression
expression -> num + expression * expression
expression -> 3 + expression * expression
expression -> 3 + num * expression
expression -> 3 + 3 * num
expression -> 3 + 4 * 5
// 推导的时候,开始符号可以推导为加法表达式或者乘法表达式,所以语法具有二义性
第一次使用加法进行推导,对语法树采用中序遍历的方式得到的表达式为:3+4*5
第二次推导用乘法表达式,对树进行中序遍历,得到的结果是:(3+4)*5,违背了原表达式的意思
// 连加,2+3+4 和 连乘的BNF写法2*4*5
primary_expression -> num | id
// 连乘
multiplicative -> multiplicative * primary_expression | primary_expression
// 连加
additive -> addtive + primary_expression | primary_expression
// 2+3*4
primary_expression -> num | id
multiplicative -> multiplicative * primary_expression | primary_expression
additive -> additive + multiplicative | multiplicative
// 所谓的BNF就是照猫画虎,找一个表达式用符号进行替换即可,其中要考虑多种的表达式形式
// 2+3+4*5*6,所以additive的产生式左边(additive+multiplicative)是一个additive,不是primary_expression
// 消除左边递归举例
E -> E + T | T
T -> T*F | F
F -> (E) |i
// 消除左递归后的文法
E -> TE′
E′ -> +TE′ | ε
T -> FT′
T′ -> *FT′ | ε
F -> (E) | i
<expression> ::= <multiplicative_expression>{
"+"<multiplicative_expression>| "-" <multiplicative_expression>}
<multiplicative_expresion> ::= <primary_expression> {
"*"<primary_expression> | "/" <primary_expression>}
<primary_expression> :: <INTEGER> | "("expresion")"
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章