[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
2.5.1 Declarations for 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'. */ int yylex (void); void yyerror (char const *); %} %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 */ %% /* The 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 section 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 section 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 section Nonterminal Symbols.