parser-c 0.3.0

Macros for parser-c.
Documentation
This parser parses the contents of the attribute grammar
into a list of rules.  A rule can either be an assignment
to an attribute of the LHS (synthesized attribute), and 
assignment to an attribute of the RHS (an inherited attribute),
or a conditional statement.

> {
> {-# OPTIONS_GHC -w #-}
> module AttrGrammarParser (agParser) where
> import ParseMonad
> import AttrGrammar
> }

> %name agParser
> %tokentype { AgToken }
> %token
>   "{"       { AgTok_LBrace }
>   "}"       { AgTok_RBrace }
>   ";"       { AgTok_Semicolon }
>   "="       { AgTok_Eq }
>   where     { AgTok_Where }
>   selfRef   { AgTok_SelfRef _ }
>   subRef    { AgTok_SubRef _ }
>   rightRef  { AgTok_RightmostRef _ }
>   unknown   { AgTok_Unknown _ }
>
> %monad { P }
> %lexer { agLexer } { AgTok_EOF }

> %%

> agParser :: { [AgRule] }
>   : rules                                      { $1 }

> rules :: { [AgRule] }
>   : rule ";" rules                             { $1 : $3 }
>   | rule                                       { $1 : [] }
>   |                                            { [] }

> rule :: { AgRule }
>   : selfRef  "=" code                          { SelfAssign (selfRefVal $1) $3 }
>   | subRef   "=" code                          { SubAssign (subRefVal $1) $3 }
>   | rightRef "=" code                          { RightmostAssign (rightRefVal $1) $3 }
>   | where code                                 { Conditional $2 }

> code :: { [AgToken] }
>   : "{" code0 "}" code                         { [$1] ++ $2 ++ [$3] ++ $4 }
>   | "=" code                                   { $1 : $2 }
>   | selfRef code                               { $1 : $2 }
>   | subRef code                                { $1 : $2 }
>   | rightRef code                              { $1 : $2 }
>   | unknown code                               { $1 : $2 }
>   |                                            { [] }

> code0 :: { [AgToken] }
>   : "{" code0 "}" code0                        { [$1] ++ $2 ++ [$3] ++ $4 }
>   | "=" code0                                  { $1 : $2 }
>   | ";" code0                                  { $1 : $2 }
>   | selfRef code0                              { $1 : $2 }
>   | subRef code0                               { $1 : $2 }
>   | rightRef code                              { $1 : $2 }
>   | unknown code0                              { $1 : $2 }
>   |                                            { [] }

> {
> happyError :: P a
> happyError = fail ("Parse error\n")
> }