3

、、、、、、、関数、そしてもちろんアトム(、、、+など)を処理する数式パーサーがあります。パーサーは基本的に、ウィキペディアの演算子優先順位パーサーに従って設計されています。これを以下に再現しました。他の場所で定義されています。-*/^(-)x1piparse_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

(-)このパーサーを変更して正しく処理するにはどうすればよいですか?!さらに良いことに、必要になる可能性のあるすべてのインフィックスおよびポストフィックス演算子(たとえば)をサポートするパーサーを実装するにはどうすればよいですか?最後に、関数はどのように扱われるべきですか?

(-)否定はレクサーでは「減算」と区別される-ため、別のトークンとして扱うことができることに注意してください。

4

1 に答える 1

2

すべての単項演算子と関数呼び出しは基本的にparse_primaryに属し、これは法的な単項用語を受け入れる必要があります。

于 2012-12-06T22:17:16.823 に答える