表达式求值设计问题

4
我正在建模一个用于评估表达式的系统。这些表达式中的操作数可以是多种类型之一,包括一些基本的 .NET 类型。在定义我的 Expression 类时,我希望有一定程度的类型安全性,因此不想使用“object”作为操作数对象类型,因此考虑定义一个抽象的 Operand 基类并为每种类型的 Operand 创建一个子类。你认为这样做怎么样?
另外,只有某些类型的操作数与其他操作数有意义。最后,只有某些运算符与特定操作数有意义。我无法想出一种在编译时实现这些规则的方法,所以我想在运行时进行这些检查。
你有什么更好的想法吗?

如果你卡住了,请告诉我 - 我有一些可以用在原型(链接)数学处理上的工作代码 ;-p http://marcgravell.blogspot.com/2009/01/above-surface.html - Marc Gravell
4个回答

2
我不确定基于C的语言是否有这个功能,但是Java有几个包非常适合这个任务。
JavaCC或Java编译器允许您定义一种语言(例如您的表达式),然后构建相应的Java类。一个更加用户友好、实验性和学术性更强的包是DemeterJ——它允许您非常轻松地指定表达式语言,并带有一个库来定义访问者和策略以操作生成的类结构。如果您能够切换到Java,那么我建议您尝试一下。否则,我建议您寻找一个这些技术的C#克隆版本。
如果您选择这条路线,另一个需要考虑的事情是,一旦您在某种程度上生成了类结构,您可以对所有生成的类进行子类化,并将所有应用程序特定的逻辑构建到子类中。这样,如果您真的需要为表达式语言生成一个新模型,您的逻辑将相对独立于您的类层次结构。
更新:实际上,看起来有些东西已经移植到了.NET技术上,但我没有使用过,所以不确定它的形式如何。

http://www.ccs.neu.edu/home/lieber/inside-impl.html

祝你好运!

1

我最近建立了一个动态表达式求值器。像您建议的那样,我发现创建一个带有有意义的派生类(NumericOperand、StringOperand、DateOperand等)的BaseOperand非常有效。根据您的实现方式,泛型也可能很有意义(Operand)。

通过实现访问者模式,您可以执行任何喜欢的验证。

我有一个非常具体的需要来滚动我的自己的解决方案,但已经有很多可用于处理表达式的选项。您可能想查看其中一些以获得灵感或避免重新发明轮子。


1

3.5 版本中的 Expression 怎么样?我最近使用它编写了一个表达式解析器/编译器。


我正在走这条路(表达式树)。在LINQ中,可以非常清晰地编写表达式,并自动转换为可以评估的表达式树。仍在努力解决更多实现细节,但一些PoC编码看起来很有希望! - akshayl

0

我发现了一种处理对象类型的好方法,使用EXPRESSIONOASIS框架。他们使用自定义数据结构来携带对象的类型。因此,在使用正则表达式和给定表达式解析操作数后,他们决定类型并将此类型存储为通用类的属性,可以随时用于获取类型。

http://code.google.com/p/expressionoasis/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接