The grammar section comes after the directives, separated from them by a double-percent (%%) symbol. This section contains a number of productions, each of which defines a single non-terminal. Each production has the following syntax:
<non-terminal> [ :: { <type> } ] : <id> ... {[%] <expression> } [ | <id> ... {[%] <expression> } ... ] |
The first line gives the non-terminal to be defined by the production and optionally its type (type signatures for productions are discussed in Section 2.4).
Each production has at least one, and possibly many right-hand sides. Each right-hand side consists of zero or more symbols (terminals or non-terminals) and a Haskell expression enclosed in braces.
The expression represents the semantic value of the non-terminal, and may refer to the semantic values of the symbols in the right-hand side using the meta-variables $1 ... $n. It is an error to refer to $i when i is larger than the number of symbols on the right hand side of the current rule. The symbol $ may be inserted literally in the Haskell expression using the sequence \$ (this isn't necessary inside a string or character literal).
A semantic value of the form {% ... } is a monadic action, and is only valid when the grammar file contains a %monad directive (Section 4.3.4). Monadic actions are discussed in Section 2.5.
Remember that all the expressions for a production must have the same type.