module Example where import Control.Applicative import Data.Maybe import Text.Parsec.Applicative import Text.Parsec.Applicative.BNF data TT = TTInt | TTPlus | TTMult | TTLP | TTRP deriving (Eq, Enum, Bounded) instance Show TT where showsPrec _ TTInt = ("INT" ++) showsPrec _ TTPlus = ("'+'" ++) showsPrec _ TTMult = ("'*'" ++) showsPrec _ TTLP = ("'('" ++) showsPrec _ TTRP = ("')'" ++) type TD = Maybe Integer data Expr = Mult Expr Expr | Plus Expr Expr | Lit Integer deriving (Show) lit = label "lit" $ Lit . fromJust . snd <$> token TTInt factor = label "factor" $ f <$> lit <*> optional (token TTMult *> factor) where f e Nothing = e f e1 (Just e2) = Mult e1 e2 expr = label "expr" $ f <$> factor <*> optional (token TTPlus *> expr) <|> token TTLP *> expr <* token TTRP where f e Nothing = e f e1 (Just e2) = Plus e1 e2 bnf = parserToBNF expr