我编写了一个数学C#应用程序,用户可以用预定义的方式定义函数,例如
COS({x}+3*(2+SQRT({x})))
对于评估,我使用Shunting-Yard算法。我有一个函数来标记上面的字符串,在列表中生成以下输入:
FUNCTION,OPEN_PARENTHESIS,变量,运算符,NUMBER OPERATOR,OPEN_PARENTHESIS,NUMBER OPERATOR,FUNCTION,OPEN_PARENTHESIS,变量,CLOSE_PARENTHESIS,CLOSE_PARENTHESIS,CLOSE_PARENTHESIS。
这很好用,但我有负数问题,我不知道如何处理减法运算符,减法和负号时?
该函数遍历字符串并搜索其中的模式(例如,当i。字符为'{'则(i + 1)。字符必须是小写字母和(i + 2)。字符必须be'}',存储变量并继续使用(i + 3)。字符,否则会引发语法错误。)现在这个函数接受负数而不是减法它接受带负数的乘法并使用'+' ,所以不是3-1而是我必须使用3 +( - 1)* 1。这不是一个优雅的解决方案,你有任何想法如何解决它?
答案 0 :(得分:0)
如果您看到 - 在行的开头,紧接在打开的括号之后或跟随另一个符号,则后面的数字为负数
答案 1 :(得分:0)
我编写了一个可以解析C#样式表达式的小型开源库。
https://github.com/davideicardi/DynamicExpresso
您可以编写自定义函数(如COS,SQRT),注入变量或参数(x)。或者您可以使用内置的C#函数(Math.Sqrt,...)。
您可以在http://dynamic-expresso.azurewebsites.net/
找到现场演示也许这个图书馆可以加快你的工作。