GNU Info

Info Node: (bison.info)Actions and Locations

(bison.info)Actions and Locations


Next: Location Default Action Prev: Location Type Up: Locations
Enter node , (file) or (file)node

Actions and Locations
---------------------

   Actions are not only useful for defining language semantics, but
also for describing the behavior of the output parser with locations.

   The most obvious way for building locations of syntactic groupings
is very similar to the way semantic values are computed. In a given
rule, several constructs can be used to access the locations of the
elements being matched.  The location of the Nth component of the right
hand side is `@N', while the location of the left hand side grouping is
`@$'.

   Here is a basic example using the default data type for locations:

     exp:    ...
             | exp '/' exp
                 {
                   @$.first_column = @1.first_column;
                   @$.first_line = @1.first_line;
                   @$.last_column = @3.last_column;
                   @$.last_line = @3.last_line;
                   if ($3)
                     $$ = $1 / $3;
                   else
                     {
                       $$ = 1;
                       printf("Division by zero, l%d,c%d-l%d,c%d",
                              @3.first_line, @3.first_column,
                              @3.last_line, @3.last_column);
                     }
                 }

   As for semantic values, there is a default action for locations that
is run each time a rule is matched. It sets the beginning of `@$' to the
beginning of the first symbol, and the end of `@$' to the end of the
last symbol.

   With this default action, the location tracking can be fully
automatic. The example above simply rewrites this way:

     exp:    ...
             | exp '/' exp
                 {
                   if ($3)
                     $$ = $1 / $3;
                   else
                     {
                       $$ = 1;
                       printf("Division by zero, l%d,c%d-l%d,c%d",
                              @3.first_line, @3.first_column,
                              @3.last_line, @3.last_column);
                     }
                 }


automatically generated by info2www version 1.2.2.9