@@ -34,15 +34,16 @@ operator = PTok.operator lexer
34reservedOp= PTok.reservedOp lexer
34reservedOp= PTok.reservedOp lexer
35lchar = lexeme.char
35lchar = lexeme.char
37−parseExpr i = runParser pFullExpr i "(input)"
37+parseExpr i = runParser (pFullExpr defaultSyntax) i "(input)"
39−parseProg :: String -> Idris [PDecl]
39+parseProg :: SyntaxInfo -> String -> Idris [PDecl]
40−parseProg fname = do file <- lift $ readFile fname
41+ = do file <- lift $ readFile fname
42− case (runParser (do ps <- many1 pDecl
43+ case (runParser (do ps <- many1 (pDecl syn)
44 i' <- getState
45 i' <- getState
45− return (ps, i')) i fname file) of
46+ return (concat ps, i')) i fname file) of
46 Left err -> fail (show err)
47 Left err -> fail (show err)
47 Right (x, i) -> do put i
48 Right (x, i) -> do put i
48 return (collect x)
49 return (collect x)
@@ -56,26 +57,43 @@ collect (PClauses _ [c@(PClause n l r)] : ds) = clauses n [c] ds
56collect (d : ds) = d : collect ds
57collect (d : ds) = d : collect ds
57collect [] = []
58collect [] = []
59−pFullExpr :: IParser PTerm
60+pFullExpr :: SyntaxInfo -> IParser PTerm
60−pFullExpr = do x <- pExpr; eof;
62+ = do x <- pExpr syn; eof;
61 i <- getState
63 i <- getState
62 return (addImpl i x)
64 return (addImpl i x)
64−pDecl :: IParser PDecl
66+pDecl :: SyntaxInfo -> IParser [PDecl]
65−pDecl = do d <- pDecl'
68+ = do d <- pDecl' syn
67 i <- getState
70 i <- getState
68− return (fmap (addImpl i) d)
71+ return [fmap (addImpl i) d]
70--------- Top Level Declarations ---------
74--------- Top Level Declarations ---------
72−pDecl' :: IParser PDecl
76+pDecl' :: SyntaxInfo -> IParser PDecl
73−pDecl' = try pFixity
78+ = try pFixity
74− <|> try (do n <- pfName; ty <- pTSig
79+ <|> try (do n <- pfName; ty <- pTSig syn
75− ty' <- implicit n ty
80+ ty' <- implicit syn n ty
76 return (PTy n ty'))
81 return (PTy n ty'))
77− <|> try pData
82+ <|> try (pData syn)
78− <|> try pPattern
83+ <|> try (pPattern syn)
85+pUsing :: SyntaxInfo -> IParser [PDecl]
89+ ns <- sepBy1 (do x <- pfName; t <- pTSig syn; return (x,t))
93+ let uvars = using syn
94+ ds <- many1 (pDecl (syn { using = uvars ++ ns }))
80--------- Fixity ---------
98--------- Fixity ---------
@@ -95,57 +113,59 @@ fixity = try (do reserved "infixl"; return Infixl)
96--------- Expressions ---------
114--------- Expressions ---------
98−pExpr = do i <- getState
116+pExpr syn = do i <- getState
99− buildExpressionParser (table (idris_infixes i)) pExpr'
117+ buildExpressionParser (table (idris_infixes i)) (pExpr' syn)
101−pExpr' :: IParser PTerm
119+pExpr' :: SyntaxInfo -> IParser PTerm
102−pExpr' = try pApp
121+ = try (pApp syn)
103− <|> pSimpleExpr
122+ <|> pSimpleExpr syn
104− <|> try pLambda
123+ <|> try (pLambda syn)
105− <|> try pPi
124+ <|> try (pPi syn)
107pfName = try iName
126pfName = try iName
108 <|> do lchar '('; o <- operator; lchar ')'; return (UN [o])
127 <|> do lchar '('; o <- operator; lchar ')'; return (UN [o])
110−pSimpleExpr =
129+pSimpleExpr syn =
111 try (do symbol "!["; t <- pTerm; lchar ']'
130 try (do symbol "!["; t <- pTerm; lchar ']'
112 return $ PQuote t)
131 return $ PQuote t)
113 <|> try (do x <- pfName; return (PRef x))
132 <|> try (do x <- pfName; return (PRef x))
114 <|> try (do lchar '_'; return Placeholder)
133 <|> try (do lchar '_'; return Placeholder)
115− <|> try (do lchar '('; e <- pExpr; lchar ')'; return e)
134+ <|> try (do lchar '('; e <- pExpr syn; lchar ')'; return e)
116 <|> try (do reserved "Set"; return PSet)
135 <|> try (do reserved "Set"; return PSet)
118−pHSimpleExpr = try pSimpleExpr
138+ = try (pSimpleExpr syn)
119 <|> do lchar '.'
139 <|> do lchar '.'
120− e <- pSimpleExpr
140+ e <- pSimpleExpr syn
121 return $ PHidden e
141 return $ PHidden e
123−pApp = do f <- pSimpleExpr
143+pApp syn = do f <- pSimpleExpr syn
124− iargs <- many pImplicitArg
144+ iargs <- many (pImplicitArg syn)
125− args <- many1 pSimpleExpr
145+ args <- many1 (pSimpleExpr syn)
126− return (PApp f iargs args)
146+ return (PApp f iargs args)
128−pImplicitArg = do lchar '{'; n <- iName
148+pImplicitArg syn = do lchar '{'; n <- iName
129− v <- option (PRef n) (do lchar '='; pExpr)
149+ v <- option (PRef n) (do lchar '='; pExpr syn)
130− lchar '}'
150+ lchar '}'
131− return (n, v)
151+ return (n, v)
133−pTSig = do lchar ':'
153+pTSig syn = do lchar ':'
136−pLambda = do lchar '\\'; x <- iName; t <- option Placeholder pTSig
156+pLambda syn = do lchar '\\'; x <- iName; t <- option Placeholder (pTSig syn)
137− symbol "=>"
157+ symbol "=>"
138− sc <- pExpr
158+ sc <- pExpr syn
139− return (PLam x t sc)
159+ return (PLam x t sc)
141−pPi = do lchar '('; x <- iName; t <- pTSig; lchar ')'
161+pPi syn = do lchar '('; x <- iName; t <- pTSig syn; lchar ')'
142− symbol "->"
162+ symbol "->"
143− sc <- pExpr
163+ sc <- pExpr syn
144− return (PPi Exp x t sc)
164+ return (PPi Exp x t sc)
145− <|> do lchar '{'; x <- iName; t <- pTSig; lchar '}'
165+ <|> do lchar '{'; x <- iName; t <- pTSig syn; lchar '}'
146− symbol "->"
166+ symbol "->"
147− sc <- pExpr
167+ sc <- pExpr syn
148− return (PPi Imp x t sc)
168+ return (PPi Imp x t sc)
150table fixes
170table fixes
151 = toTable (reverse fixes) ++
171 = toTable (reverse fixes) ++
@@ -164,22 +184,22 @@ binary name f assoc = Infix (do { reservedOp name; return f }) assoc
165--------- Data declarations ---------
185--------- Data declarations ---------
167−pData :: IParser PDecl
187+pData :: SyntaxInfo -> IParser PDecl
168−pData = try (do reserved "data"; tyn <- pfName; ty <- pTSig
188+pData syn = try (do reserved "data"; tyn <- pfName; ty <- pTSig syn
169− reserved "where"
189+ reserved "where"
170− ty' <- implicit tyn ty
190+ ty' <- implicit syn tyn ty
171− cons <- sepBy1 pConstructor (lchar '|')
191+ cons <- sepBy1 (pConstructor syn) (lchar '|')
172− return $ PData (PDatadecl tyn ty' cons))
192+ return $ PData (PDatadecl tyn ty' cons))
173− <|> do reserved "data"; tyn <- pfName; args <- many iName
193+ <|> do reserved "data"; tyn <- pfName; args <- many iName
174− lchar '='
194+ lchar '='
175− cons <- sepBy1 pSimpleCon (lchar '|')
195+ cons <- sepBy1 (pSimpleCon syn) (lchar '|')
176− let conty = mkPApp (PRef tyn) (map PRef args)
196+ let conty = mkPApp (PRef tyn) (map PRef args)
177− let ty = bindArgs (map (\a -> PSet) args) PSet
197+ let ty = bindArgs (map (\a -> PSet) args) PSet
178− ty' <- implicit tyn ty
198+ ty' <- implicit syn tyn ty
179− cons' <- mapM (\ (x, cargs) -> do let cty = bindArgs cargs conty
199+ cons' <- mapM (\ (x, cargs) -> do let cty = bindArgs cargs conty
180− cty' <- implicit x cty
200+ cty' <- implicit syn x cty
181− return (x, cty')) cons
201+ return (x, cty')) cons
182− return $ PData (PDatadecl tyn ty' cons')
202+ return $ PData (PDatadecl tyn ty' cons')
184mkPApp t [] = t
204mkPApp t [] = t
185mkPApp t xs = PApp t [] xs
205mkPApp t xs = PApp t [] xs
@@ -188,49 +208,47 @@ bindArgs :: [PTerm] -> PTerm -> PTerm
188bindArgs [] t = t
208bindArgs [] t = t
189bindArgs (x:xs) t = PPi Exp (MN 0 "t") x (bindArgs xs t)
209bindArgs (x:xs) t = PPi Exp (MN 0 "t") x (bindArgs xs t)
191−pConstructor :: IParser (Name, PTerm)
211+pConstructor :: SyntaxInfo -> IParser (Name, PTerm)
192−pConstructor
212+pConstructor syn
193− = do cn <- pfName; ty <- pTSig
213+ = do cn <- pfName; ty <- pTSig syn
194− ty' <- implicit cn ty
214+ ty' <- implicit syn cn ty
195 return (cn, ty')
215 return (cn, ty')
197−pSimpleCon :: IParser (Name, [PTerm])
217+pSimpleCon :: SyntaxInfo -> IParser (Name, [PTerm])
198−pSimpleCon = do cn <- pfName
219+ = do cn <- pfName
199− args <- many pSimpleExpr
220+ args <- many (pSimpleExpr syn)
200− return (cn, args)
221+ return (cn, args)
202--------- Pattern match clauses ---------
223--------- Pattern match clauses ---------
204−pPattern :: IParser PDecl
225+pPattern :: SyntaxInfo -> IParser PDecl
205−pPattern = do clause <- pClause
226+pPattern syn = do clause <- pClause syn
206− return (PClauses (MN 0 "_") [clause]) -- collect together later
227+ return (PClauses (MN 0 "_") [clause]) -- collect together later
208−pClause :: IParser PClause
229+pClause :: SyntaxInfo -> IParser PClause
209−pClause = try (do n <- pfName
231+ = try (do n <- pfName
210− iargs <- many pImplicitArg
232+ iargs <- many (pImplicitArg syn)
211− args <- many pHSimpleExpr
233+ args <- many (pHSimpleExpr syn)
212 lchar '='
234 lchar '='
213− rhs <- pExpr
235+ rhs <- pExpr syn
214 return $ PClause n (PApp (PRef n) iargs args) rhs)
236 return $ PClause n (PApp (PRef n) iargs args) rhs)
215− <|> do l <- pSimpleExpr
237+ <|> do l <- pSimpleExpr syn
216 op <- operator
238 op <- operator
217 let n = UN [op]
239 let n = UN [op]
218− r <- pSimpleExpr
240+ r <- pSimpleExpr syn
219 lchar '='
241 lchar '='
220− rhs <- pExpr
242+ rhs <- pExpr syn
221 return $ PClause n (PApp (PRef n) [] [l,r]) rhs
243 return $ PClause n (PApp (PRef n) [] [l,r]) rhs
223-- Dealing with implicit arguments
245-- Dealing with implicit arguments
225−implicit :: Name -> PTerm -> IParser PTerm
247+implicit :: SyntaxInfo -> Name -> PTerm -> IParser PTerm
226−implicit n ptm
248+implicit syn n ptm
227 = do i <- getState
249 = do i <- getState
228− let (tm', name_arity) = implicitise i ptm
250+ let (tm', name_arity) = implicitise syn i ptm
229 setState (i { idris_implicits = addDef n name_arity (idris_implicits i) })
251 setState (i { idris_implicits = addDef n name_arity (idris_implicits i) })
230 return tm'
252 return tm'
232−addImplicits :: PTerm -> IParser PTerm
235− return (addImpl i tm)