使用Irony在.Net 2.0中进行自定义语言设计

时间:2012-03-21 07:21:46

标签: c# .net language-design irony

就像问题所说的那样,我在公司里面坚持使用.Net 2.0,没有升级的机会。有没有办法让Irony在.NET 2.0中工作。

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

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

非常愚蠢的 -

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

显然,这个配方经过的两个阶段。

首先是我们执行以下操作的验证阶段 -

  • 通过正则表达式检查是否有任何关键字在关键字的预定义arrayList中不存在

  • 然后检查是否有任何变量(在这种情况下 - A,B,C是那些),这些变量在变量的arraylist中不存在。

  • 如果所有验证都通过,那么我们将公式字符串传递给ScriptControlClass对象的eval函数,并添加一个静态类,其中定义了所有函数(在本例中考虑FVAL()),此函数返回布尔值true如果变量是在此上下文中使用的有效变量(如添加日期和数字将返回false)

现在,在评估此表达式后,结果是 - DivideByZeroException ,为什么因为eval将所有布尔true转换为1并对其执行常规算术。

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

第二阶段几乎相似但没有任何验证检查,比如没有返回true,我们实际上从DataTable返回变量的值,该变量由每个变量的值组成。

系统过时了,它让我很紧张,我真的需要帮助。请建议。

1 个答案:

答案 0 :(得分:2)

如果您只是在讨论excel样式公式,那么编写一个好的解释器非常容易,特别是如果您只需要处理一种数据类型。在编译器(甚至是解析器)中具有背景知识的人可能会在不到一天的时间内为您写信。我自己写了一堆。

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