2013-07-11 63 views
0

我试图产生可能是这样的事情一个公式,这只是一个样本,如何解析以下字符串

A + B + C > D - A 

现在,A,B,C,d,等等都是列名一张表格(如excel表格)我将在内存中访问。

我需要生成一个规则,就像上面的A + B + C > D - A一样,它将决定用户可以在Cell中添加什么样的值。

目前我就是这样开始:

string toValidate = "A + B + C > D + E - A"; 
string lhs = "", rhs = ""; 
string[] comparisonOperators = new string[] { "=", ">", "<", "<>", "!=" }; 
char[] arithmeticOperators = { '+', '-', '/', '*' }; 
toValidate = toValidate.Replace(@" ", ""); 
for (int i = 0; i < comparisonOperators.Length; i++) 
{ 
    if (toValidate.Contains(comparisonOperators[i])) 
    { 
     operatorIndex = toValidate.IndexOf(comparisonOperators[i]); 
     break; 
    } 
} 
lhs = toValidate.Substring(0, operatorIndex); 
rhs = toValidate.Substring(operatorIndex + 1); 
string[] columnLhsList = lhs.Split(arithmeticOperators); 
string[] columnRhsList = rhs.Split(arithmeticOperators); 

然而,即使我有字符串作为lhsrhs,甚至我的运营商,其>在上面的代码,我不能够理解我怎么能在工作表本身上应用公式。我只需要知道哪个Column有哪个操作员关联。

因为我在另一种情况下A之前有个别的列名,但不是经营者面前,为e.g,

+之前A-

我如何解析上述请帮助。

回答

3

它,但是,如果你想简单的公式解析器这样自己一个非常有趣的问题。

我建议你看看这篇文章,因为它是非常清晰的书面和可理解的,因为它。

Shunting-yard Algorithm

3

就我个人而言,我绝不会尝试/敢于创建我自己的公式表达式解析器。相反,我会(并确实)使用其中一种可用的方法,例如NCalc over at CodePlex.com

使用这些工具,它是写

Expression e = new Expression("2 + 3 * 5"); 
Debug.Assert(17 == e.Evaluate()); 

让您的公式计算一样容易。

通常这样的库非常坚固,经过很好的测试并且具有丰富的功能集。这将需要很长时间(如果有的话)自己做这样一个高质量的图书馆。

为了进一步举NCalc网站,你甚至可以使用变量,如例如: -

Expression e = new Expression("Round(Pow([Pi], 2) + Pow([Pi2], 2) + [X], 2)"); 

e.Parameters["Pi2"] = new Expression("Pi * [Pi]"); 
e.Parameters["X"] = 10; 

e.EvaluateParameter += 
    delegate(string name, ParameterArgs args) 
    { 
     if (name == "Pi") 
     args.Result = 3.14; 
    }; 

Debug.Assert(117.07 == e.Evaluate());