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

本文关键字:表达式 字符串 | 更新日期: 2023-09-27 18:31:12

>我有一个形式的计算公式字符串

 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",")"}

有没有办法完成任务。

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

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

您尝试执行的操作称为解析,编译器经常使用。

您可以为表达式定义一个简单的语法,并让解析器生成器为您生成解析器代码。它允许您定义语法错误,并提供您想要的完整令牌列表。安特尔的一个很好的例子。看看 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 = "";
    }
}

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