2008-04-09
CT中表达式处理的思考
关键字: commontemplate, 表达式目前的CT中,对于表达式的处理是根据操作符的优先级生成一个二叉树。
有兴趣的朋友可以看看ExpressionReducer.java 这个类。这种处理方式可以说是中缀表达式的方式吧。然后到解释模板内容的时候,再遍历这个二叉树。
那么,是不是可以考虑换一种方式呢?也就是后缀表达式的形式。后缀表达式的最终结果就是一个栈的结构,在Java中就好像是一个List。而当对这个表达式进行解释的时候,只需要对栈进行从上到下的访问就可以了。
两种方式哪个更好?个人觉得后缀表达式更好一些。原因有以下几点:
1、使用中缀表达式需要生成一个树形结构,而模板本身为了缓存,进行了序列化操作,从序列化的角度来看,一个栈的
结构应该比一个树的结构要简单。
2、复杂度上。后缀表达式生成的栈要更简单,这样也就让测试变得更容易。而且也更直观。
不过我对CT目前仍然不是彻底的了解,或许我的理解有疏漏的地方。这也仅仅是一个想法而已。待更加深入地了解CT后,再回头看看这个想法是否正确吧!
- 10:35
- 浏览 (757)
- 评论 (1)
- 分类: CommonTemplate
- 相关推荐
评论
javatar
2008-04-25
你考虑的很对, 当时设计时, 我也考虑过这个问题, 在编译原理中, 通常都会把"中缀表达式"转译成"后缀表达式"进行存储, 因为"后缀表达式"的装配与执行方式都要快, 只需单栈(参数栈)即可完成, 而"中缀表达式"需要双栈(参数栈和操作符栈)配合才能完成.
但表达式的运行时结构用树表式, 是可行的, 这样表达式的运算过程是自关联的, 引擎在运行期不再需要干预.
另外, 当时采用的设计思想是"解释器模式", 自顶向下执行, 这样的最大好处是操作符的可扩展性极强. 如果你想给FreeMarker或Velocity加一个操作符, 那是要伤筋动骨的, 从最底层的BNF定义改起.
倒是可以考虑将CT的编译结果通过"后缀表达式"的方式进行存储, 这样在还原时归约(reduce)效率将提高.
但表达式的运行时结构用树表式, 是可行的, 这样表达式的运算过程是自关联的, 引擎在运行期不再需要干预.
另外, 当时采用的设计思想是"解释器模式", 自顶向下执行, 这样的最大好处是操作符的可扩展性极强. 如果你想给FreeMarker或Velocity加一个操作符, 那是要伤筋动骨的, 从最底层的BNF定义改起.
倒是可以考虑将CT的编译结果通过"后缀表达式"的方式进行存储, 这样在还原时归约(reduce)效率将提高.
发表评论
- 浏览: 135188 次

- 详细资料
搜索本博客
我的相册
tdd
共 3 张
共 3 张
最新评论
-
TDD,想说爱你不容易
stevenwang 写道这个论题我喜欢。 早想写一点文字,来纪念我TDD的失 ...
-- by kozyan -
测试驱动?很傻很天真
同情,很傻很天真
-- by passyt -
BNF范式
确实很有兴趣,刚刚学习完状态机的部分,对比一下CT中状态机的实现,很有收获
-- by yananay -
BNF范式
看来你对编译知识很有兴趣, 希望你能有所突破. BNF本身并不复杂, 只是表达 ...
-- by javatar -
CT中表达式处理的思考
你考虑的很对, 当时设计时, 我也考虑过这个问题, 在编译原理中, 通常都会把" ...
-- by javatar






评论排行榜