[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
2.1.2 Grammar Rules for rpcalc
Here are the grammar rules for the reverse polish notation calculator.
input: /* empty */ | 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; } /* Exponentiation */ | exp exp '^' { $$ = pow ($1, $2); } /* Unary minus */ | exp 'n' { $$ = -$1; } ; %% |
The groupings of the rpcalc “language” defined here are the expression
(given the name exp
), the line of input (line
), and the
complete input transcript (input
). Each of these nonterminal
symbols has several alternate rules, joined by the vertical bar ‘|’
which is read as “or”. The following sections explain what these rules
mean.
The semantics of the language is determined by the actions taken when a grouping is recognized. The actions are the C code that appears inside braces. See section Actions.
You must specify these actions in C, but Bison provides the means for
passing semantic values between the rules. In each action, the
pseudo-variable $$
stands for the semantic value for the grouping
that the rule is going to construct. Assigning a value to $$
is the
main job of most actions. The semantic values of the components of the
rule are referred to as $1
, $2
, and so on.
2.1.2.1 Explanation of input | ||
2.1.2.2 Explanation of line | ||
2.1.2.3 Explanation of expr |