wisent: Iterative style
4.1.1 Iterative style
---------------------
The “iterative style” is the preferred style to use with Semantic. It
relies on an iterative parser back-end mechanism which parses start
nonterminals one at a time and automagically skips unexpected lexical
tokens in input.
Compared to rule-based iterative functions (Bison style),
iterative parsers are better in that they can handle obscure errors more
cleanly.
Each start nonterminal must produces a “raw tag” by calling a
‘TAG’-like grammar macro with appropriate parameters. See also
Start nonterminals.
Then, each parsing iteration automatically translates a raw tag into
“expanded tags”, updating the raw tag structure with internal properties
and buffer related data.
After parsing completes, it results in a tree of expanded tags.
The following example is a snippet of the iterative style Java
grammar provided in the Semantic distribution in the file
‘semantic/wisent/java-tags.wy’.
...
;; Alternate entry points
;; - Needed by partial re-parse
%start formal_parameter
...
;; - Needed by EXPANDFULL clauses
%start formal_parameters
...
formal_parameter_list
: PAREN_BLOCK
(EXPANDFULL $1 formal_parameters)
;
formal_parameters
: LPAREN
()
| RPAREN
()
| formal_parameter COMMA
| formal_parameter RPAREN
;
formal_parameter
: formal_parameter_modifier_opt type variable_declarator_id
(VARIABLE-TAG $3 $2 nil :typemodifiers $1)
;
It shows the use of the ‘EXPANDFULL’ grammar macro to parse a
‘PAREN_BLOCK’ which contains a ‘formal_parameter_list’. ‘EXPANDFULL’
tells to recursively parse ‘formal_parameters’ inside ‘PAREN_BLOCK’.
The parser iterates until it digested all available input data inside
the ‘PAREN_BLOCK’, trying to match any of the ‘formal_parameters’ rules:
• ‘LPAREN’
• ‘RPAREN’
• ‘formal_parameter COMMA’
• ‘formal_parameter RPAREN’
At each iteration it will return a ‘formal_parameter’ raw tag, or
‘nil’ to skip unwanted (single ‘LPAREN’ or ‘RPAREN’ for example) or
unexpected input data. Those raw tags will be automatically expanded by
the iterative back-end parser.