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));
}
答案 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 。