Bisonを使うときには、入力としてBison文法ファイルを指定します。 文法で記述された言語を解析する、Cのソースファイルが出力になります。 このファイルをBison構文解析器(Bison parser)と呼びます。 BisonユーティリティとBison構文解析器は、 別のプログラムであることに注意してください。 Bisonユーティリティの出力がBison構文解析器で、 あなたのプログラムの一部分になるのです。
Bison構文解析器の仕事は、文法規則に従って、トークンをグループ化することです。 たとえば、識別子と演算子から式を組み立てます。 このために、文法規則に対応するアクションを実行します。
トークンは、字句解析器(lexical analyzer)と呼ばれる関数によって得られ、
その関数を(Cで書くような)なんらかの方法で与える必要があります。
Bison構文解析器は、新しいトークンを必要とするたびに、
字句解析器を呼び出します。
Bison構文解析器は、トークンの「内部」がなんであるか知りません
(しかし、トークンの意味値は関係します)。
一般に、字句解析器は、テキスト中の文字を解析してトークンを得ますが、
Bisonはその方法を知りません。
See The Lexical Analyzer Function yylex
。
Bison構文解析器ファイルは、Cのプログラムで、yyparse
という名前の、
文法を実装する関数を定義します。
この関数は、完全なCのプログラムを構成しません。
いくつかの関数を補ってやる必要があります。
1つは、字句解析器です。
もう1つは、エラーを報告するために構文解析器が呼び出す、
エラー報告関数です。
さらに、完全なCプログラムはmain
関数から実行を始める必要がありますので、
これを補って、そこからyyparse
を呼び出してください。
See Parser C-Language Interface。
あなたが書くアクションの中でのトークンの型名と記号に関係なく、
Bison構文解析器の中で使われるすべての変数と関数の名前は、
‘yy’または‘YY’で始まります。
これは、字句解析関数yylex
とエラー報告関数yyerror
および
構文解析関数yyparse
のようなインターフェイス関数も含みます。
また、内部で使われる多数の識別子も同様です。
したがって、本書で定義されている場合を除いて、
Bison文法ファイルの中で‘yy’または‘YY’で始まる
Cの識別子の利用は避けるべきです。