Node:Action Types, Next:Mid-Rule Actions, Previous:Actions, Up:Semantics
If you have chosen a single data type for semantic values, the $$
and $n constructs always have that data type.
If you have used %union to specify a variety of data types, then you
must declare a choice among these types for each terminal or nonterminal
symbol that can have a semantic value.  Then each time you use $$ or
$n, its data type is determined by which symbol it refers to
in the rule.  In this example,
exp:    ...
        | exp '+' exp
            { $$ = $1 + $3; }
$1 and $3 refer to instances of exp, so they all
have the data type declared for the nonterminal symbol exp.  If
$2 were used, it would have the data type declared for the
terminal symbol '+', whatever that might be.
Alternatively, you can specify the data type when you refer to the value,
by inserting <type> after the $ at the beginning of the
reference.  For example, if you have defined types as shown here:
%union {
  int itype;
  double dtype;
}
then you can write $<itype>1 to refer to the first subunit of the
rule as an integer, or $<dtype>1 to refer to it as a double.