免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: BetonArmEE
打印 上一主题 下一主题

[算法] 写了一个计算四则混合运算的小程序,大家来评审一下 ^_^ [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-03-18 14:06 |只看该作者
starwing83 发表于 2013-03-18 11:09
回复 7# sonicling

    你见过几十个运算符的语言么?C?那也才三十多个,没有上百行吧?

而且,其实很多switch-case是可以被归结成一个数据表的啊。

说到最后,其实还是设计上的问题。我上面的帖子最开始其实是两个函数simpleexpr和expr,是觉得simpleexpr只用了一次而已,就人肉内联到expr了而已。

Lua语言,这是真实语言了吧,它的lparser里面就根本没有大函数的。


llex里的llex函数100多行,可能不能算大函数,比他大的lex函数多的去,gcc和llvm的lex7、8百行,真不知道怎么写出来的,他们的作者该向lua学习学习。

switch-case如果归结成数据表,就不是递归下降了。lua分析算术运算的部分根本就不能算是递归下降,那是算符优先分析,后面跟这个优先级表呢。如果真用递归下降,subexpr函数篇幅可以砍一半,代价是要分散出n个结构相同的函数。

编译前端的复杂度由语言本身决定,函数有多大是可以想象的。parser简单,复杂度肯定在lexer;lexer也很简单,复杂度肯定在AST。他们是一条线的流程,总得有个大函数集中处理各种情况。

lua确实是真实语言。我忽视了。语法和词法分析的函数大小和BNF大小至少成正比。C语言的BNF一条写出来都有十几行,对应的函数小不了。lua这种BNF每条不超过3行的语言的确可以全部小函数。

论坛徽章:
0
12 [报告]
发表于 2013-03-18 14:09 |只看该作者
pmerofc 发表于 2013-03-18 11:36
回复 7# sonicling

如果结构简单,行数多点我觉得倒也无妨


就是这个意思。复杂度是问题固有的,coder能做的只是转嫁,而不能消除。总得有人站出来承担责任。

论坛徽章:
0
13 [报告]
发表于 2013-03-19 11:13 |只看该作者
回复 3# starwing83
你的这个思路超好!
解析字符串的场景很多,我也早就想学一下BNF,有没有合适的材料、书籍推荐一下?

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP