为算数表达式构造上下文无关文法
一个算数表达式,由整数、小数、标识符、括号、加减乘除号(+ - * /)、求模号(%)、乘方号^以及正负号(+、-)组成。要为这种算数表达式构造无二义的上下文无关文法,该怎么做?
以下是这种算数表达式的一个例子
(-b+(b^2)-4*a*c)/2*a
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
未明白楼主意思
以龙书2.9节的翻译器为例,它把中缀表达式翻译成后缀形式。但它只支持包含数字、标识符、和+、-、*、/、div、mod这几种操作符。其文法如下:
start-> list eof
list->expr;list | E
expr->expr + term
| expr - term
| term
term-> term * factor
| term / factor
| term div factor
| term mod factor
| factor
factor-> (expr)
| id
| num
其中,红字表示终结符,是由词法分析器提交给语法分析器的。我现在想扩展这个翻译器的功能,使其能支持正负号及乘方号,但不知怎样为这样的算数表达式构造无二义的上下文无关文法
你看看 lex/yacc 方面的知识
http://linux.chinaunix.net/bbs/thread-885847-1-1.html
http://linux.chinaunix.net/bbs/thread-896629-1-2.html
start-> list eof
list->expr;list | E
expr->expr + term
| expr - term
| term
term-> term * factor
| term / factor_ultra
| term div factor_ultra
| term mod factor_ultra
| term exp facor_ultra
| factor_ultra
factor_ultra -> facor | unary-operator facor
unary-operator -> + | -
factor-> (expr)
| id
| num
其中term exp facor_ultra表示乘方,语义分析时可直接调用相关数学实现函数
你要是用yacc,就无所谓非要写无二义的文法,只要指定如果处理冲突,一样可以实现的。《Lex and Yacc》中第三章就有这个例子呀。