Previous: Explanation of line
, Up: Grammar Rules for rpcalc
[Contents][Index]
exp
The exp
grouping has several rules, one for each kind of expression.
The first rule handles the simplest expressions: those that are just
numbers. The second handles an addition-expression, which looks like two
expressions followed by a plus-sign. The third handles subtraction, and so
on.
exp: NUM | exp exp '+' { $$ = $1 + $2; } | exp exp '-' { $$ = $1 - $2; } … ;
We have used ‘|’ to join all the rules for exp
, but we could
equally well have written them separately:
exp: NUM; exp: exp exp '+' { $$ = $1 + $2; }; exp: exp exp '-' { $$ = $1 - $2; }; …
Most of the rules have actions that compute the value of the expression in
terms of the value of its parts. For example, in the rule for addition,
$1
refers to the first component exp
and $2
refers to
the second one. The third component, '+'
, has no meaningful
associated semantic value, but if it had one you could refer to it as
$3
. The first rule relies on the implicit default action: ‘{
$$ = $1; }’.
When yyparse
recognizes a sum expression using this rule, the sum of
the two subexpressions’ values is produced as the value of the entire
expression. See Actions.
You don’t have to give an action for every rule. When a rule has no action,
Bison by default copies the value of $1
into $$
. This is what
happens in the first rule (the one that uses NUM
).
The formatting shown here is the recommended convention, but Bison does not require it. You can add or change white space as much as you wish. For example, this:
exp: NUM | exp exp '+' {$$ = $1 + $2; } | … ;
means the same thing as this:
exp: NUM | exp exp '+' { $$ = $1 + $2; } | … ;
The latter, however, is much more readable.
Previous: Explanation of line
, Up: Grammar Rules for rpcalc
[Contents][Index]