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));
}
@mike zは正しいです。デフォルトでは、3xが3 * xになるように、数字文字がある場合、パーサーは乗算記号を挿入します。同じことが、3(x + 2)が3 *(x + 2)となる場合にも発生します。
この機能が必要ない場合は、2番目のelse 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を含めることはできません。