2009-02-04 64 views
4

我建模一个评估表达式的系统。现在这些表达式中的操作数可以是几种类型之一,包括一些原始的.NET类型。在定义我的表达式类时,我想要某种程度的类型安全性,因此不希望为操作数对象类型使用“对象”,所以我正在考虑定义一个抽象的操作数基类,其中没有任何内容,并创建一个子类每种类型的操作数。你觉得这怎么样?表达评估设计问题

此外,只有某些类型的操作数对别人有意义。最后,只有一些操作员对特定操作数有意义。我无法真正想到在编译时实现这些规则的方式,所以我想我必须在运行时执行这些检查。

有关我如何能够做得更好的任何想法?

+0

让我知道如果您遇到问题 - 我有一些工作代码的地方,我在原型(链接)的数学处理;-p http://marcgravell.blogspot.com/2009/使用01/above-surface.html – 2009-02-04 22:40:57

回答

1

Expression在3.5中怎么样?我最近用这个写了一个表达式分析器/编译器。

+0

我要走这条路(表达式树)。这些表达式可以在LINQ中非常干净地编写,并自动转换为可以评估的表达式树。仍试图制定更多的实施细节,但一些PoC编码看起来很有希望! – akshayl 2009-02-04 22:23:32

2

我不确定基于C的语言是否具有此功能,但是Java有几个实际上对此有意义的软件包。

JavaCC或java编译器编译器允许您定义一种语言(例如您的表达式),并且它们构建相应的java类。如果不是更多的实验性和学术性软件包,DemeterJ是一种更友好的用户界面 - 这使您可以非常轻松地指定表达式语言,并附带一个用于定义访问者和策略的库,以便对生成的类结构进行操作。如果您可以负担切换到Java我可以尝试。其他方面,我会寻找这些技术之一的C#克隆。

如果沿着这条路线走,另一件需要考虑的事情是,一旦你在最终结果的合理近似值内生成了你的类结构,你可以继承所有生成的类并构建你的所有特定于应用程序的登录子类。这样,如果您确实需要重新生成表达式语言的新模型,那么您的逻辑将相对独立于您的类层次结构。

更新:其实它看起来好像一些这方面的东西移植到.NET技术,虽然我还没有使用它,所以我不知道它可能是什么形状:

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

好运!

1

我最近建立了一个动态表达式评估器。我发现有效的是按照你的建议创建一个带有有意义的派生类的BaseOperand(NumericOperand,StringOperand,DateOperand等)。根据你的实现,泛型也可能有意义(操作数)。

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

我有一个非常具体的需要推出我自己的解决方案,但有许多选项可用于处理表达式。你可能想看看其中的一些灵感或避免重新发明轮子。

0

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

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