在 C# 中标记表达式字符串

Tokenizing a expression string in C#

我有一个形式为

的计算公式字符串
 string formula = w_tb + Min(d_3,a_x) * Pow(x,2)

在上面的例子中 w_tb, d_3, a_x, x 是变量。通过使用操作数作为分隔符拆分字符串,我能够找到公式中的变量列表。

但是为了给变量赋值(来自数据库的值),我的第一个方法是用数据库中的变量值替换变量名。但这会导致甚至用该值替换表达式字符串的一个子字符串。例如:如果变量 x 被表达式字符串中的值 1,2 替换 a_x 将被替换为 a_1,2 这不是所需的结果。

我有变量列表和完整的分隔符(运算符)列表。

我想达到什么目的?

我正在尝试从表达式字符串中获取以下列表

List<string>() {"w_tb","+","Min","(","d_3",",","a_x",")","*","Pow","(","x",",","2",")"}

有什么方法可以完成任务。

我已经尝试过this答案中提到的解决方案。但是我拥有的分词器是一个字符串。

您正在尝试做的是编译器经常使用的称为解析。

您可以为表达式定义一个简单的语法,然后让 parser-generator 为您生成解析器代码。它允许您定义语法错误并提供您想要的完整标记列表。 Antlr 中的一个很好的例子。看看http://www.antlr.org/

所以我可以找到一种方法来完成我的任务。我有所有可用运算符的列表和所有可用操作数的列表。可以通过根据运算符字符串拆分公式字符串来获得操作数列表。

var Operatorlist = new string[] { "Min", "Max", "Abs", "Pow", "+", "-", "*", "/", "(", ")", "²", "³", "Length", " ", "\r", "\n", ",", "[", "]", "Sqrt", "Cubrt", "^" };
string[] formulaSplit = formula.Split(Operatorlist,StringSplitOption.None);

现在解析公式以获取操作数和运算符列表

string sb="";
var formlist = new list<string>();
foreach(var c in calc.CalculationFormula)
{
    sb = sb + c;
    if(delimstringlist.Contains(sb))
    {
        formlist.Add(sb);
        sb = "";
    }
    else if(formulaSplit.Contains(sb))
    {
        formlist.Add(sb);
        sb = "";
    }

}

效率可能不高,但一定能完成任务。