免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3949 | 回复: 6
打印 上一主题 下一主题

为算数表达式构造上下文无关文法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-09 12:25 |只看该作者 |倒序浏览
一个算数表达式,由整数、小数、标识符、括号、加减乘除号(+ - * /)、求模号(%)、乘方号^以及正负号(+、-)组成。要为这种算数表达式构造无二义的上下文无关文法,该怎么做?

以下是这种算数表达式的一个例子

(-b+(b^2)-4*a*c)/2*a

论坛徽章:
0
2 [报告]
发表于 2007-06-09 21:36 |只看该作者
未明白楼主意思

论坛徽章:
0
3 [报告]
发表于 2007-06-10 21:33 |只看该作者
原帖由 mik 于 2007-6-9 21:36 发表于 2楼  
未明白楼主意思

以龙书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

其中,红字表示终结符,是由词法分析器提交给语法分析器的。我现在想扩展这个翻译器的功能,使其能支持正负号及乘方号,但不知怎样为这样的算数表达式构造无二义的上下文无关文法

论坛徽章:
0
4 [报告]
发表于 2007-06-10 22:10 |只看该作者
你看看 lex/yacc 方面的知识

http://linux.chinaunix.net/bbs/thread-885847-1-1.html

论坛徽章:
0
5 [报告]
发表于 2007-06-10 22:28 |只看该作者

论坛徽章:
0
6 [报告]
发表于 2007-06-10 23:24 |只看该作者
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表示乘方,语义分析时可直接调用相关数学实现函数

论坛徽章:
0
7 [报告]
发表于 2007-06-13 09:06 |只看该作者
你要是用yacc,就无所谓非要写无二义的文法,只要指定如果处理冲突,一样可以实现的。《Lex and Yacc》中第三章就有这个例子呀。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP