我有一个数学表达式解析器,应该处理+
,-
,*
,/
,^
,(-)
,函数以及当然还有原子(例如x
,1
,pi
等)。解析器基本上是根据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,它应接受合法的一元术语。