我有一个数学表达式解析器,应该处理+-*/^(-),函数以及当然还有原子(例如x1pi等)。解析器基本上是根据Wikipedia's operator precedence parser设计的,我在下面进行了复制; parse_primary()在其他地方定义。

parse_expression ()
    return parse_expression_1 (parse_primary (), 0)

parse_expression_1 (lhs, min_precedence)
    while the next token is a binary operator whose precedence is >= min_precedence
        op := next token
        rhs := parse_primary ()
        while the next token is a binary operator whose precedence is greater
                 than op's, or a right-associative operator
                 whose precedence is equal to op's
            lookahead := next token
            rhs := parse_expression_1 (rhs, lookahead's precedence)
        lhs := the result of applying op with operands lhs and rhs
    return lhs

如何修改此解析器以正确处理(-)?更好的是,如何实现支持我可能想要的所有infix和postfix运算符(例如!)的解析器?最后,应如何对待功能?

我应该注意,词法分析器中的(-)取反与-的“减法”有所区别,因此可以将其视为不同的标记。

最佳答案

所有一元运算符和函数调用内容基本上都属于parse_primary,它应接受合法的一元术语。

09-12 11:42