Next: Mfcalc Rules, Up: Multi-function Calc [Contents][Index]
mfcalcHere are the C and Bison declarations for the multi-function calculator.
%{
#include <stdio.h> /* For printf, etc. */
#include <math.h> /* For pow, used in the grammar. */
#include "calc.h" /* Contains definition of 'symrec'. */
int yylex (void);
void yyerror (char const *);
%}
%define api.value.type union /* Generate YYSTYPE from these types: */ %token <double> NUM /* Double precision number. */ %token <symrec*> VAR FUN /* Symbol table pointer: variable/function. */ %nterm <double> exp
%precedence '=' %left '-' '+' %left '*' '/' %precedence NEG /* negation--unary minus */ %right '^' /* exponentiation */
The above grammar introduces only two new features of the Bison language. These features allow semantic values to have various data types (see More Than One Value Type).
The special union value assigned to the %define variable
api.value.type specifies that the symbols are defined with their data
types. Bison will generate an appropriate definition of YYSTYPE to
store these values.
Since values can now have various types, it is necessary to associate a type
with each grammar symbol whose semantic value is used. These symbols are
NUM, VAR, FUN, and exp. Their declarations are
augmented with their data type (placed between angle brackets). For
instance, values of NUM are stored in double.
The Bison construct %nterm is used for declaring nonterminal symbols,
just as %token is used for declaring token types. Previously we did
not use %nterm before because nonterminal symbols are normally
declared implicitly by the rules that define them. But exp must be
declared explicitly so we can specify its value type. See Nonterminal Symbols.