Document named references.

* doc/bison.texinfo (Actions): Add new example and xref to
	Using Named References node.
	(Using Named References): New node.
This commit is contained in:
Alex Rozenman
2009-11-14 22:06:26 +02:00
parent aa01d1934c
commit 1f68dca514
2 changed files with 146 additions and 3 deletions

View File

@@ -1,3 +1,10 @@
2009-10-03 Alex Rozenman <rozenman@gmail.com>
Document named references.
* doc/bison.texinfo (Actions): Add new example and xref to
Using Named References node.
(Using Named References): New node.
2009-10-16 Joel E. Denny <jdenny@clemson.edu> 2009-10-16 Joel E. Denny <jdenny@clemson.edu>
cleanup. cleanup.

View File

@@ -206,6 +206,7 @@ Defining Language Semantics
* Mid-Rule Actions:: Most actions go at the end of a rule. * Mid-Rule Actions:: Most actions go at the end of a rule.
This says when, why and how to use the exceptional This says when, why and how to use the exceptional
action in the middle of a rule. action in the middle of a rule.
* Named References:: Using named references in actions.
Tracking Locations Tracking Locations
@@ -3365,6 +3366,7 @@ the numbers associated with @var{x} and @var{y}.
* Mid-Rule Actions:: Most actions go at the end of a rule. * Mid-Rule Actions:: Most actions go at the end of a rule.
This says when, why and how to use the exceptional This says when, why and how to use the exceptional
action in the middle of a rule. action in the middle of a rule.
* Named References:: Using named references in actions.
@end menu @end menu
@node Value Type @node Value Type
@@ -3426,6 +3428,8 @@ Decl, ,Nonterminal Symbols}).
@cindex action @cindex action
@vindex $$ @vindex $$
@vindex $@var{n} @vindex $@var{n}
@vindex $@var{name}
@vindex $[@var{name}]
An action accompanies a syntactic rule and contains C code to be executed An action accompanies a syntactic rule and contains C code to be executed
each time an instance of that rule is recognized. The task of most actions each time an instance of that rule is recognized. The task of most actions
@@ -3442,9 +3446,12 @@ Actions, ,Actions in Mid-Rule}).
The C code in an action can refer to the semantic values of the components The C code in an action can refer to the semantic values of the components
matched by the rule with the construct @code{$@var{n}}, which stands for matched by the rule with the construct @code{$@var{n}}, which stands for
the value of the @var{n}th component. The semantic value for the grouping the value of the @var{n}th component. The semantic value for the grouping
being constructed is @code{$$}. Bison translates both of these being constructed is @code{$$}. In addition, the semantic values of
symbols can be accessed with the named references construct
@code{$@var{name}} or @code{$[@var{name}]}. Bison translates both of these
constructs into expressions of the appropriate type when it copies the constructs into expressions of the appropriate type when it copies the
actions into the parser file. @code{$$} is translated to a modifiable actions into the parser file. @code{$$} (or @code{$@var{name}}, when it
stands for the current grouping) is translated to a modifiable
lvalue, so it can be assigned to. lvalue, so it can be assigned to.
Here is a typical example: Here is a typical example:
@@ -3457,16 +3464,31 @@ exp: @dots{}
@end group @end group
@end example @end example
Or, in terms of named references:
@example
@group
exp[result]: @dots{}
| exp[left] '+' exp[right]
@{ $result = $left + $right; @}
@end group
@end example
@noindent @noindent
This rule constructs an @code{exp} from two smaller @code{exp} groupings This rule constructs an @code{exp} from two smaller @code{exp} groupings
connected by a plus-sign token. In the action, @code{$1} and @code{$3} connected by a plus-sign token. In the action, @code{$1} and @code{$3}
(@code{$left} and @code{$right})
refer to the semantic values of the two component @code{exp} groupings, refer to the semantic values of the two component @code{exp} groupings,
which are the first and third symbols on the right hand side of the rule. which are the first and third symbols on the right hand side of the rule.
The sum is stored into @code{$$} so that it becomes the semantic value of The sum is stored into @code{$$} (@code{$result}) so that it becomes the
semantic value of
the addition-expression just recognized by the rule. If there were a the addition-expression just recognized by the rule. If there were a
useful semantic value associated with the @samp{+} token, it could be useful semantic value associated with the @samp{+} token, it could be
referred to as @code{$2}. referred to as @code{$2}.
@xref{Named References,,Using Named References}, for more information
about using the named references construct.
Note that the vertical-bar character @samp{|} is really a rule Note that the vertical-bar character @samp{|} is really a rule
separator, and actions are attached to a single rule. This is a separator, and actions are attached to a single rule. This is a
difference with tools like Flex, for which @samp{|} stands for either difference with tools like Flex, for which @samp{|} stands for either
@@ -3761,6 +3783,93 @@ compound: subroutine
Now Bison can execute the action in the rule for @code{subroutine} without Now Bison can execute the action in the rule for @code{subroutine} without
deciding which rule for @code{compound} it will eventually use. deciding which rule for @code{compound} it will eventually use.
@node Named References
@subsection Using Named References
@cindex named references
While every semantic value can be accessed with positional references
@code{$@var{n}} and @code{$$}, it's often much more convenient to refer to
them by name. First of all, original symbol names may be used as named
references. For example:
@example
@group
invocation: op '(' args ')'
@{ $invocation = new_invocation ($op, $args, @@invocation); @}
@end group
@end example
@noindent
The positional @code{$$}, @code{@@$}, @code{$n}, and @code{@@n} can be
mixed with @code{$name} and @code{@@name} arbitrarily. For example:
@example
@group
invocation: op '(' args ')'
@{ $$ = new_invocation ($op, $args, @@$); @}
@end group
@end example
@noindent
However, sometimes regular symbol names are not sufficient due to
ambiguities:
@example
@group
exp: exp '/' exp
@{ $exp = $exp / $exp; @} // $exp is ambiguous.
exp: exp '/' exp
@{ $$ = $1 / $exp; @} // One usage is ambiguous.
exp: exp '/' exp
@{ $$ = $1 / $3; @} // No error.
@end group
@end example
@noindent
When ambiguity occurs, explicitly declared names may be used for values and
locations. Explicit names are declared as a bracketed name after a symbol
appearance in rule definitions. For example:
@example
@group
exp[result]: exp[left] '/' exp[right]
@{ $result = $left / $right; @}
@end group
@end example
@noindent
Explicit names may be declared for RHS and for LHS symbols as well. In order
to access a semantic value generated by a mid-rule action, an explicit name
may also be declared by putting a bracketed name after the closing brace of
the mid-rule action code:
@example
@group
exp[res]: exp[x] '+' @{$left = $x;@}[left] exp[right]
@{ $res = $left + $right; @}
@end group
@end example
@noindent
In references, in order to specify names containing dots and dashes, an explicit
bracketed syntax @code{$[name]} and @code{@@[name]} must be used:
@example
@group
if-stmt: IF '(' expr ')' THEN then.stmt ';'
@{ $[if-stmt] = new_if_stmt ($expr, $[then.stmt]); @}
@end group
@end example
It often happens that named references are followed by a dot, dash or other
C punctuation marks and operators. By default, Bison will read
@code{$name.suffix} as a reference to symbol value @code{$name} followed by
@samp{.suffix}, i.e., an access to the @samp{suffix} field of the semantic
value. In order to force Bison to recognize @code{name.suffix} in its entirety
as the name of a semantic value, bracketed syntax @code{$[name.suffix]}
must be used.
@node Locations @node Locations
@section Tracking Locations @section Tracking Locations
@cindex location @cindex location
@@ -3816,6 +3925,8 @@ Action Decl, , Performing Actions before Parsing}.
@cindex actions, location @cindex actions, location
@vindex @@$ @vindex @@$
@vindex @@@var{n} @vindex @@@var{n}
@vindex @@@var{name}
@vindex @@[@var{name}]
Actions are not only useful for defining language semantics, but also for Actions are not only useful for defining language semantics, but also for
describing the behavior of the output parser with locations. describing the behavior of the output parser with locations.
@@ -3827,6 +3938,11 @@ The location of the @var{n}th component of the right hand side is
@code{@@@var{n}}, while the location of the left hand side grouping is @code{@@@var{n}}, while the location of the left hand side grouping is
@code{@@$}. @code{@@$}.
In addition, the named references construct @code{@@@var{name}} and
@code{@@[@var{name}]} may also be used to address the symbol locations.
@xref{Named References,,Using Named References}, for more information
about using the named references construct.
Here is a basic example using the default data type for locations: Here is a basic example using the default data type for locations:
@example @example
@@ -9889,6 +10005,16 @@ In an action, the location of the @var{n}-th symbol of the right-hand
side of the rule. @xref{Locations, , Locations Overview}. side of the rule. @xref{Locations, , Locations Overview}.
@end deffn @end deffn
@deffn {Variable} @@@var{name}
In an action, the location of a symbol addressed by name.
@xref{Locations, , Locations Overview}.
@end deffn
@deffn {Variable} @@[@var{name}]
In an action, the location of a symbol addressed by name.
@xref{Locations, , Locations Overview}.
@end deffn
@deffn {Variable} $$ @deffn {Variable} $$
In an action, the semantic value of the left-hand side of the rule. In an action, the semantic value of the left-hand side of the rule.
@xref{Actions}. @xref{Actions}.
@@ -9899,6 +10025,16 @@ In an action, the semantic value of the @var{n}-th symbol of the
right-hand side of the rule. @xref{Actions}. right-hand side of the rule. @xref{Actions}.
@end deffn @end deffn
@deffn {Variable} $@var{name}
In an action, the semantic value of a symbol addressed by name.
@xref{Actions}.
@end deffn
@deffn {Variable} $[@var{name}]
In an action, the semantic value of a symbol addressed by name.
@xref{Actions}.
@end deffn
@deffn {Delimiter} %% @deffn {Delimiter} %%
Delimiter used to separate the grammar rule section from the Delimiter used to separate the grammar rule section from the
Bison declarations section or the epilogue. Bison declarations section or the epilogue.