@@ -170,9 +170,17 @@ pSyntaxDecl :: SyntaxInfo -> IParser PDecl
170pSyntaxDecl syn
170pSyntaxDecl syn
171 = do s <- pSyntaxRule syn
171 = do s <- pSyntaxRule syn
172 i <- getState
172 i <- getState
173+ let rs = syntax_rules i
174+ let ns = syntax_keywords i
175+ let ks = map show (names s)
173− setState (i { syntax_rules = s : syntax_rules i })
176+ setState (i { syntax_rules = s : rs,
177+ syntax_keywords = ks ++ ns })
174 fc <- pfc
178 fc <- pfc
175 return (PSyntax fc s)
179 return (PSyntax fc s)
181+ names (Rule syms _) = mapMaybe ename syms
182+ ename (Keyword n) = Just n
177pSyntaxRule :: SyntaxInfo -> IParser Syntax
185pSyntaxRule :: SyntaxInfo -> IParser Syntax
178pSyntaxRule syn
186pSyntaxRule syn
@@ -201,8 +209,8 @@ pSynSym = try (do lchar '['; n <- pName; lchar ']'
201 return (Symbol sym)
209 return (Symbol sym)
203pFunDecl' :: SyntaxInfo -> IParser PDecl
211pFunDecl' :: SyntaxInfo -> IParser PDecl
204−pFunDecl' syn = try (do fc <- pfc
205− n <- pfName; ty <- pTSig syn
212+pFunDecl' syn = try (do n <- pfName; ty <- pTSig syn
206 lchar ';'
214 lchar ';'
207 ty' <- implicit syn n ty
215 ty' <- implicit syn n ty
208 return (PTy fc n ty'))
216 return (PTy fc n ty'))
@@ -268,8 +276,8 @@ pNoExtExpr syn =
268 <|> pSimpleExpr syn
276 <|> pSimpleExpr syn
269 <|> try (pLambda syn)
277 <|> try (pLambda syn)
270 <|> try (pLet syn)
278 <|> try (pLet syn)
271− <|> try (pPi syn)
279+ <|> pPi syn
272− <|> try (pDoBlock syn)
280+ <|> pDoBlock syn
274pExtensions :: SyntaxInfo -> [Syntax] -> IParser PTerm
282pExtensions :: SyntaxInfo -> [Syntax] -> IParser PTerm
275pExtensions syn rules = choice (map (\x -> try (pExt syn x)) rules)
283pExtensions syn rules = choice (map (\x -> try (pExt syn x)) rules)
@@ -308,12 +316,8 @@ pExt syn (Rule (s:ssym) ptm)
308 update ns t = t
316 update ns t = t
310pName = do i <- getState
318pName = do i <- getState
311− iName (map show (names (syntax_rules i)))
319+ iName (syntax_keywords i)
313− names rs = concatMap namesR rs
314− namesR (Rule syms _) = mapMaybe ename syms
315− ename (Keyword n) = Just n
318pfName = try pName
322pfName = try pName
319 <|> do lchar '('; o <- operator; lchar ')'; return (UN [o])
323 <|> do lchar '('; o <- operator; lchar ')'; return (UN [o])
@@ -322,21 +326,24 @@ pSimpleExpr syn =
322 try (do symbol "!["; t <- pTerm; lchar ']'
326 try (do symbol "!["; t <- pTerm; lchar ']'
323 return $ PQuote t)
327 return $ PQuote t)
324 <|> try (do lchar '?'; x <- pName; return (PMetavar x))
328 <|> try (do lchar '?'; x <- pName; return (PMetavar x))
325− <|> try (do fc <- pfc; reserved "refl"; return (PRefl fc))
329+ <|> try (do reserved "refl"; fc <- pfc; return (PRefl fc))
326− <|> try (do fc <- pfc; reserved "return"; return (PReturn fc))
330+ <|> try (do reserved "return"; fc <- pfc; return (PReturn fc))
327− <|> try (do fc <- pfc; x <- pfName; return (PRef fc x))
331+ <|> try (do x <- pfName; fc <- pfc; return (PRef fc x))
328− <|> try (do lchar '('; l <- pExpr syn; lchar ','; fc <- pfc
332+ <|> try (pPair syn)
329− r <- pExpr syn; lchar ')';
330− return (PPair fc l r))
331− <|> try (do lchar '('; l <- pExpr syn; reservedOp "**"; fc <- pfc
332− r <- pExpr syn; lchar ')';
333− return (PDPair fc l r))
334 <|> try (do lchar '('; e <- pExpr syn; lchar ')'; return e)
333 <|> try (do lchar '('; e <- pExpr syn; lchar ')'; return e)
335 <|> try (do c <- pConstant; return (PConstant c))
334 <|> try (do c <- pConstant; return (PConstant c))
336− <|> try (do reserved "Set"; return PSet)
335+ <|> do reserved "Set"; return PSet
337− <|> try (do fc <- pfc; symbol "()"; return (PTrue fc))
336+ <|> try (do symbol "()"; fc <- pfc; return (PTrue fc))
338− <|> try (do fc <- pfc; symbol "_|_"; return (PFalse fc))
337+ <|> try (do symbol "_|_"; fc <- pfc; return (PFalse fc))
339− <|> try (do lchar '_'; return Placeholder)
338+ <|> do lchar '_'; return Placeholder
340+pPair syn = do lchar '('; l <- pExpr syn; op <- pairOp
342+ r <- pExpr syn; lchar ')';
345+ pairOp = do lchar ','; return PPair
346+ <|> do reservedOp "**"; return PDPair
341pHSimpleExpr syn
348pHSimpleExpr syn
342 = try (pSimpleExpr syn)
349 = try (pSimpleExpr syn)
@@ -352,13 +359,13 @@ pApp syn = do f <- pSimpleExpr syn
352pArg :: SyntaxInfo -> IParser PArg
359pArg :: SyntaxInfo -> IParser PArg
353pArg syn = pImplicitArg syn
360pArg syn = pImplicitArg syn
354 <|> do e <- pSimpleExpr syn
361 <|> do e <- pSimpleExpr syn
355− return (PExp e)
362+ return (pexp e)
357pImplicitArg syn = do lchar '{'; n <- pName
364pImplicitArg syn = do lchar '{'; n <- pName
358 fc <- pfc
365 fc <- pfc
359 v <- option (PRef fc n) (do lchar '='; pExpr syn)
366 v <- option (PRef fc n) (do lchar '='; pExpr syn)
360 lchar '}'
367 lchar '}'
361− return (PImp n v)
368+ return (pimp n v)
363pTSig syn = do lchar ':'
370pTSig syn = do lchar ':'
364 pExpr syn
371 pExpr syn
@@ -373,14 +380,16 @@ pLet syn = do reserved "let"; n <- pName; lchar '='; v <- pExpr syn
373 reserved "in"; sc <- pExpr syn
380 reserved "in"; sc <- pExpr syn
374 return (PLet n Placeholder v sc)
381 return (PLet n Placeholder v sc)
383+pPi syn = do lazy <- option False (do lchar '|'; return True)
376−pPi syn = do lchar '('; xt <- tyDeclList syn; lchar ')'
384+ lchar '('; xt <- tyDeclList syn; lchar ')'
377 symbol "->"
385 symbol "->"
378 sc <- pExpr syn
386 sc <- pExpr syn
379− return (bindList (PPi Exp) xt sc)
387+ return (bindList (PPi (Exp lazy)) xt sc)
388+ <|> do lazy <- option False (do lchar '|'; return True)
380− <|> do lchar '{'; xt <- tyDeclList syn; lchar '}'
389+ lchar '{'; xt <- tyDeclList syn; lchar '}'
381 symbol "->"
390 symbol "->"
382 sc <- pExpr syn
391 sc <- pExpr syn
383− return (bindList (PPi Imp) xt sc)
392+ return (bindList (PPi (Imp lazy)) xt sc)
385tyDeclList syn = sepBy1 (do x <- pfName; t <- pTSig syn; return (x,t))
394tyDeclList syn = sepBy1 (do x <- pfName; t <- pTSig syn; return (x,t))
386 (lchar ',')
395 (lchar ',')
@@ -399,14 +408,14 @@ pDoBlock syn
399 return (PDoBlock ds)
408 return (PDoBlock ds)
402− = try (do fc <- pfc
411+ = try (do i <- pName; symbol "<-"; fc <- pfc
403− i <- pName; symbol "<-"; e <- pExpr syn;
412+ e <- pExpr syn;
404 return (DoBind fc i e))
413 return (DoBind fc i e))
405− <|> try (do fc <- pfc
406− reserved "let"; i <- pName; reservedOp "="; e <- pExpr syn
414+ <|> try (do reserved "let"; i <- pName; reservedOp "="; fc <- pfc
407 return (DoLet fc i e))
416 return (DoLet fc i e))
408− <|> try (do fc <- pfc
417+ <|> try (do e <- pExpr syn; fc <- pfc
409− e <- pExpr syn; return (DoExp fc e))
418+ return (DoExp fc e))
411pConstant :: IParser Const
420pConstant :: IParser Const
412pConstant = do reserved "Int"; return IType
421pConstant = do reserved "Int"; return IType
@@ -420,38 +429,38 @@ pConstant = do reserved "Int"; return IType
420 <|> try (do c <- chlit; return $ Ch c)
429 <|> try (do c <- chlit; return $ Ch c)
422table fixes
431table fixes
423− = [[prefix "-" (\fc x -> PApp fc (PRef fc (UN ["-"])) [PExp (PConstant (I 0)), PExp x])]]
432+ = [[prefix "-" (\fc x -> PApp fc (PRef fc (UN ["-"])) [pexp (PConstant (I 0)), pexp x])]]
424 ++ toTable (reverse fixes) ++
433 ++ toTable (reverse fixes) ++
425 [[binary "=" (\fc x y -> PEq fc x y) AssocLeft],
434 [[binary "=" (\fc x y -> PEq fc x y) AssocLeft],
426− [binary "->" (\fc x y -> PPi Exp (MN 0 "X") x y) AssocRight]]
435+ [binary "->" (\fc x y -> PPi expl (MN 0 "X") x y) AssocRight]]
428toTable fs = map (map toBin)
437toTable fs = map (map toBin)
429 (groupBy (\ (Fix x _) (Fix y _) -> prec x == prec y) fs)
438 (groupBy (\ (Fix x _) (Fix y _) -> prec x == prec y) fs)
430 where toBin (Fix (PrefixN _) op) = prefix op
439 where toBin (Fix (PrefixN _) op) = prefix op
431− (\fc x -> PApp fc (PRef fc (UN [op])) [PExp x])
440+ (\fc x -> PApp fc (PRef fc (UN [op])) [pexp x])
432 toBin (Fix f op)
441 toBin (Fix f op)
433− = binary op (\fc x y -> PApp fc (PRef fc (UN [op])) [PExp x,PExp y]) (assoc f)
442+ = binary op (\fc x y -> PApp fc (PRef fc (UN [op])) [pexp x,pexp y]) (assoc f)
434 assoc (Infixl _) = AssocLeft
443 assoc (Infixl _) = AssocLeft
435 assoc (Infixr _) = AssocRight
444 assoc (Infixr _) = AssocRight
436 assoc (InfixN _) = AssocNone
445 assoc (InfixN _) = AssocNone
438−binary name f assoc = Infix (do { fc <- pfc;
447+binary name f assoc = Infix (do { reservedOp name; fc <- pfc;
439− reservedOp name; return (f fc) }) assoc
448+ return (f fc) }) assoc
440−prefix name f = Prefix (do { fc <- pfc;
449+prefix name f = Prefix (do { reservedOp name; fc <- pfc;
441− reservedOp name; return (f fc) })
450+ return (f fc) })
443--------- Data declarations ---------
452--------- Data declarations ---------
445pData :: SyntaxInfo -> IParser PDecl
454pData :: SyntaxInfo -> IParser PDecl
446−pData syn = try (do fc <- pfc
455+pData syn = try (do reserved "data"; fc <- pfc
447− reserved "data"; tyn <- pfName; ty <- pTSig syn
456+ tyn <- pfName; ty <- pTSig syn
448 reserved "where"
457 reserved "where"
449 ty' <- implicit syn tyn ty
458 ty' <- implicit syn tyn ty
450 cons <- sepBy (pConstructor syn) (lchar '|')
459 cons <- sepBy (pConstructor syn) (lchar '|')
451 lchar ';'
460 lchar ';'
452 return $ PData fc (PDatadecl tyn ty' cons))
461 return $ PData fc (PDatadecl tyn ty' cons))
453− <|> do fc <- pfc
462+ <|> do reserved "data"; fc <- pfc
454− reserved "data"; tyn <- pfName; args <- many pName
463+ tyn <- pfName; args <- many pName
455 lchar '='
464 lchar '='
456 cons <- sepBy1 (pSimpleCon syn) (lchar '|')
465 cons <- sepBy1 (pSimpleCon syn) (lchar '|')
457 lchar ';'
466 lchar ';'
@@ -465,31 +474,31 @@ pData syn = try (do fc <- pfc
465 return $ PData fc (PDatadecl tyn ty' cons')
474 return $ PData fc (PDatadecl tyn ty' cons')
467mkPApp fc t [] = t
476mkPApp fc t [] = t
468−mkPApp fc t xs = PApp fc t (map PExp xs)
477+mkPApp fc t xs = PApp fc t (map pexp xs)
470bindArgs :: [PTerm] -> PTerm -> PTerm
479bindArgs :: [PTerm] -> PTerm -> PTerm
471bindArgs [] t = t
480bindArgs [] t = t
472−bindArgs (x:xs) t = PPi Exp (MN 0 "t") x (bindArgs xs t)
481+bindArgs (x:xs) t = PPi expl (MN 0 "t") x (bindArgs xs t)
474pConstructor :: SyntaxInfo -> IParser (Name, PTerm, FC)
483pConstructor :: SyntaxInfo -> IParser (Name, PTerm, FC)
475pConstructor syn
484pConstructor syn
476− = do fc <- pfc
485+ = do cn <- pfName; fc <- pfc
477− cn <- pfName; ty <- pTSig syn
486+ ty <- pTSig syn
478 ty' <- implicit syn cn ty
487 ty' <- implicit syn cn ty
479 return (cn, ty', fc)
488 return (cn, ty', fc)
481pSimpleCon :: SyntaxInfo -> IParser (Name, [PTerm], FC)
490pSimpleCon :: SyntaxInfo -> IParser (Name, [PTerm], FC)
482pSimpleCon syn
491pSimpleCon syn
483− = do fc <- pfc
493+ fc <- pfc
485 args <- many (pSimpleExpr syn)
494 args <- many (pSimpleExpr syn)
486 return (cn, args, fc)
495 return (cn, args, fc)
488--------- Pattern match clauses ---------
497--------- Pattern match clauses ---------
490pPattern :: SyntaxInfo -> IParser PDecl
499pPattern :: SyntaxInfo -> IParser PDecl
491−pPattern syn = do fc <- pfc
500+pPattern syn = do clause <- pClause syn
492− clause <- pClause syn
501+ fc <- pfc
493 return (PClauses fc (MN 2 "_") [clause]) -- collect together later
502 return (PClauses fc (MN 2 "_") [clause]) -- collect together later
495whereSyn :: Name -> SyntaxInfo -> [PTerm] -> SyntaxInfo
504whereSyn :: Name -> SyntaxInfo -> [PTerm] -> SyntaxInfo
@@ -511,7 +520,7 @@ pClause syn
511 let wsyn = whereSyn n syn (map getTm iargs ++ args ++ wargs)
520 let wsyn = whereSyn n syn (map getTm iargs ++ args ++ wargs)
512 wheres <- choice [pWhereblock wsyn, do lchar ';'; return []]
521 wheres <- choice [pWhereblock wsyn, do lchar ';'; return []]
513 return $ PClause n (PApp fc (PRef fc n)
522 return $ PClause n (PApp fc (PRef fc n)
514− (iargs ++ map PExp args)) wargs rhs wheres)
523+ (iargs ++ map pexp args)) wargs rhs wheres)
515 <|> try (do n <- pfName
524 <|> try (do n <- pfName
516 iargs <- many (pImplicitArg syn)
525 iargs <- many (pImplicitArg syn)
517 fc <- pfc
526 fc <- pfc
@@ -524,7 +533,7 @@ pClause syn
524 let withs = concat ds
533 let withs = concat ds
525 lchar '}'
534 lchar '}'
526 return $ PWith n (PApp fc (PRef fc n)
535 return $ PWith n (PApp fc (PRef fc n)
527− (iargs ++ map PExp args)) wargs wval withs)
536+ (iargs ++ map pexp args)) wargs wval withs)
529 <|> do l <- pSimpleExpr syn
538 <|> do l <- pSimpleExpr syn
530 op <- operator
539 op <- operator
@@ -535,7 +544,7 @@ pClause syn
535 lchar '='
544 lchar '='
536 rhs <- pExpr syn
545 rhs <- pExpr syn
537 wheres <- choice [pWhereblock syn, do lchar ';'; return []]
546 wheres <- choice [pWhereblock syn, do lchar ';'; return []]
538− return $ PClause n (PApp fc (PRef fc n) [PExp l,PExp r]) wargs rhs wheres
547+ return $ PClause n (PApp fc (PRef fc n) [pexp l,pexp r]) wargs rhs wheres
540 <|> do l <- pSimpleExpr syn
549 <|> do l <- pSimpleExpr syn
541 op <- operator
550 op <- operator
@@ -549,7 +558,7 @@ pClause syn
549 ds <- many1 $ pFunDecl syn
558 ds <- many1 $ pFunDecl syn
550 let withs = concat ds
559 let withs = concat ds
551 lchar '}'
560 lchar '}'
552− return $ PWith n (PApp fc (PRef fc n) [PExp l, PExp r]) wargs wval withs
561+ return $ PWith n (PApp fc (PRef fc n) [pexp l, pexp r]) wargs wval withs
554pWExpr :: SyntaxInfo -> IParser PTerm
563pWExpr :: SyntaxInfo -> IParser PTerm
555pWExpr syn = do lchar '|'; pExpr' syn
564pWExpr syn = do lchar '|'; pExpr' syn
@@ -587,11 +596,11 @@ expandDo dsl (PDoBlock ds) = expandDo dsl $ block (dsl_bind dsl) ds
587 block b [DoExp fc tm] = tm
596 block b [DoExp fc tm] = tm
588 block b [a] = PElabError "Last statement in do block must be an expression"
597 block b [a] = PElabError "Last statement in do block must be an expression"
589 block b (DoBind fc n tm : rest)
598 block b (DoBind fc n tm : rest)
590− = PApp fc (PRef fc b) [PExp tm, PExp (PLam n Placeholder (block b rest))]
599+ = PApp fc (PRef fc b) [pexp tm, pexp (PLam n Placeholder (block b rest))]
591 block b (DoExp fc tm : rest)
600 block b (DoExp fc tm : rest)
592 = PApp fc (PRef fc b)
601 = PApp fc (PRef fc b)
593− [PExp tm,
602+ [pexp tm,
594− PExp (PLam (MN 0 "bindx") Placeholder (block b rest))]
603+ pexp (PLam (MN 0 "bindx") Placeholder (block b rest))]
595expandDo dsl t = t
604expandDo dsl t = t