我有一个数学表达式解析器,它应该处理+
, -
, *
, /
, ^
, (-)
, 函数,当然还有原子(例如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
如何修改此解析器以(-)
正确处理?更好的是,如何实现一个支持所有中缀和后缀运算符(!
例如)的解析器?最后,函数应该如何处理?
我应该注意,(-)
词法分析器中的否定与-
“减法”不同,因此可以将其视为不同的标记。