Previous: Declarations, Up: Grammar File


3.7 同一プログラム中の複数の構文解析器

Bisonを使うプログラムのほとんどは、言語を1つだけ構文解析し、 したがって、Bison構文解析器を1つだけ含みます。 しかし、1つのプログラムで2種類以上の言語を構文解析したいときは、 どうすればよいでしょうか? そうするためには、yyparseyylval などの2重定義の衝突を防ぐ必要があります。

これを容易にする方法が、オプション‘-p prefix’の利用です (see Invoking Bison)。 これによって、Bison構文解析器のインターフェイス関数と変数の名前が、 ‘yy’で始まる代わりにprefixで始まります。 これでそれぞれの構文解析器に、衝突しないような異なる名前を与えられます。

変更される名前は、 yyparseyylexyyerroryynerrsyylvalyycharyydebugで全部です。 たとえば、‘-p c’オプションを使えば、これらの名前は、 cparseclexなどに変わります。

Bisonに関連する上記以外の変数とマクロのすべての 名前は変わりません。これらは、広域ではないので、 異なる構文解析器で同じ名前が使われても衝突しません。 たとえば、YYSTYPEの名前は変わりませんが、 この定義は構文解析器ごとに異なる方法で行われるので、問題ありません (see Data Types of Semantic Values)。

-p’オプションは、さらに、構文解析器ソースファイルの始めで、 yyparseprefixparseと定義するように、 マクロを定義します。 この結果、構文解析器ソースファイル全体で、ある名前を別の名前に変えます。