Next: Semantic Actions, Previous: Grammar in Bison, Up: Concepts
形式文法は、トークンを分類法に基づいてのみ、選びます。 たとえば、ある規則が`integer constant'という終端記号について言及するならば、 それは、文法的にそこに現れてよい任意の整数型定数を意味します。 その定数の正確な値は、入力が解析される方法と無関係です。 もし、‘x+4’が文法的に正しいならば、‘x+1’も、‘x+3989’も、 同様に文法的に正しいのです。
しかし、いったん解析されれば、入力にとって正確な値はきわめて重要です。 プログラム中の定数として4と1と3989を区別できないコンパイラは、 役に立ちません。 そこで、Bison文法の中のそれぞれのトークンは、トークン型のほかに、 意味値(semantic value)を持ちます。詳細については、 See Defining Language Semantics。
トークン型は、INTEGER
、IDENTIFIER
、','
のように、
文法の中で定義される終端記号です。
これは、そのトークンが正しい位置に現れているか確かめ、
他のトークンとどのようにグループ化するか決めるために必要な、
すべての情報を含んでいます。
文法規則は、トークンの型以外の何も知りません。
意味値は、トークンに関する、たとえば、整数の値や識別子の名前のような、
トークン型以外のあらゆる情報を持っています
(','
のような区切り記号であるトークンは、
意味値を持つ必要がありません)。
たとえば、ある入力されたトークンは、トークン型がINTEGER
で、
意味値が4であると分類されるかもしれません。
別の入力されたトークンは、同じINTEGER
型で、
値が3989であるかもしれません。
文法規則がINTEGER
の出現を許すのならば、
どちらのトークンもINTEGER
型なので、受け入れられます。
構文解析器は、トークンを受け入れるときに、その意味値を記憶します。
それぞれのグループ化は、それに対応する非終端記号とともに、意味値を持てます。 たとえば、電卓の中では、1つの式は、通常、数値である意味値を持ちます。 プログラミング言語のコンパイラの中では、1つの式は、通常、 式の意味を表す木構造の意味値を持ちます。