Next: Location Default Action, Previous: Location Type, Up: Tracking Locations [Contents][Index]
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
@$
.
In addition, the named references construct @name
and
@[name]
may also be used to address the symbol locations.
See Named References, for more information about using the named
references construct.
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; fprintf (stderr, "%d.%d-%d.%d: division by zero", @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; fprintf (stderr, "%d.%d-%d.%d: division by zero", @3.first_line, @3.first_column, @3.last_line, @3.last_column); } }
It is also possible to access the location of the lookahead token, if any,
from a semantic action.
This location is stored in yylloc
.
See Special Features for Use in Actions.
Next: Location Default Action, Previous: Location Type, Up: Tracking Locations [Contents][Index]