C#字符串标记化

时间:2013-03-26 11:40:54

标签: c# .net regex tokenize subtraction

我编写了一个数学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。这不是一个优雅的解决方案,你有任何想法如何解决它?

2 个答案:

答案 0 :(得分:0)

如果您看到 - 在行的开头,紧接在打开的括号之后或跟随另一个符号,则后面的数字为负数

答案 1 :(得分:0)

我编写了一个可以解析C#样式表达式的小型开源库。

https://github.com/davideicardi/DynamicExpresso

您可以编写自定义函数(如COS,SQRT),注入变量或参数(x)。或者您可以使用内置的C#函数(Math.Sqrt,...)。

您可以在http://dynamic-expresso.azurewebsites.net/

找到现场演示

也许这个图书馆可以加快你的工作。