@@ -34,15 +34,16 @@ operator = PTok.operator lexer
3434reservedOp= PTok.reservedOp lexer
3535lchar = lexeme.char
3636
37−parseExpr i = runParser pFullExpr i "(input)"
37+parseExpr i = runParser (pFullExpr defaultSyntax) i "(input)"
3838
39−parseProg :: String -> Idris [PDecl]
40−parseProg fname = do file <- lift $ readFile fname
39+parseProg :: SyntaxInfo -> String -> Idris [PDecl]
40+parseProg syn fname
41+ = do file <- lift $ readFile fname
4142 i <- get
42− case (runParser (do ps <- many1 pDecl
43+ case (runParser (do ps <- many1 (pDecl syn)
4344 eof
4445 i' <- getState
45− return (ps, i')) i fname file) of
46+ return (concat ps, i')) i fname file) of
4647 Left err -> fail (show err)
4748 Right (x, i) -> do put i
4849 return (collect x)
@@ -56,26 +57,43 @@ collect (PClauses _ [c@(PClause n l r)] : ds) = clauses n [c] ds
5657collect (d : ds) = d : collect ds
5758collect [] = []
5859
59−pFullExpr :: IParser PTerm
60−pFullExpr = do x <- pExpr; eof;
60+pFullExpr :: SyntaxInfo -> IParser PTerm
61+pFullExpr syn
62+ = do x <- pExpr syn; eof;
6163 i <- getState
6264 return (addImpl i x)
6365
64−pDecl :: IParser PDecl
65−pDecl = do d <- pDecl'
66+pDecl :: SyntaxInfo -> IParser [PDecl]
67+pDecl syn
68+ = do d <- pDecl' syn
6669 lchar ';'
6770 i <- getState
68− return (fmap (addImpl i) d)
71+ return [fmap (addImpl i) d]
72+ <|> try (pUsing syn)
6973
7074--------- Top Level Declarations ---------
7175
72−pDecl' :: IParser PDecl
73−pDecl' = try pFixity
74− <|> try (do n <- pfName; ty <- pTSig
75− ty' <- implicit n ty
76+pDecl' :: SyntaxInfo -> IParser PDecl
77+pDecl' syn
78+ = try pFixity
79+ <|> try (do n <- pfName; ty <- pTSig syn
80+ ty' <- implicit syn n ty
7681 return (PTy n ty'))
77− <|> try pData
78− <|> try pPattern
82+ <|> try (pData syn)
83+ <|> try (pPattern syn)
84+
85+pUsing :: SyntaxInfo -> IParser [PDecl]
86+pUsing syn =
87+ do reserved "using";
88+ lchar '('
89+ ns <- sepBy1 (do x <- pfName; t <- pTSig syn; return (x,t))
90+ (lchar ',')
91+ lchar ')'
92+ lchar '{'
93+ let uvars = using syn
94+ ds <- many1 (pDecl (syn { using = uvars ++ ns }))
95+ lchar '}'
96+ return (concat ds)
7997
8098--------- Fixity ---------
8199
@@ -95,57 +113,59 @@ fixity = try (do reserved "infixl"; return Infixl)
95113
96114--------- Expressions ---------
97115
98−pExpr = do i <- getState
99− buildExpressionParser (table (idris_infixes i)) pExpr'
116+pExpr syn = do i <- getState
117+ buildExpressionParser (table (idris_infixes i)) (pExpr' syn)
100118
101−pExpr' :: IParser PTerm
102−pExpr' = try pApp
103− <|> pSimpleExpr
104− <|> try pLambda
105− <|> try pPi
119+pExpr' :: SyntaxInfo -> IParser PTerm
120+pExpr' syn
121+ = try (pApp syn)
122+ <|> pSimpleExpr syn
123+ <|> try (pLambda syn)
124+ <|> try (pPi syn)
106125
107126pfName = try iName
108127 <|> do lchar '('; o <- operator; lchar ')'; return (UN [o])
109128
110−pSimpleExpr =
129+pSimpleExpr syn =
111130 try (do symbol "!["; t <- pTerm; lchar ']'
112131 return $ PQuote t)
113132 <|> try (do x <- pfName; return (PRef x))
114133 <|> try (do lchar '_'; return Placeholder)
115− <|> try (do lchar '('; e <- pExpr; lchar ')'; return e)
134+ <|> try (do lchar '('; e <- pExpr syn; lchar ')'; return e)
116135 <|> try (do reserved "Set"; return PSet)
117136
118−pHSimpleExpr = try pSimpleExpr
137+pHSimpleExpr syn
138+ = try (pSimpleExpr syn)
119139 <|> do lchar '.'
120− e <- pSimpleExpr
140+ e <- pSimpleExpr syn
121141 return $ PHidden e
122142
123−pApp = do f <- pSimpleExpr
124− iargs <- many pImplicitArg
125− args <- many1 pSimpleExpr
126− return (PApp f iargs args)
127−
128−pImplicitArg = do lchar '{'; n <- iName
129− v <- option (PRef n) (do lchar '='; pExpr)
130− lchar '}'
131− return (n, v)
132−
133−pTSig = do lchar ':'
134− pExpr
135−
136−pLambda = do lchar '\\'; x <- iName; t <- option Placeholder pTSig
137− symbol "=>"
138− sc <- pExpr
139− return (PLam x t sc)
140−
141−pPi = do lchar '('; x <- iName; t <- pTSig; lchar ')'
142− symbol "->"
143− sc <- pExpr
144− return (PPi Exp x t sc)
145− <|> do lchar '{'; x <- iName; t <- pTSig; lchar '}'
146− symbol "->"
147− sc <- pExpr
148− return (PPi Imp x t sc)
143+pApp syn = do f <- pSimpleExpr syn
144+ iargs <- many (pImplicitArg syn)
145+ args <- many1 (pSimpleExpr syn)
146+ return (PApp f iargs args)
147+
148+pImplicitArg syn = do lchar '{'; n <- iName
149+ v <- option (PRef n) (do lchar '='; pExpr syn)
150+ lchar '}'
151+ return (n, v)
152+
153+pTSig syn = do lchar ':'
154+ pExpr syn
155+
156+pLambda syn = do lchar '\\'; x <- iName; t <- option Placeholder (pTSig syn)
157+ symbol "=>"
158+ sc <- pExpr syn
159+ return (PLam x t sc)
160+
161+pPi syn = do lchar '('; x <- iName; t <- pTSig syn; lchar ')'
162+ symbol "->"
163+ sc <- pExpr syn
164+ return (PPi Exp x t sc)
165+ <|> do lchar '{'; x <- iName; t <- pTSig syn; lchar '}'
166+ symbol "->"
167+ sc <- pExpr syn
168+ return (PPi Imp x t sc)
149169
150170table fixes
151171 = toTable (reverse fixes) ++
@@ -164,22 +184,22 @@ binary name f assoc = Infix (do { reservedOp name; return f }) assoc
164184
165185--------- Data declarations ---------
166186
167−pData :: IParser PDecl
168−pData = try (do reserved "data"; tyn <- pfName; ty <- pTSig
169− reserved "where"
170− ty' <- implicit tyn ty
171− cons <- sepBy1 pConstructor (lchar '|')
172− return $ PData (PDatadecl tyn ty' cons))
173− <|> do reserved "data"; tyn <- pfName; args <- many iName
174− lchar '='
175− cons <- sepBy1 pSimpleCon (lchar '|')
176− let conty = mkPApp (PRef tyn) (map PRef args)
177− let ty = bindArgs (map (\a -> PSet) args) PSet
178− ty' <- implicit tyn ty
179− cons' <- mapM (\ (x, cargs) -> do let cty = bindArgs cargs conty
180− cty' <- implicit x cty
181− return (x, cty')) cons
182− return $ PData (PDatadecl tyn ty' cons')
187+pData :: SyntaxInfo -> IParser PDecl
188+pData syn = try (do reserved "data"; tyn <- pfName; ty <- pTSig syn
189+ reserved "where"
190+ ty' <- implicit syn tyn ty
191+ cons <- sepBy1 (pConstructor syn) (lchar '|')
192+ return $ PData (PDatadecl tyn ty' cons))
193+ <|> do reserved "data"; tyn <- pfName; args <- many iName
194+ lchar '='
195+ cons <- sepBy1 (pSimpleCon syn) (lchar '|')
196+ let conty = mkPApp (PRef tyn) (map PRef args)
197+ let ty = bindArgs (map (\a -> PSet) args) PSet
198+ ty' <- implicit syn tyn ty
199+ cons' <- mapM (\ (x, cargs) -> do let cty = bindArgs cargs conty
200+ cty' <- implicit syn x cty
201+ return (x, cty')) cons
202+ return $ PData (PDatadecl tyn ty' cons')
183203
184204mkPApp t [] = t
185205mkPApp t xs = PApp t [] xs
@@ -188,49 +208,47 @@ bindArgs :: [PTerm] -> PTerm -> PTerm
188208bindArgs [] t = t
189209bindArgs (x:xs) t = PPi Exp (MN 0 "t") x (bindArgs xs t)
190210
191−pConstructor :: IParser (Name, PTerm)
192−pConstructor
193− = do cn <- pfName; ty <- pTSig
194− ty' <- implicit cn ty
211+pConstructor :: SyntaxInfo -> IParser (Name, PTerm)
212+pConstructor syn
213+ = do cn <- pfName; ty <- pTSig syn
214+ ty' <- implicit syn cn ty
195215 return (cn, ty')
196216
197−pSimpleCon :: IParser (Name, [PTerm])
198−pSimpleCon = do cn <- pfName
199− args <- many pSimpleExpr
200− return (cn, args)
217+pSimpleCon :: SyntaxInfo -> IParser (Name, [PTerm])
218+pSimpleCon syn
219+ = do cn <- pfName
220+ args <- many (pSimpleExpr syn)
221+ return (cn, args)
201222
202223--------- Pattern match clauses ---------
203224
204−pPattern :: IParser PDecl
205−pPattern = do clause <- pClause
206− return (PClauses (MN 0 "_") [clause]) -- collect together later
225+pPattern :: SyntaxInfo -> IParser PDecl
226+pPattern syn = do clause <- pClause syn
227+ return (PClauses (MN 0 "_") [clause]) -- collect together later
207228
208−pClause :: IParser PClause
209−pClause = try (do n <- pfName
210− iargs <- many pImplicitArg
211− args <- many pHSimpleExpr
229+pClause :: SyntaxInfo -> IParser PClause
230+pClause syn
231+ = try (do n <- pfName
232+ iargs <- many (pImplicitArg syn)
233+ args <- many (pHSimpleExpr syn)
212234 lchar '='
213− rhs <- pExpr
235+ rhs <- pExpr syn
214236 return $ PClause n (PApp (PRef n) iargs args) rhs)
215− <|> do l <- pSimpleExpr
237+ <|> do l <- pSimpleExpr syn
216238 op <- operator
217239 let n = UN [op]
218− r <- pSimpleExpr
240+ r <- pSimpleExpr syn
219241 lchar '='
220− rhs <- pExpr
242+ rhs <- pExpr syn
221243 return $ PClause n (PApp (PRef n) [] [l,r]) rhs
222244
223245-- Dealing with implicit arguments
224246
225−implicit :: Name -> PTerm -> IParser PTerm
226−implicit n ptm
247+implicit :: SyntaxInfo -> Name -> PTerm -> IParser PTerm
248+implicit syn n ptm
227249 = do i <- getState
228− let (tm', name_arity) = implicitise i ptm
250+ let (tm', name_arity) = implicitise syn i ptm
229251 setState (i { idris_implicits = addDef n name_arity (idris_implicits i) })
230252 return tm'
231253
232−addImplicits :: PTerm -> IParser PTerm
233−addImplicits tm
234− = do i <- getState
235− return (addImpl i tm)
236254