Node:Mfcalc Decl, Next:Mfcalc Rules, Up:Multi-function Calc
mfcalc
Here are the C and Bison declarations for the multi-function calculator.
%{ #include <math.h> /* For math functions, cos(), sin(), etc. */ #include "calc.h" /* Contains definition of `symrec' */ %} %union { double val; /* For returning numbers. */ symrec *tptr; /* For returning symbol-table pointers */ } %token <val> NUM /* Simple double precision number */ %token <tptr> VAR FNCT /* Variable and Function */ %type <val> exp %right '=' %left '-' '+' %left '*' '/' %left NEG /* Negation--unary minus */ %right '^' /* Exponentiation */ /* Grammar follows */ %%
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 %union
declaration specifies the entire list of possible types;
this is instead of defining YYSTYPE
. The allowable types are now
double-floats (for exp
and NUM
) and pointers to entries in
the symbol table. See The Collection of Value Types.
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
, FNCT
, and exp
. Their
declarations are augmented with information about their data type (placed
between angle brackets).
The Bison construct %type
is used for declaring nonterminal symbols,
just as %token
is used for declaring token types. We have not used
%type
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.