{ module Main where import Char } %name myparser %tokentype { Token } %token '+' { TokenPlus } '*' { TokenTimes } 'a' { TokenA } '(' { TokenOB } ')' { TokenCB } %left '+' %left '*' %% Exp : Exp '+' Exp { Plus $1 $3 } | Exp '*' Exp { Times $1 $3 } | '(' Exp ')' { Brack $2 } | 'a' { Id } { happyError :: [Token] -> a happyError inp = error ("Parse error " ++ concatMap show inp) data Exp = Plus Exp Exp | Times Exp Exp | Brack Exp | Id deriving Show data Token = TokenA | TokenPlus | TokenTimes | TokenOB | TokenCB deriving Show lexer :: String -> [Token] lexer [] = [] lexer (c:cs) | isSpace c = lexer cs lexer ('a':cs) = TokenA : lexer cs lexer ('+':cs) = TokenPlus : lexer cs lexer ('*':cs) = TokenTimes : lexer cs lexer ('(':cs) = TokenOB : lexer cs lexer (')':cs) = TokenCB : lexer cs test = myparser . lexer }