@@ -17,14 +17,6 @@ import Debug.Trace
18type TokenParser a = PTok.TokenParser a
18type TokenParser a = PTok.TokenParser a
20−idrisDef = haskellDef {
21− reservedOpNames = [":", "..", "=", "\\", "|", "<-", "->", "=>"],
22− reservedNames = ["let", "in", "data", "Set", "if", "then", "else",
23− "do", "dsl", "import", "infix", "infixl", "infixr",
24− "where", "forall", "syntax",
25− "using", "params", "namespace"]
28type IParser = Parsec String IState
20type IParser = Parsec String IState
30lexer :: TokenParser IState
22lexer :: TokenParser IState
@@ -61,22 +53,32 @@ pFullExpr = do x <- pExpr; eof; return x
61pDecl :: IParser PDecl
53pDecl :: IParser PDecl
62pDecl = do d <- pDecl'; lchar ';'; return d
54pDecl = do d <- pDecl'; lchar ';'; return d
56+--------- Top Level Declarations ---------
64pDecl' :: IParser PDecl
58pDecl' :: IParser PDecl
65−pDecl' = try (do f <- fixity; i <- natural; ops <- sepBy1 operator (lchar ',')
59+pDecl' = try pFixity
66− let prec = fromInteger i
68− let fs = map (Fix (f prec)) ops
70− idris_infixes = sort (fs ++ idris_infixes istate) })
71− return (PFix (f prec) ops))
72− <|> try (do n <- iName; ty <- pTSig
60+ <|> try (do n <- pfName; ty <- pTSig
73 return (PTy n ty))
61 return (PTy n ty))
64+-------- Fixity --------
66+pFixity :: IParser PDecl
67+pFixity = do f <- fixity; i <- natural; ops <- sepBy1 operator (lchar ',')
68+ let prec = fromInteger i
70+ let fs = map (Fix (f prec)) ops
72+ idris_infixes = sort (fs ++ idris_infixes istate) })
73+ return (PFix (f prec) ops)
75fixity :: IParser (Int -> Fixity)
75fixity :: IParser (Int -> Fixity)
76fixity = try (do reserved "infixl"; return Infixl)
76fixity = try (do reserved "infixl"; return Infixl)
77 <|> try (do reserved "infixr"; return Infixr)
77 <|> try (do reserved "infixr"; return Infixr)
78 <|> try (do reserved "infix"; return InfixN)
78 <|> try (do reserved "infix"; return InfixN)
80+--------- Expressions ---------
80pExpr = do i <- getState
82pExpr = do i <- getState
81 buildExpressionParser (table (idris_infixes i)) pExpr'
83 buildExpressionParser (table (idris_infixes i)) pExpr'
@@ -86,13 +88,16 @@ pExpr' = try pApp
86 <|> try pLambda
88 <|> try pLambda
87 <|> try pPi
89 <|> try pPi
92+ <|> do lchar '('; o <- operator; lchar ')'; return (UN [o])
89pSimpleExpr =
94pSimpleExpr =
90 try (do symbol "!["; t <- pTerm; lchar ']'
95 try (do symbol "!["; t <- pTerm; lchar ']'
91 return $ PQuote t)
96 return $ PQuote t)
92− <|> try (do x <- iName; return (PRef x))
97+ <|> try (do x <- pfName; return (PRef x))
93 <|> try (do lchar '_'; return Placeholder)
98 <|> try (do lchar '_'; return Placeholder)
94− <|> try (do lchar '('; o <- operator; lchar ')'; return (PRef (UN [o])))
95 <|> try (do lchar '('; e <- pExpr; lchar ')'; return e)
99 <|> try (do lchar '('; e <- pExpr; lchar ')'; return e)
100+ <|> try (do reserved "Set"; return PSet)
97pApp = do f <- pSimpleExpr
102pApp = do f <- pSimpleExpr
98 args <- many1 pSimpleExpr
103 args <- many1 pSimpleExpr
@@ -130,3 +135,37 @@ toTable fs = map (map toBin)
131binary name f assoc = Infix (do { reservedOp name; return f }) assoc
136binary name f assoc = Infix (do { reservedOp name; return f }) assoc
138+--------- Data declarations ---------
140+pData :: IParser PDecl
141+pData = try (do reserved "data"; tyn <- pfName; ty <- pTSig
143+ cons <- sepBy1 pConstructor (lchar '|')
144+ return $ PData (PDatadecl tyn ty cons))
145+ <|> do reserved "data"; tyn <- pfName; args <- many iName
147+ cons <- sepBy1 pSimpleCon (lchar '|')
148+ let conty = mkPApp (PRef tyn) (map PRef args)
149+ return $ PData (PDatadecl tyn (bindArgs (map (\a -> PSet) args) PSet)
150+ (map (\ (x, cargs) ->
151+ (x, bindArgs cargs conty)) cons))
154+mkPApp t xs = PApp t [] xs
156+bindArgs :: [PTerm] -> PTerm -> PTerm
158+bindArgs (x:xs) t = PPi Exp (MN 0 "t") x (bindArgs xs t)
160+pConstructor :: IParser (Name, PTerm)
162+ = do cn <- pfName; ty <- pTSig
165+pSimpleCon :: IParser (Name, [PTerm])
166+pSimpleCon = do cn <- pfName
167+ args <- many pSimpleExpr
170+--------- Pattern match clauses ---------