3

最後に、この質問から来ると、このサブパーサーという問題が残ります...

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)...何が欠けていますか?

4

1 に答える 1

1

を持っていてa^bが表示^cされたら、それをトップレベルの RHS に挿入して を^作成a^(b^c)し、結果の完全な式を自分自身に残します。次に が表示^dされたら、トップレベルの RHS に再び挿入して^、 を作成しa^((b^c)^d)ます。トップレベルのRHSに注入するのではなく^、右/最も内側の^式に注入する必要があります。これを実現するには、その式を別の変数で追跡するだけです。次に、最上位の式のRightChildプロパティを変更する代わりに、子のプロパティを変更します。

于 2015-07-27T17:38:37.743 に答える