{ module Main where import Char } %name myparser Exp %tokentype { Token } %token '+' { TokenPlus } '*' { TokenTimes } 'a' { TokenA } '(' { TokenOB } ')' { TokenCB } %% Exp : Exp '+' Term { Plus $1 $3 } | Term { Term $1 } Term : Term '*' Factor { Times $1 $3 } | Factor { Factor $1 } Factor : '(' Exp ')' { Brack $2 } | 'a' { Id } { happyError :: [Token] -> a happyError inp = error ("Parse error " ++ show inp) data Exp = Plus Exp Term | Term Term deriving Show data Term = Times Term Factor | Factor Factor deriving Show data Factor = Id | Brack Exp 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 }