次: Rpcalc Main, 前: Rpcalc Rules, 上: RPN Calc
rpcalc
字句解析器
字句解析器の仕事は、低水準の構文解析で、文字または文字列を
トークンに変換します。
Bison構文解析器は、字句解析器を呼び出してトークンを得ます。
See The Lexical Analyzer Function yylex
。
RPN(逆ポーランド記法)電卓には、簡単な字句解析器のみが必要です。
この字句解析器は、空白とタブを読み飛ばし、
数値を読み込んでdouble
型のNUM
トークンとして返します。
数値の一部分ではないその他の文字は、独立のトークンです。
1文字トークンのトークン符号はその文字自身であることに注意してください。
字句解析関数の戻り値は、トークン型を表す数値です。
Bison規則の中でトークン型を表すために使われる文字列と同じものが、
その型の数値符号を表すCの式でもあります。
これには、2種類の働きがあります。
もし、トークン型が文字リテラルならば、
その数値符号は文字のASCII符号であり、
数値を表すために字句解析器の中と同じ文字リテラルを使えます。
もし、トークン型が識別子ならば、適切な番号を定義するCのマクロとして、
その識別子がBisonによって定義されます。
したがって、この例では、NUM
は、yylex
のために使える
マクロにもなります。
トークンの意味値は、もし存在すれば、大域変数yylval
に記憶され、
Bison構文解析器はそこを見にいきます
(yylval
のCデータ型は、文法の最初で定義されるYYSTYPE
です。
see Declarations for rpcalc
)。
ファイルの終わりに達すると、トークン型のコード0が返されます (Bisonは、正でない任意の値を入力の終わりと認識します)。
字句解析器のプログラムの例を示します。
/* * 字句解析器は、数値を読めば、double型の値をスタックに積んで * トークン「NUM」を返し、数値以外を読めば、その文字のアスキー符号を返す。 * 空白とタブは読み飛ばされる。ファイルが終わると0を返す。 */ #include <ctype.h> yylex () { int c; /* 空白類を読み飛ばす */ while ((c = getchar ()) == ' ' || c == '\t') ; /* 数値を処理する */ if (c == '.' || isdigit (c)) { ungetc (c, stdin); scanf ("%lf", &yylval); return NUM; } /* ファイルの終わりを処理する */ if (c == EOF) return 0; /* 1文字を返す */ return c; }