6

これは、実際的な問題というよりも、「原則として」の問題です。Yacc がプロダクションを削減し、定義されたレクサーから新しいトークンを読み取る順序です。つまり、次のトークンのセットがあるとします。

INTEGER_BEGIN
INTEGER_VALUE
LESS_THAN
INTEGER_BEGIN
INTEGER_VALUE

Yacc は、そのセマンティクス内で、レクサーからトークンを読み取ることができますか?次のような一連のプロダクションが与えられた場合、単一のものにLESS_THAN還元される前に、レクサーからトークンを読み取ることができますか?INTEGER BEGIN INTEGER_VALUE

expr : expr LESS_THAN expr
     | integer

integer : INTEGER_BEGIN INTEGER_VALUE

これらがセマンティックアクションで定義されている場合、この変更のルールはありますか?

4

1 に答える 1

4

はい、できます。Yacc は LALR(1) パーサーを作成します -- (1) は先読みの 1 トークンを意味します -- そのため、ルールを削減する前に、ルールのトークンの末尾を超えて 1 トークン先読みすることがあります。セマンティック アクションはルールを削減する直前に実行する C コードにすぎないため、セマンティック アクションの存在は無関係です。

常にトークンを先読みするという保証はないことに注意してください。yacc または bison によって作成されたパーサーは、「デフォルト削減」を使用することがあります。これは、最初に次のトークンを読み取る必要なくルールを削減できる場所を示します。これは、ルールの縮小が次のトークンに依存しない場合に発生します。

この特定の例では、デフォルトの縮小をintegerルールに使用できるため、先読みなしで縮小する可能性がありますが、ここでも保証はありません。デフォルトの縮小は、yacc の一部の (ただしすべてではない) 実装で使用される最適化です。

于 2012-09-08T20:48:33.273 に答える