、、、、、、、関数、そしてもちろんアトム(、、、+
など)を処理する数式パーサーがあります。パーサーは基本的に、ウィキペディアの演算子優先順位パーサーに従って設計されています。これを以下に再現しました。他の場所で定義されています。-
*
/
^
(-)
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
(-)
このパーサーを変更して正しく処理するにはどうすればよいですか?!
さらに良いことに、必要になる可能性のあるすべてのインフィックスおよびポストフィックス演算子(たとえば)をサポートするパーサーを実装するにはどうすればよいですか?最後に、関数はどのように扱われるべきですか?
(-)
否定はレクサーでは「減算」と区別される-
ため、別のトークンとして扱うことができることに注意してください。