1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
An em(optional) series of elements also use left-recursion, but the single
element alternative remains empty. For example, in bf(C++) a compound
statement may contain statements or declarations, but it may also be empty:
verb(
opt_statements:
// empty
|
opt_statements statements
)
The above rule can be used as a prototype for recognizing a series of
elements: the generic form of this rule could be formulated as follows:
verb(
opt_series:
// empty
|
opt_series unit
)
Note that the empty element is recognized em(first), even though it is
empty, whereafter the left-recursive alternative may be recognized repeatedly.
In practice this means that an em(action block) may be defined at the empty
alternative, which is then executed prior to the left-recursive
alternative. Such an action block could be used to perform initializations
necessary for the proper handling of the left-recursive alternative.
|