C# C语言中的自定义表达式解析器#

C# C语言中的自定义表达式解析器#,c#,math,expression,eval,finance,C#,Math,Expression,Eval,Finance,我正在为一个金融应用程序开发一个计算器程序。 我需要解析和计算复杂的金融表达式,如下所述 表达式是自定义函数和算术表达式的混合体。 我正在使用NCalc解析算术表达式。但是,我在解析自定义函数时遇到问题 IF((合并(X1,X2)-X3+IF(X40,自定义函数(X6),X7) 关于最佳方法有什么建议吗 我目前正在研究一个涉及递归调用和堆栈Push/Pop的复杂逻辑。但它不起作用。这是一个很久以前就解决了的老问题。解决方案是使用解析器生成器,而不是从头开始编写自己的解析器。有许多可用的选项,其中

我正在为一个金融应用程序开发一个计算器程序。 我需要解析和计算复杂的金融表达式,如下所述

表达式是自定义函数和算术表达式的混合体。 我正在使用
NCalc
解析算术表达式。但是,我在解析自定义函数时遇到问题

IF((合并(X1,X2)-X3+IF(X40,自定义函数(X6),X7)

关于最佳方法有什么建议吗


我目前正在研究一个涉及递归调用和堆栈Push/Pop的复杂逻辑。但它不起作用。

这是一个很久以前就解决了的老问题。解决方案是使用解析器生成器,而不是从头开始编写自己的解析器。有许多可用的选项,其中一个比较流行的选项是


使用像ANTLR这样的解析器生成器,您可以使用易于理解的产生式规则来描述您的问题。解析器生成器将生成您现在试图手动编写的复杂逻辑,使用您选择的语言,例如C#。您的语言的语法可能已经以这种格式或您已经使用这种格式向您的用户和开发团队描述了该语言。

我认为您必须使用有限状态机。编译器基于它。 您必须逐个字母解析字符串,并定义您的操作: 诸如此类:

做 { //您的解析器 i++; } 而
Mishax是对的,您编写规则的方式比直接用C#编写规则更清晰。如果您在ANTLR和C#(我曾经)方面有问题,那么还有其他专用于C#--、、或my的生成器

不要让你仅仅依靠信念(如果你只想得到结果):


原始C#中的等效部分要长得多。

我建议使用JavaScript解释器的替代方法

JInt有一个强大的解析器,但是您需要更改的东西很少

例如,如果JavaScript中不存在IF和COALESCE,则可以对它们进行转换

IF表达式

x = IF(CONDITION,THEN,ELSE) 
x = COALESCE(x1,x2,x3)
JavaScript等价物是

x = CONDITION ? THEN : ELSE
x = x1 != null ? x1 : 
        (x2 != null ? x2 : 
             (x3 != null ? x3 : null ))
联合表达

x = IF(CONDITION,THEN,ELSE) 
x = COALESCE(x1,x2,x3)
JavaScript等价物是

x = CONDITION ? THEN : ELSE
x = x1 != null ? x1 : 
        (x2 != null ? x2 : 
             (x3 != null ? x3 : null ))
JInt将为您提供一个解析的AST,您可以操作AST并转换相应的IF和COALESCE运算符

使用组织良好的JInt解析器和简单的后处理AST将比重新发明轮子容易得多


通过使用JInt,您还可以使用各种现有的.NET方法,并且您可以轻松地注入自己的类来表示上下文值。

非常感谢。我通过合并Mathos表达式解析器(下面的链接)的思想解决了这个问题.使用ANTLR使表达式变得有点复杂。因此,我最后混合使用了我自己的语法分析器和Mathos语法分析器。