Happy User Guide
Prev | Chapter 4. Syntax of Grammar Files | Next

# 4.4. Grammar

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).

Additionally, the sequence `$>` can be used to represent the value of the rightmost symbol.

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.

Prev | Home | Next
Directives | Up | Module Trailer