最後に、この質問から来ると、このサブパーサーという問題が残ります...
private static void Factor(Scanner scanner, ref TermNode currentTree, ref Token currentToken)
{
Exponent(scanner, ref currentTree, ref currentToken);
while (currentToken is OperatorToken && ((OperatorToken)currentToken).OperatorChar == '^') // So long as the token is ^
{
TermNode node = new TermNode(currentTree, null, currentToken);
currentTree = null;
scanner.MoveNext();
currentToken = scanner.Current;
Exponent(scanner, ref currentTree, ref currentToken);
node.RightChild = currentTree;
currentTree = node;
}
}
...指数演算子 ("^") を正しく処理しません。これは、右結合であるためです。上記のコードは、連想のままであるかのように処理します。
例: テキストe^x^2
は として解釈され(e^x)^2
ます。ただし、正しい「解釈」はe^(x^2)
.
私はすでに次のようなことを試しました:
if (/* The current token is ^ */)
{
TermNode node = new TermNode(tree, null, currentToken);
tree = null;
scanner.MoveNext();
currentToken = scanner.Current;
Exponent(ref tree);
node.RightChild = tree;
tree = node;
}
while (/* The current token is ^ */)
{
TermNode detachedExponent = tree.RightChild;
TermNode oldTree = tree;
Token token = currentToken;
tree.RightChild = null;
tree = null;
scanner.MoveNext();
currentToken = scanner.Current;
Exponent(ref tree);
oldTree.RightChild = new TermNode(distachedExponent, tree, token);
tree = oldTree;
}
これは、2 つの連続した「^」式に対してのみ機能します。のようなものではありませんe^x^y^z
(パーサーが主張するようなものではe^(x^(y^z))
ありませんe^((x^y)^z)
...何が欠けていますか?