我建立了一个用于评估表达式的系统。现在,这些表达式中的操作数可以是几种类型中的一种,包括一些原始的.NET类型。在定义我的Expression类时,我想要一定程度的类型安全性,因此不希望对操作数对象类型使用'object',所以我正在考虑定义一个抽象的Operand基类,其中没有任何内容并创建一个子类每种类型的操作数。你怎么看待这个?
此外,只有某些类型的操作数对其他人有意义。最后,只有一些运算符对特定的操作数有意义。我无法想到在编译时实现这些规则的方法,所以我想我必须在运行时进行这些检查。
关于如何更好地做到这一点的任何想法?
答案 0 :(得分:2)
我不确定基于C的语言是否具有此功能,但是Java有几个对此有用的软件包。
JavaCC或Java编译器编译器允许您定义一种语言(例如您的表达式),并构建相应的Java类。 DemeterJ是一个更加用户友好的(如果不是更多的实验和学术包) - 这使您可以非常轻松地指定表达式语言,并附带一个库,用于定义访问者和操作生成的类结构的策略。如果你能负担得起切换到Java,我可能会试试。另外,我会寻找其中一种技术的C#克隆。
如果沿着这条路走下去,另一件需要考虑的事情是,一旦你在最终结果的合理近似内生成了你的类结构,你就可以将所有生成的类子类化,并将所有特定于应用程序的登录构建到子类。这样,如果您确实需要为表达式语言重新生成新模型,那么您的逻辑将相对独立于您的类层次结构。
更新:实际上看起来有些东西被移植到.NET技术中虽然我没有使用它所以我不确定它可能是什么形状:
祝你好运!答案 1 :(得分:1)
我最近构建了一个动态表达式求值程序。我发现有效的是按照你的建议创建一个带有有意义的派生类的BaseOperand(NumericOperand,StringOperand,DateOperand等)。根据你的实现,泛型也可能有意义(操作数)。
通过实施访客模式,您可以执行任何类型的验证。
我非常特别需要推出自己的解决方案,但是有很多选项可用于处理表达式。您可能需要查看其中一些内容以获取灵感或避免重新发明轮子。
答案 2 :(得分:1)
3.5中的Expression
怎么样?我最近用这个编写了一个表达式解析器/编译器。
答案 3 :(得分:0)
我找到了一种使用EXPRESSIONOASIS框架处理对象类型的好方法。他们使用自定义数据结构来承载对象的类型。因此,在使用正则表达式和给定表达式解析操作数之后,它们决定类型并将此类型存储为泛型类的属性,可以在任何时候使用它来获取类型。