Mathos Parser - 使用字母作为运算符

时间:2014-11-28 20:23:26

标签: c# parsing math

Test1失败,但Test2没有失败。 这是因为Mathos Parser不允许将字母字符用作运算符吗? 或者有什么我想念的东西?

[TestMethod]
public void Test1()
{
    MathParser parser;
    parser = new MathParser();
    parser.OperatorList = new List<string>() { "a" };
    parser.OperatorAction.Add("a", (x, y) => x + y);
    Assert.IsTrue(parser.Parse("3a2") == (3 + 2));
}
[TestMethod]
public void Test2()
{
    MathParser parser;
    parser = new MathParser();
    parser.OperatorList = new List<string>() { "$" };
    parser.OperatorAction.Add("$", (x, y) => x + y);
    Assert.IsTrue(parser.Parse("3$2") == (3 + 2));
}

1 个答案:

答案 0 :(得分:0)

@mike z是对的。默认情况下,当我们有数字字母时,解析器会插入一个乘法符号,以便 3x 变成 3 * x 。同样的事情就是说 3(x + 2) 3 *(x + 2)

如果您不需要此功能,只需将第二个if if语句替换为以下内容:

                else if (Char.IsLetter(ch))
            {
                //if (i != 0 && (Char.IsDigit(expr[i - 1]) || Char.IsDigit(expr[i - 1]) || expr[i - 1] == ')'))
                //{
                //    tokens.Add("*");
                //}

                vector = vector + ch;

                while ((i + 1) < expr.Length && Char.IsLetter(expr[i + 1])) // here is it is possible to choose whether you want variables that only contain letters with or without digits.
                {
                    i++;
                    vector = vector + expr[i];
                }

                tokens.Add(vector);
                vector = "";
            }

注意:我已将Char.IsLetterOrDigit更改为Char.IsLetter。通过实现这一点,变量将不能包含数字。

您还可以稍微更改逻辑,以便在所有情况下插入乘法符号,但 a 。但是,变量名称将无法包含 a