{- Title: Expression Parser Using Recursive Descent Author; Robin Cockett Date 10 Jan 2006 -} module Main where import Text.ParserCombinators.Parsec import Exlexer -- output type from parser data Exp = Add Exp Exp | Mul Exp Exp | Num Integer deriving (Show,Eq) {- Grammar: expr -> term expr1 expr1 -> ADD expr | term -> factor term1 term1 -> MUL term | factor -> '(' expr ')' | NUM -} -- recursive descent parser beside grammar -- expr -> term expr1 expr input = expr1 (term input) -- expr1 -> ADD expr expr1 ((_,ADD):input) = expr input -- expr1 -> expr1 input = input -- term -> factor term1 term input = term1 (factor input) -- term1 -> MUL term term1 ((_,MUL):input) = term input -- term1 -> term1 input = input -- factor -> '(' expr ')' factor ((_,LPAR):input) = case (expr input) of (_,RPAR):rest -> rest -- factor -> NUM factor ((_,NUM n):input) = input -- function for running a parsers rn:: GenParser a () b -> [a] ->b rn p input = case (parse p "" input) of Left err -> error ("parse error at "++(show err)) Right x -> x parse input = expr (rn lexer input)