我有一个数学表达式解析器,它应该处理+, -, *, /, ^, (-), 函数,当然还有原子(例如x, 1,pi等)。解析器基本上是根据维基百科的运算符优先级解析器设计的,我在下面复制了它;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
如何修改此解析器以(-)正确处理?更好的是,如何实现一个支持所有中缀和后缀运算符(!例如)的解析器?最后,函数应该如何处理?
我应该注意,(-)词法分析器中的否定与-“减法”不同,因此可以将其视为不同的标记。