@@ -5,6 +5,7 @@ module Core.CoreParser(parseTerm, parseFile, parseDef, pTerm, iName) where
5import Core.TT
5import Core.TT
7import Text.ParserCombinators.Parsec
7import Text.ParserCombinators.Parsec
8+import Text.Parsec.Prim(Parsec)
8import Text.ParserCombinators.Parsec.Expr
9import Text.ParserCombinators.Parsec.Expr
9import Text.ParserCombinators.Parsec.Language
10import Text.ParserCombinators.Parsec.Language
10import qualified Text.ParserCombinators.Parsec.Token as PTok
11import qualified Text.ParserCombinators.Parsec.Token as PTok
@@ -13,7 +14,7 @@ import Debug.Trace
14type TokenParser a = PTok.TokenParser a
15type TokenParser a = PTok.TokenParser a
16−lexer :: TokenParser ()
17+lexer :: TokenParser a
17lexer = PTok.makeTokenParser haskellDef
18lexer = PTok.makeTokenParser haskellDef
19whiteSpace= PTok.whiteSpace lexer
20whiteSpace= PTok.whiteSpace lexer
@@ -29,18 +30,21 @@ operator = PTok.operator lexer
29reservedOp= PTok.reservedOp lexer
30reservedOp= PTok.reservedOp lexer
30lchar = lexeme.char
31lchar = lexeme.char
32−parseFile = parse pTestFile "(input)"
33+type CParser a = Parsec String a
33−parseDef = parse pDef "(input)"
34−parseTerm = parse pTerm "(input)"
35+parseFile = runParser pTestFile () "(input)"
36+parseDef = runParser pDef () "(input)"
37+parseTerm = runParser pTerm () "(input)"
36−pTestFile :: Parser RProgram
39+pTestFile :: CParser a RProgram
37pTestFile = do p <- many1 pDef ; eof
40pTestFile = do p <- many1 pDef ; eof
40−iName :: Parser Name
43+iName :: CParser a Name
41−iName = identifier >>= (\n -> return (UN [n]))
44+iName = do x <- identifier
43−pDef :: Parser (Name, RDef)
47+pDef :: CParser a (Name, RDef)
44pDef = try (do x <- iName; lchar ':'; ty <- pTerm
48pDef = try (do x <- iName; lchar ':'; ty <- pTerm
46 tm <- pTerm
50 tm <- pTerm
@@ -51,20 +55,20 @@ pDef = try (do x <- iName; lchar ':'; ty <- pTerm
51 <|> do (x, d) <- pData; lchar ';'
55 <|> do (x, d) <- pData; lchar ';'
52 return (x, RData d)
56 return (x, RData d)
54−app :: Parser (Raw -> Raw -> Raw)
58+app :: CParser a (Raw -> Raw -> Raw)
55app = do whiteSpace ; return RApp
59app = do whiteSpace ; return RApp
57−arrow :: Parser (Raw -> Raw -> Raw)
61+arrow :: CParser a (Raw -> Raw -> Raw)
58arrow = do symbol "->" ; return $ \s t -> RBind (MN 0 "X") (Pi s) t
62arrow = do symbol "->" ; return $ \s t -> RBind (MN 0 "X") (Pi s) t
60−pTerm :: Parser Raw
64+pTerm :: CParser a Raw
61pTerm = try (do chainl1 pNoApp app)
65pTerm = try (do chainl1 pNoApp app)
62 <|> pNoApp
66 <|> pNoApp
64−pNoApp :: Parser Raw
68+pNoApp :: CParser a Raw
65pNoApp = try (chainr1 pExp arrow)
69pNoApp = try (chainr1 pExp arrow)
67−pExp :: Parser Raw
71+pExp :: CParser a Raw
68pExp = do lchar '\\'; x <- iName; lchar ':'; ty <- pTerm
72pExp = do lchar '\\'; x <- iName; lchar ':'; ty <- pTerm
69 symbol "=>";
73 symbol "=>";
70 sc <- pTerm
74 sc <- pTerm
@@ -106,12 +110,12 @@ pExp = do lchar '\\'; x <- iName; lchar ':'; ty <- pTerm
106 <|> try (do x <- iName
110 <|> try (do x <- iName
107 return (Var x))
111 return (Var x))
109−pData :: Parser (Name, RawDatatype)
113+pData :: CParser a (Name, RawDatatype)
110pData = do reserved "data"; x <- iName; lchar ':'; ty <- pTerm; reserved "where"
114pData = do reserved "data"; x <- iName; lchar ':'; ty <- pTerm; reserved "where"
111 cs <- many pConstructor
115 cs <- many pConstructor
112 return (x, RDatatype x ty cs)
116 return (x, RDatatype x ty cs)
114−pConstructor :: Parser (Name, Raw)
118+pConstructor :: CParser a (Name, Raw)
115pConstructor = do lchar '|'
119pConstructor = do lchar '|'
116 c <- iName; lchar ':'; ty <- pTerm
120 c <- iName; lchar ':'; ty <- pTerm
117 return (c, ty)
121 return (c, ty)