设为首页 加入收藏

TOP

Vczhl Library++3.0之Parser Combinator为常见的语法结构做优化(二)
2014-11-23 22:08:19 来源: 作者: 【 】 浏览:1
Tags:Vczhl Library 3.0 Parser Combinator 常见 语法 结构 优化
T + (expression << COLON(NeedColon)), ToChoice).precedence()
16 .rbin(OPEQ, ToBinaryEq).rbin(EQ, ToAssignment).precedence()
17 ;
binop组合子的参数代表整个带优先级的最高优先级表达式组合字(参考上面给出的>+*()文法,可以知道这里的exp0是什么意思)。binop给出了四个子组合子,分别是pre(前缀一元操作符)、post(后缀一元操作符)、lbin(左结合二元操作符)和rbin(右结合二元操作符)。precedence代表一个优先级的所有操作符定义结束。这里我做了一个小限制,也就是每一个precedence只能包含pre、post、lbin和rbin的其中一种。实践表明这种限制不会带来任何问题。因此这里我们得到了一张操作符和优先级的关系表。到了这里我们就可以在Parser Combinator的框架下写一个手写的语法分析器(下载源代码并打开LibraryCombinator\_Binop.h)来做了。至于如何手写语法分析器,我之前给出了一篇文章,大家可以参考这个来阅读_Binop.h。

binop比起简单的用lrec做同样的事情,性能在debug下提高了100多倍,release下面则少一点。到了这里,Parser Combinator重新满足了性能要求,我们可以放心大胆的用一点点无所谓的性能换取一千多倍的编译时间了。在这里贴出当binop还没出现的时候我用lrec给出的操作符文法的实现: 1 exp1 = exp0
2 | ((ADD_SUB | NOT_BITNOT | INC_DEC) + exp1)[ToUnary]
3 ;
4
5 exp2 = lrec(exp1 + *((MUL_DIV_MOD + exp1)[ToBinaryLrec]), ToLrecExpression);
6 exp3 = lrec(exp2 + *((ADD_SUB + exp2)[ToBinaryLrec]), ToLrecExpression);
7 exp4 = lrec(

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇pthread_exit pthread_join 下一篇代码意识流――花朵数问题(七)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: