Action code and return types
Action code
Action code is normal Rust code with the addition of the following special variables:
-
$1
...$n
refer to the respective symbol in the production, numbered from 1 (i.e.$1
refers to the first symbol in the production). If the symbol references a ruleR
then an instance ofR
's type will be stored in the$i
variable; if the symbol references a lexeme then anOption<Lexeme>
instance is returned. -
$lexer
allows access to the lexer and its various functions. The most commonly used of these is thespan_str
function, which allows us to extract&'input str
s from aSpan
(e.g. to extract the string represented by aLexeme
, we would use$lexer.span_str(lexeme.span())
). As this may suggest, actions may also reference the special lifetime'input
(without any$
prefix), which allows strings to be returned / stored by the grammar without copying memory. -
$span
is alrpar::Span
tuple (with both elements of typeusize
) which captures how much of the user's input the current production matched. -
$$
is equivalent to$
in normal Rust code.
Any other variables beginning with $
are treated as errors.
Return types
Productions' return types can be any arbitrary Rust type. You may in addition make use of the following:
-
The generic parameter
StorageT
references the type of lexemes and is typically used with theLexeme
type i.e.Lexeme<StorageT>
. This allows you to return lexemes from rules. -
The lifetime
'input
allows you to extract strings whose lifetime is tied to the lexer and return them from rules / store them in structs without copying.Lexer::span_str
returns such strings and the typical idiom of use is&'input str
.