X-Git-Url: http://git.tomasm.cz/fp.git/blobdiff_plain/28fcab78ad1b6c3f56708f38fbc74457ae36479a..HEAD:/src/HM/Parser.hs diff --git a/src/HM/Parser.hs b/src/HM/Parser.hs index 47c4649..8b5575d 100644 --- a/src/HM/Parser.hs +++ b/src/HM/Parser.hs @@ -11,9 +11,10 @@ -- -- Parser for Hindley-Milner terms and types. -module HM.Parser +module HM.Parser ( tRead - , parseTerm + , parseTypedTerm + , parseVar ) where import Data.Char (isAsciiLower, isAsciiUpper) @@ -43,10 +44,14 @@ instance Show Term where show (App a (NTTerm (App b c))) = show a ++ " " ++ braced ( show (App b c)) show (App t r) = show t ++ " " ++ show r show (Let x e1 e2) = braced $ "LET " ++ x ++ " = " ++ show e1 ++ " IN " ++ show e2 + show (Lit (LInt x)) = show x + show (Lit (LBool x)) = show x + show (Lit (LFunc x)) = show x instance Show TypedTerm where show (NTTerm t) = show t - show (TTerm t tp) = braced $ show t ++ " :: " ++ show tp + show (TTerm (Var x) tp) = x ++ " :: " ++ show tp + show (TTerm t tp) = braced (show t) ++ " :: " ++ show tp instance Show Type where show (Primitive t) = t @@ -64,13 +69,17 @@ tRead s = case parseOnly (parseTypedTerm <* endOfInput) (T.pack s) of parseTerm :: Parser Term parseTerm = parseLet <|> + parseLambda <|> parseApp <|> - parseVar <|> - parseLambda + parseBraces parseTerm <|> + parseLit <|> + parseVar parseTermNoApp :: Parser Term -parseTermNoApp = parseLet <|> +parseTermNoApp = parseBraces parseTerm <|> + parseLet <|> parseVar <|> + parseLit <|> parseLambda parseTypeAndTerm :: Parser Term -> Parser TypedTerm @@ -87,20 +96,21 @@ parseTypedTermNoApp = parseBraces parseTypedTerm <|> (NTTerm <$> parseTermNoApp) parseTypedTerm :: Parser TypedTerm -parseTypedTerm = parseBraces parseTypedTerm <|> - parseTypeAndTerm parseTerm <|> - (NTTerm <$> parseTerm) +parseTypedTerm = parseTypeAndTerm parseTerm <|> + (NTTerm <$> parseTerm) <|> + parseBraces parseTypedTerm parseType :: Parser Type -parseType = parseBraces parseType <|> +parseType = parseType <|> parseTypeFunction <|> parsePrimitive <|> parseTypeVar parsePrimitive :: Parser Type parsePrimitive = do - x <- many1 $ satisfy isAsciiUpper - return $! Primitive x + x <- satisfy isAsciiUpper + xs <- many letter + return $! Primitive (x:xs) parseTypeVar :: Parser Type parseTypeVar = do @@ -149,6 +159,25 @@ parseVar = do x <- many1 $ satisfy isAsciiLower return $! Var x +parseLit :: Parser Term +parseLit = do + x <- parseLInt <|> parseLBool <|> parseLFun + return $! Lit x + +parseLFun :: Parser Literal +parseLFun = + (string "If" >> return (LFunc If)) + +parseLBool :: Parser Literal +parseLBool = + (string "True" >> return (LBool True)) <|> + (string "False" >> return (LBool False)) + +parseLInt :: Parser Literal +parseLInt = do + x <- decimal + return $! LInt x + parseLambda :: Parser Term parseLambda = do char '\\' <|> char 'λ' <|> char 'L'