正如问题所述,我在我的公司中坚持使用.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类型转换所有布尔true
到1
和执行正常的算数。
FVAL(A)/(FVAL(B)+FVAL(C)) => 1/(1-1)
第二阶段几乎是类似的,但没有任何验证检查,就像没有返回true,我们实际上是从一个DataTable
其中包含每个变量的值返回变量的值。
这个系统已经过时了,它严重影响我的神经,我真的需要帮助。请建议。
您如何看待[Spart](http://www.codeproject.com/Articles/5676/Spart-a-parser-generator-framework-100-C#)。你能指导我使用Spart来达到我的目的吗?我认为它足以满足我的需求。我只是停留在“入门”文章中。 – 2012-03-21 10:06:47
选项有[很多](http://stackoverflow.com/questions/5060583/code-parser-for-own-dsl-in-c-sharp),但没有我已经实现的编译器或解释器使用其中的任何一个。反讽和斯巴特都可以是伟大的。就我个人而言,我已经写了足够的东西,我会花更少的时间用递归下降系统从头开始编写简单的语法,而不是学习API。 – 2012-03-21 10:25:10
你可以给我一个使用我在问题中发布的代码的语法示例。 – 2012-03-21 12:49:10