次: , 上: Multi-function Calc


2.4.1 mfcalcのための定義

以下には、多機能電卓のための、CとBisonの宣言があります。

     %{
     #include <math.h>  /* cos(), sin()などの数学関数のため */
     #include "calc.h"  /* `symrec'の定義を含む             */
     %}
     %union {
     double     val;    /* 数値を返すため                   */
     symrec  *tptr;     /* 記号表へのポインタを返すため     */
     }
     
     %token <val>  NUM        /* 単純な倍精度数値 */
     %token <tptr> VAR FNCT   /* 変数と関数       */
     %type  <val>  exp
     
     %right '='
     %left '-' '+'
     %left '*' '/'
     %left NEG     /* 否定 -- 単項の負 */
     %right '^'    /* べき乗           */
     
     /* 文法が続く */
     
     %%

この文法の導入部分では、Bison言語の新しい2つの機能を使っています。 これらの機能によって、意味値がいろいろなデータ型を持てます (see More Than One Value Type)。

%union宣言は、YYSTYPEの定義の代わりで、 可能な型の一覧を指定します。 ここで許される型は、(expNUMのための)倍精度浮動小数点型と、 記号表の項目へのポインタです。 See The Collection of Value Types

値がいろいろな型を持つことができるので、 意味値を使うそれぞれの文法記号に対して、 型を関連づける必要があります。 これらの記号はNUMVARFNCTexpです。 それらの宣言は、不等号で囲まれた(`<...>')データ型に関する 情報を付加されています。

Bisonは、ちょうど%tokenがトークン型の宣言に使われるのと同じように、 %typeが非終端記号の宣言に使われるようにします。 非終端記号は通常それらを定義する規則によって暗黙に宣言されるので、 %typeをその規則よりも先に使ってはいけません。 しかし、expは、その値の型を指定するので、 明示的に宣言する必要があります。 See Nonterminal Symbols