Action code and return types
Action code
Action code is normal Rust code with the addition of the following special variables:
-
$1...$nrefer to the respective symbol in the production, numbered from 1 (i.e.$1refers to the first symbol in the production). If the symbol references a ruleRthen an instance ofR's type will be stored in the$ivariable; if the symbol references a lexeme then anOption<Lexeme>instance is returned. -
$lexerallows access to the lexer and its various functions. The most commonly used of these is thespan_strfunction, which allows us to extract&'input strs 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. -
$spanis alrpar::Spantuple (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
StorageTreferences the type of lexemes and is typically used with theLexemetype i.e.Lexeme<StorageT>. This allows you to return lexemes from rules. -
The lifetime
'inputallows you to extract strings whose lifetime is tied to the lexer and return them from rules / store them in structs without copying.Lexer::span_strreturns such strings and the typical idiom of use is&'input str.