文脈依存性を処理する1つの方法は、字句解析結び付き(lexical tie-in)で、 Bisonのアクションによって設定されるフラグが、 トークンが構文解析される方法に影響します。
たとえば、C言語によく似ていて、‘hex (hex-expr)’という
特別な構造を持つ言語について、考えてみましょう。
予約語hex
がきた後にかっこで囲まれた式が続いて、
そのかっこの中ではすべての整数が16進数になります。
特に、トークン‘a1b’は、このような文脈に現れれば、
識別子ではなく整数として扱われる必要があります。
どのようにすればよいかを示します。
%{ int hexflag; %} %% ... expr: IDENTIFIER | constant | HEX '(' { hexflag = 1; } expr ')' { hexflag = 0; $$ = $4; } | expr '+' expr { $$ = make_sum ($1, $3); } ... ; constant: INTEGER | STRING ;
yylex
は、hexflag
の値が0でなければ、
すべての整数が16進数であると字句解析し、
英字で始まるトークンも可能な限り整数と解釈すると、仮定します。
hexflag
の宣言は、アクションから参照可能なように、
文法ファイルのC宣言部に書かれる必要があります
(see The C Declarations Section)。
同様に、yylex
のプログラムにも、hexflag
の宣言が必要です。