次: , 前: Grammar in Bison, 上: Concepts


1.3 意味値

形式文法は、トークンを分類法に基づいてのみ、選びます。 たとえば、ある規則が`integer constant'という終端記号について言及するならば、 それは、文法的にそこに現れてよい任意の整数型定数を意味します。 その定数の正確な値は、入力が解析される方法と無関係です。 もし、`x+4'が文法的に正しいならば、`x+1'も、`x+3989'も、 同様に文法的に正しいのです。

しかし、いったん解析されれば、入力にとって正確な値はきわめて重要です。 プログラム中の定数として4と1と3989を区別できないコンパイラは、 役に立ちません。 そこで、Bison文法の中のそれぞれのトークンは、トークン型のほかに、 意味値(semantic value)を持ちます。詳細については、 See Defining Language Semantics

トークン型は、INTEGERIDENTIFIER','のように、 文法の中で定義される終端記号です。 これは、そのトークンが正しい位置に現れているか確かめ、 他のトークンとどのようにグループ化するか決めるために必要な、 すべての情報を含んでいます。 文法規則は、トークンの型以外の何も知りません。

意味値は、トークンに関する、たとえば、整数の値や識別子の名前のような、 トークン型以外のあらゆる情報を持っています (','のような区切り記号であるトークンは、 意味値を持つ必要がありません)。

たとえば、ある入力されたトークンは、トークン型がINTEGERで、 意味値が4であると分類されるかもしれません。 別の入力されたトークンは、同じINTEGER型で、 値が3989であるかもしれません。 文法規則がINTEGERの出現を許すのならば、 どちらのトークンもINTEGER型なので、受け入れられます。 構文解析器は、トークンを受け入れるときに、その意味値を記憶します。

それぞれのグループ化は、それに対応する非終端記号とともに、意味値を持てます。 たとえば、電卓の中では、1つの式は、通常、数値である意味値を持ちます。 プログラミング言語のコンパイラの中では、1つの式は、通常、 式の意味を表す木構造の意味値を持ちます。