2012-09-08 11 views
6

これは実際的な問題よりも「原理的に」問題のほうが多いです。 Yaccがプロダクションを減らし、定義されているレクサーから新しいトークンを読み込む順序です。それはのようなプロダクションのセットが指定されると、単一のものにINTEGER BEGIN INTEGER_VALUEを低減する前に、縮小の順序はYaccで定義されていますか?

INTEGER_BEGIN 
INTEGER_VALUE 
LESS_THAN 
INTEGER_BEGIN 
INTEGER_VALUE 

yaccは、その意味論の中に、レクサーからLESS_THANトークンを読み取ることができます:それは、私はトークンの次のセットを持っていた場合は、次のとおりです。

expr : expr LESS_THAN expr 
    | integer 

integer : INTEGER_BEGIN INTEGER_VALUE 

セマンティックアクションで定義されている場合、この変更のルールを実行しますか?

答えて

4

はいできます。 YaccはLALR(1)パーサを作成します。(1)はルックアヘッドの1トークンを意味します。そのため、トークンの最後を1トークン先読みしてルールを減らしてからルールを縮小します。セマンティックアクションの存在は無関係です。セマンティックアクションは、ルールを減らす直前に実行するCコードのほんの一部であるためです。

トークンを先読みするという保証はありません。 yaccまたはbisonによって作成されたパーサは、時々、次のトークンを読み込まなくてもルールを減らすことができる状態である 'デフォルトの削減'を使用します。これは、ルールの縮小が次のトークンとは独立している場合に発生します。

この特定の例では、integerルールではデフォルトの削減が使用される可能性があるため、先読みせずに削減できるかもしれませんが、保証はありません。デフォルトの削減は、一部の(ただしすべてではありません) yacc。

+0

これが起こったかどうかを知る方法はありますか? –

+0

http://www.gnu.org/software/bison/manual/html_node/Default-Reductions.htmlには、既定の縮小のセマンティクスについての詳細な説明が記載されています。注意したように、レクサーの呼び出しが遅れます。 –

+0

bisonのいくつかのバージョンでは、デフォルトのリダクションになっているかどうかを確認するアクションで 'if(yychar == YYEMPTY)'をチェックできます(先読みは読み込まれていません)。 –

関連する問題