[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
2.1.1 Declarations for rpcalc
Here are the C and Bison declarations for the reverse polish notation calculator. As in C, comments are placed between ‘/*…*/’.
/* Reverse polish notation calculator. */ %{ #define YYSTYPE double #include <math.h> int yylex (void); void yyerror (char const *); %} %token NUM %% /* Grammar rules and actions follow. */ |
The declarations section (see section The prologue) contains two preprocessor directives and two forward declarations.
The #define
directive defines the macro YYSTYPE
, thus
specifying the C data type for semantic values of both tokens and
groupings (see section Data Types of Semantic Values). The
Bison parser will use whatever type YYSTYPE
is defined as; if you
don't define it, int
is the default. Because we specify
double
, each token and each expression has an associated value,
which is a floating point number.
The #include
directive is used to declare the exponentiation
function pow
.
The forward declarations for yylex
and yyerror
are
needed because the C language requires that functions be declared
before they are used. These functions will be defined in the
epilogue, but the parser calls them so they must be declared in the
prologue.
The second section, Bison declarations, provides information to Bison
about the token types (see section The Bison Declarations Section). Each terminal symbol that is not a
single-character literal must be declared here. (Single-character
literals normally don't need to be declared.) In this example, all the
arithmetic operators are designated by single-character literals, so the
only terminal symbol that needs to be declared is NUM
, the token
type for numeric constants.