2012-03-21 15 views
0

正如问题所述,我在我的公司中坚持使用.Net 2.0,并且没有升级的机会。有没有办法让.NET 2.0中的Irony工作。在.Net 2.0中使用Irony进行自定义语言设计

我会简单地尝试解释我想达到的目标。我们公司有一个工资单系统,我们让客户在那里为工资单项目定义自己的公式。这些公式必须使用我们通过Regex检查的一些关键字/函数(非常不可靠)。然后我们创建一个Microsoft脚本控制对象并使用它的eval函数来解析片段。这些片段依次调用类中定义的关键字/函数来获取输出。

但是说这个系统有缺点是非常有礼貌。有时它只是随着错误而溢出。

非常愚蠢的例如 -

FVAL(A)/(FVAL(B)+FVAL(C)) 

很明显,这个公式通过了两个阶段。

首先,我们做了以下验证阶段 -

  • 检查通过正则表达式是否有使用任何关键字中不存在的关键字

  • 的预定义的ArrayList然后检查是否有在变量的数组列表中不存在的变量(在这种情况下 - A,B,C是那些变量)。

  • 如果所有的验证接着传到我们通过式字符串到ScriptControlClass对象的eval功能,并且也添加与在其中定义的所有功能的静态类(在这种情况下,考虑FVAL()),并且该函数返回布尔true如果变量是在这种情况下使用一个有效的(如添加日期和编号将返回false)评估这个表达式的结果后

现在是 - DivideByZeroException,为什么?因为EVAL类型转换所有布尔true1和执行正常的算数。

FVAL(A)/(FVAL(B)+FVAL(C)) => 1/(1-1) 

第二阶段几乎是类似的,但没有任何验证检查,就像没有返回true,我们实际上是从一个DataTable其中包含每个变量的值返回变量的值。

这个系统已经过时了,它严重影响我的神经,我真的需要帮助。请建议。

回答

2

如果你只是谈论Excel风格的公式,编写一个好的解释器很容易,特别是如果你只需要处理一种数据类型。有编译器(甚至是解析器)背景的人可能会在不到一天的时间内写出你的信息。我自己写了一堆。

Embedding a scripting language是另一种选择,但您必须对给定语言的怪癖感到满意。如果这是业务需求,确保使用高精度数字可能会很困难。

+0

您如何看待[Spart](http://www.codeproject.com/Articles/5676/Spart-a-parser-generator-framework-100-C#)。你能指导我使用Spart来达到我的目的吗?我认为它足以满足我的需求。我只是停留在“入门”文章中。 – 2012-03-21 10:06:47

+0

选项有[很多](http://stackoverflow.com/questions/5060583/code-parser-for-own-dsl-in-c-sharp),但没有我已经实现的编译器或解释器使用其中的任何一个。反讽和斯巴特都可以是伟大的。就我个人而言,我已经写了足够的东西,我会花更少的时间用递归下降系统从头开始编写简单的语法,而不是学习API。 – 2012-03-21 10:25:10

+0

你可以给我一个使用我在问题中发布的代码的语法示例。 – 2012-03-21 12:49:10