Next: Bison style, Up: Grammar styles [Contents][Index]

#### 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 (see 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.

Next: Bison style, Up: Grammar styles [Contents][Index]