0

私はフレックス、バイソンを使って簡単な電卓を作っています。

整数式と実数式の2種類の式を含む文法を開発しました。

文法は次のようになります。

exp -> intExp | realExp

intExp -> INT | intExp '+' intExp

realExp -> REAL | realExp '+' realExp | intExp '+' realExp | realExp '+' intExp

これはLALR(1)ではありません。

たとえば、文字列INT'+'REALについて考えてみます。'INT'では先読みは'+'であり、これだけに基づいて、文字列がintExpであるかrealExpであるかを判別することは不可能です。

あいまいさを解消するために文法を書き直してみましたが、何も起こりませんでした。

解析中に計算を延期し、代わりに解析ツリーを構築できることはわかっています。次に、型チェックを使用すると、問題を解決できます。しかし、それはそのような単純な問題には少し多すぎるようです。

このあいまいさを処理するためにバイソン自体を作成する方法はありますか?それとも、文法をより良い方法で書き直すことができますか?

4

1 に答える 1

2

いいえ、LALR(1)でない場合は、そうではありません。ただし、ご使用の言語では、型の不一致エラーは発生しません。では、なぜintとrealの式に別々のプロダクションがあるのでしょうか。ノード値に整数、実数、および型コードを含めるだけです。

于 2013-03-27T06:35:59.423 に答える