次: , 前: Rpcalc Decls, 上: RPN Calc


2.1.2 rpcalcのための文法規則

逆ポーランド記法電卓のための文法規則を示します。

     input:    /* 空 */
             | input line
     ;
     
     line:     '\n'
             | exp '\n'  { printf ("\t%.10g\n", $1); }
     ;
     
     exp:      NUM             { $$ = $1;         }
             | exp exp '+'     { $$ = $1 + $2;    }
             | exp exp '-'     { $$ = $1 - $2;    }
             | exp exp '*'     { $$ = $1 * $2;    }
             | exp exp '/'     { $$ = $1 / $2;    }
           /* べき乗関数 */
             | exp exp '^'     { $$ = pow ($1, $2); }
           /* 単項のマイナス    */
             | exp 'n'         { $$ = -$1;        }
     ;
     %%

ここで定義されるrpcalc「言語」のグループは、 式(exp)と、入力行(line)と、 完全な入力の写し(input)です。 これらの非終端記号には、「論理和」という`|'記号で区切られた、 いくつかの規則があります。 以下の項で、これらの規則の意味を説明します。

言語の意味は、グループが認識されたときのアクションによって決まります。 アクションとは、ブレースで囲まれたCのプログラムです。 See Actions

これらのアクションをCで書く必要がありますが、 Bisonには規則の間で意味値を受け渡しする方法があります。 それぞれのアクションで、擬似変数$$は、 その規則が構成しようとしているグループの意味値を示します。 $$に値を代入することが、アクションの主な仕事です。 規則の部品の意味値は、$1$2などの 名前で参照されます。