C# 数学表达式解析器中的右联想运算符

C# 数学表达式解析器中的右联想运算符,c#,parsing,associative,infix-notation,infix-operator,C#,Parsing,Associative,Infix Notation,Infix Operator,最后,问题仍然是,这艘潜艇 private static void Factor(Scanner scanner, ref TermNode currentTree, ref Token currentToken) { Exponent(scanner, ref currentTree, ref currentToken); while (currentToken is OperatorToken && ((OperatorToken)currentToken)

最后,问题仍然是,这艘潜艇

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;
}

它仅适用于两个连续的“^”表达式。不是像解析器声称的那样
e^x^y^z
(即
e^(x^(y^z))
,也不是
e^((x^y)^z)
,我缺少什么?

当你有
a^b
,你看到
^c
,你将它注入顶级
^
的RHS,创建
a^(b^c)
,并留下结果的完整表达式。当您看到
^d
时,再次将其注入顶级
^
的RHS,创建
a^((b^c)^d)
。您不应该将其注入顶级
^
的RHS,而是注入最右边/最里面的
^
表达式。要实现这一点,只需在单独的变量中跟踪该表达式。然后,不必修改顶级表达式的
RightChild
属性,而要修改子表达式的属性。

您的任务是什么ion?我假设“如何让这个解析器正确地处理像^这样的关联运算符?”@JerryFederspiel是的,是的。这很简单。首先编写您希望接受的BNF。然后按照我建议的方式对递归下降解析器进行编码。如果运算符是正确的关联运算符,语法将指定该方式,您的解析器将相应地工作。我在上一个问题中向您展示了如何操作;我将它留给您执行。