{-# OPTIONS_GHC -fglasgow-exts #-} module PIL.Parser (parse) where import PIL.Val import PIL.Exp import PIL.Pad import PIL.Monads import PIL.Internals import Pugs.Rule hiding (parse) import Control.Monad.Identity type RuleParser a = GenParser Char RuleState a type RuleState = () type Parse = IO -- Parsing needs to handle BEGIN and such. parse :: String -> Parse Exp parse src = case ( runParser ruleProgram () "-" src ) of Left err -> fail (show err) Right exp -> return exp ruleProgram :: RuleParser Exp ruleProgram = ruleExp `fin` eof ruleExp :: RuleParser Exp ruleExp = choice [ ruleApp , ruleLit ] ruleApp :: RuleParser Exp ruleApp = do s <- ruleSymBare spaces e <- ruleExp return $ App (Var s) e ruleSymBare :: RuleParser Sym ruleSymBare = do x <- letter xs <- many alphaNum mkSym ('&':x:xs) ruleLit :: RuleParser Exp ruleLit = do i <- many1 digit return . Lit . Item . Int . read $ i