-- An example demonstrating how to connect a Happy parser to an Alex lexer. { module Parse where import Lex import Term } %name parseExp Exp %name parseBinds binds %tokentype { Token } %monad { Either String } %token let { TLet } in { TIn } int { TInt $$ } var { TVar $$ } '->' { TArrow } '=' { TSym '=' } '+' { TSym '+' } '-' { TSym '-' } '*' { TSym '*' } '/' { TSym '/' } '(' { TSym '(' } ')' { TSym ')' } '\\' { TSym '\\' } ';' { TSym ';' } %% binds :: { [(VarId,Term)] } binds : {- empty -} { [] } | bind binds { $1 : $2 } bind :: { (VarId,Term) } bind : var '=' Exp ';' { ($1,$3) } Exp :: { Term } Exp : let var '=' Exp in Exp { Let $2 $4 $6 } | '\\' var '->' Exp { Abs $2 $4 } | Exp1 { $1 } Exp1 : Exp1 '+' Term { App (App (Var "+") $1) $3 } | Exp1 '-' Term { App (App (Var "-") $1) $3 } | Term { $1 } Term : Term '*' App { App (App (Var "*") $1) $3 } | Term '/' App { App (App (Var "/") $1) $3 } | App { $1 } App : App Atom { App $1 $2 } | Atom { $1 } Atom : int { Int $1 } | var { Var $1 } | '(' Exp ')' { $2 } { happyError :: [Token] -> Either String a happyError [] = Left "Parse error at end of input" happyError (tk:tks) = Left ("Parse error before " ++ show tk) }