@@ -140,17 +140,54 @@ parseImports fname input
140 Right (x, i) -> do put i
140 Right (x, i) -> do put i
142 where ishow err = let ln = sourceLine (errorPos err) in
142 where ishow err = let ln = sourceLine (errorPos err) in
143− fname ++ ":" ++ show ln ++ ":parse error"
143+ fname ++ ":" ++ show ln ++ ":parse error"
144-- show (map messageString (errorMessages err))
144-- show (map messageString (errorMessages err))
146pHeader :: IParser [String]
146pHeader :: IParser [String]
147−pHeader = try (do reserved "module"; i <- identifier; lchar ';'
147+pHeader = try (do reserved "module"; i <- identifier; option ';' (lchar ';')
148 return (parseName i))
148 return (parseName i))
149 <|> return []
149 <|> return []
150 where parseName x = case span (/='.') x of
150 where parseName x = case span (/='.') x of
151 (x, "") -> [x]
151 (x, "") -> [x]
152 (x, '.':y) -> x : parseName y
152 (x, '.':y) -> x : parseName y
154+push_indent :: IParser ()
155+push_indent = do pos <- getPosition
157+ setState (ist { indent_stack = sourceColumn pos :
160+last_indent :: IParser Int
161+last_indent = do ist <- getState
162+ case indent_stack ist of
163+ (x : xs) -> return x
166+indent :: IParser Int
167+indent = do pos <- getPosition
168+ return (sourceColumn pos)
170+pop_indent :: IParser ()
171+pop_indent = do ist <- getState
172+ let (x : xs) = indent_stack ist
173+ setState (ist { indent_stack = xs })
175+pTerminator = do lchar ';'; pop_indent
176+ <|> do c <- indent; l <- last_indent
177+ if (c <= l) then pop_indent
178+ else fail "Not a terminator"
179+ <|> do i <- getInput; if (take 1 i == "}") then pop_indent
180+ else fail "Not a terminator"
184+ = do lchar ';'; return ()
185+ <|> do c <- indent; l <- last_indent
186+ if (c <= l) then return ()
187+ else fail "Not a terminator"
188+ <|> do i <- getInput; if (take 1 i == "}") then return ()
189+ else fail "Not a terminator"
155pfc :: IParser FC
192pfc :: IParser FC
156pfc = do s <- getPosition
193pfc = do s <- getPosition
@@ -163,7 +200,7 @@ pfc = do s <- getPosition
163pImport :: IParser String
200pImport :: IParser String
164pImport = do reserved "import"
201pImport = do reserved "import"
165 f <- identifier
202 f <- identifier
166− lchar ';'
203+ option ';' (lchar ';')
167 return (map dot f)
204 return (map dot f)
168 where dot '.' = '/'
205 where dot '.' = '/'
169 dot c = c
206 dot c = c
@@ -182,6 +219,7 @@ parseProg syn fname input pos
182 return (collect x)
219 return (collect x)
183 where ishow err = let ln = sourceLine (errorPos err) in
220 where ishow err = let ln = sourceLine (errorPos err) in
184 fname ++ ":" ++ show ln ++ ":parse error"
221 fname ++ ":" ++ show ln ++ ":parse error"
222+ ++ " " ++ show (sourceColumn (errorPos err))
185-- show (map messageString (errorMessages err))
223-- show (map messageString (errorMessages err))
187-- Collect PClauses with the same function name
225-- Collect PClauses with the same function name
@@ -244,7 +282,7 @@ pDecl' syn
244 = try pFixity
282 = try pFixity
245 <|> pFunDecl' syn
283 <|> pFunDecl' syn
246 <|> try (pData syn)
284 <|> try (pData syn)
247− <|> try (pSyntaxDecl syn)
285+ <|> pSyntaxDecl syn
249pSyntaxDecl :: SyntaxInfo -> IParser PDecl
287pSyntaxDecl :: SyntaxInfo -> IParser PDecl
250pSyntaxDecl syn
288pSyntaxDecl syn
@@ -267,7 +305,8 @@ pSyntaxDecl syn
268pSyntaxRule :: SyntaxInfo -> IParser Syntax
306pSyntaxRule :: SyntaxInfo -> IParser Syntax
269pSyntaxRule syn
307pSyntaxRule syn
270− = do sty <- option AnySyntax (do reserved "term"; return TermSyntax
309+ sty <- option AnySyntax (do reserved "term"; return TermSyntax
271 <|> do reserved "pattern"; return PatternSyntax)
310 <|> do reserved "pattern"; return PatternSyntax)
272 reserved "syntax"
311 reserved "syntax"
273 syms <- many1 pSynSym
312 syms <- many1 pSynSym
@@ -277,7 +316,7 @@ pSyntaxRule syn
277 $ fail "Repeated variable in syntax rule"
316 $ fail "Repeated variable in syntax rule"
278 lchar '='
317 lchar '='
279 tm <- pExpr syn
318 tm <- pExpr syn
280− lchar ';'
319+ pTerminator
281 return (Rule syms tm sty)
320 return (Rule syms tm sty)
283 expr (Expr _) = True
322 expr (Expr _) = True
@@ -294,12 +333,13 @@ pSynSym = try (do lchar '['; n <- pName; lchar ']'
294 return (Symbol sym)
333 return (Symbol sym)
296pFunDecl' :: SyntaxInfo -> IParser PDecl
335pFunDecl' :: SyntaxInfo -> IParser PDecl
336+pFunDecl' syn = try (do push_indent
297−pFunDecl' syn = try (do acc <- pAccessibility
337+ acc <- pAccessibility
298 n_in <- pfName
338 n_in <- pfName
299 let n = expandNS syn n_in
339 let n = expandNS syn n_in
300 ty <- pTSig syn
340 ty <- pTSig syn
301 fc <- pfc
341 fc <- pfc
302− lchar ';'
342+ pTerminator
303-- ty' <- implicit syn n ty
343-- ty' <- implicit syn n ty
304 addAcc n acc
344 addAcc n acc
305 return (PTy syn fc n ty))
345 return (PTy syn fc n ty))
@@ -348,8 +388,9 @@ expandNS syn n = case syn_namespace syn of
348--------- Fixity ---------
388--------- Fixity ---------
350pFixity :: IParser PDecl
390pFixity :: IParser PDecl
391+pFixity = do push_indent
351−pFixity = do f <- fixity; i <- natural; ops <- sepBy1 operator (lchar ',')
392+ f <- fixity; i <- natural; ops <- sepBy1 operator (lchar ',')
352− lchar ';'
393+ pTerminator
353 let prec = fromInteger i
394 let prec = fromInteger i
354 istate <- getState
395 istate <- getState
355 let fs = map (Fix (f prec)) ops
396 let fs = map (Fix (f prec)) ops
@@ -428,12 +469,12 @@ pSimpleExtExpr syn = do i <- getState
429pNoExtExpr syn =
470pNoExtExpr syn =
430 try (pApp syn)
471 try (pApp syn)
431− <|> try (pComprehension syn)
432− <|> pSimpleExpr syn
472+ <|> try (pSimpleExpr syn)
433 <|> pLambda syn
473 <|> pLambda syn
434 <|> pLet syn
474 <|> pLet syn
435 <|> pPi syn
475 <|> pPi syn
436 <|> pDoBlock syn
476 <|> pDoBlock syn
477+ <|> pComprehension syn
438pExtensions :: SyntaxInfo -> [Syntax] -> IParser PTerm
479pExtensions :: SyntaxInfo -> [Syntax] -> IParser PTerm
439pExtensions syn rules = choice (map (\x -> try (pExt syn x)) (filter valid rules))
480pExtensions syn rules = choice (map (\x -> try (pExt syn x)) (filter valid rules))
@@ -529,19 +570,10 @@ pSimpleExpr syn =
529 lchar '}'
570 lchar '}'
530 return (PCase fc scr opts)
571 return (PCase fc scr opts)
531 <|> try (do x <- pfName; fc <- pfc; return (PRef fc x))
572 <|> try (do x <- pfName; fc <- pfc; return (PRef fc x))
533 <|> try (pList syn)
573 <|> try (pList syn)
534 <|> try (pAlt syn)
574 <|> try (pAlt syn)
535 <|> try (pIdiom syn)
575 <|> try (pIdiom syn)
536− <|> try (do lchar '('; e <- pExpr syn; lchar ')'; return e)
576+ <|> try (do lchar '('; bracketed syn)
537− <|> try (do lchar '('; fc <- pfc; o <- operator; e <- pExpr syn; lchar ')'
538− return $ PLam (MN 0 "x") Placeholder
539− (PApp fc (PRef fc (UN o)) [pexp (PRef fc (MN 0 "x")),
541− <|> try (do lchar '('; fc <- pfc; e <- pSimpleExpr syn; o <- operator; lchar ')'
542− return $ PLam (MN 0 "x") Placeholder
543− (PApp fc (PRef fc (UN o)) [pexp e,
544− pexp (PRef fc (MN 0 "x"))]))
545 <|> try (do c <- pConstant; fc <- pfc
577 <|> try (do c <- pConstant; fc <- pfc
546 return (modifyConst syn fc (PConstant c)))
578 return (modifyConst syn fc (PConstant c)))
547 <|> do reserved "Set"; return PSet
579 <|> do reserved "Set"; return PSet
@@ -550,6 +582,18 @@ pSimpleExpr syn =
550 <|> do lchar '_'; return Placeholder
582 <|> do lchar '_'; return Placeholder
551 <|> pSimpleExtExpr syn
583 <|> pSimpleExtExpr syn
587+ <|> try (do e <- pExpr syn; lchar ')'; return e)
588+ <|> try (do fc <- pfc; o <- operator; e <- pExpr syn; lchar ')'
589+ return $ PLam (MN 0 "x") Placeholder
590+ (PApp fc (PRef fc (UN o)) [pexp (PRef fc (MN 0 "x")),
592+ <|> try (do fc <- pfc; e <- pSimpleExpr syn; o <- operator; lchar ')'
593+ return $ PLam (MN 0 "x") Placeholder
594+ (PApp fc (PRef fc (UN o)) [pexp e,
595+ pexp (PRef fc (MN 0 "x"))]))
553pCaseOpt :: SyntaxInfo -> IParser (PTerm, PTerm)
597pCaseOpt :: SyntaxInfo -> IParser (PTerm, PTerm)
554pCaseOpt syn = do lhs <- pExpr syn; symbol "=>";
598pCaseOpt syn = do lhs <- pExpr syn; symbol "=>";
555 rhs <- pExpr syn
599 rhs <- pExpr syn
@@ -568,28 +612,37 @@ pList syn = do lchar '['; fc <- pfc
568 mkList fc [] = PRef fc (UN "Nil")
612 mkList fc [] = PRef fc (UN "Nil")
569 mkList fc (x : xs) = PApp fc (PRef fc (UN "::")) [pexp x, pexp (mkList fc xs)]
613 mkList fc (x : xs) = PApp fc (PRef fc (UN "::")) [pexp x, pexp (mkList fc xs)]
571−pPair syn = try (do lchar '('; l <- pExpr syn; op <- pairOp
615+pPair syn = try (do l <- pExpr syn
572 fc <- pfc
616 fc <- pfc
573− r <- pExpr syn; lchar ')';
617+ rest <- restTuple
620+ [Left r] -> return (PPair fc l r)
574− return (op fc l r))
621+ [Right r] -> return (PDPair fc l Placeholder r))
575− <|> try (do lchar '('; x <- ntuple
622+ <|> try (do x <- ntuple
576 lchar ')'
623 lchar ')'
577 return x)
624 return x)
578− <|> do lchar '('; ln <- pName; lchar ':'; lty <- pExpr syn;
625+ <|> do ln <- pName; lchar ':'; lty <- pExpr syn;
579 reservedOp "**";
626 reservedOp "**";
580 fc <- pfc
627 fc <- pfc
581 r <- pExpr syn; lchar ')';
628 r <- pExpr syn; lchar ')';
582 return (PDPair fc (PRef fc ln) lty r)
629 return (PDPair fc (PRef fc ln) lty r)
631+ restTuple = do lchar ')'; return []
636+ <|> do reservedOp "**"
584 ntuple = try (do l <- pExpr syn; fc <- pfc; lchar ','
640 ntuple = try (do l <- pExpr syn; fc <- pfc; lchar ','
585 rest <- ntuple
641 rest <- ntuple
586 return (PPair fc l rest))
642 return (PPair fc l rest))
587 <|> (do l <- pExpr syn; fc <- pfc; lchar ','
643 <|> (do l <- pExpr syn; fc <- pfc; lchar ','
588 r <- pExpr syn
644 r <- pExpr syn
589 return (PPair fc l r))
645 return (PPair fc l r))
591− pairOp = do lchar ','; return PPair
592− <|> do reservedOp "**"; return (\f x y -> PDPair f x Placeholder y)
594pAlt syn = do symbol "(|";
647pAlt syn = do symbol "(|";
595 alts <- sepBy1 (pExpr' syn) (lchar ',')
648 alts <- sepBy1 (pExpr' syn) (lchar ',')
@@ -604,9 +657,19 @@ pHSimpleExpr syn
605pApp syn = do f <- pSimpleExpr syn
658pApp syn = do f <- pSimpleExpr syn
606 fc <- pfc
659 fc <- pfc
660+ args <- many1 (do notEndApp
607− args <- many1 (pArg syn)
661+ pArg syn)
608 return (PApp fc f args)
662 return (PApp fc f args)
664+notEndApp = do c <- indent; l <- last_indent
666+ if (c <= l || take 1 i == "}"
670+ || take 2 i == "=>") then fail "Terminator"
610pArg :: SyntaxInfo -> IParser PArg
673pArg :: SyntaxInfo -> IParser PArg
611pArg syn = try (pImplicitArg syn)
674pArg syn = try (pImplicitArg syn)
612 <|> try (pConstraintArg syn)
675 <|> try (pConstraintArg syn)
@@ -627,18 +690,17 @@ pTSig syn = do lchar ':'
627 sc <- pExpr syn
690 sc <- pExpr syn
628 return (bindList (PPi constraint) (map (\x -> (MN 0 "c", x)) cs) sc)
691 return (bindList (PPi constraint) (map (\x -> (MN 0 "c", x)) cs) sc)
630−pLambda syn = try (do lchar '\\';
693+pLambda syn = do lchar '\\'
631− xt <- tyOptDeclList syn
694+ (try (do xt <- tyOptDeclList syn
632− symbol "=>"
695+ symbol "=>"
633− sc <- pExpr syn
696+ sc <- pExpr syn
634− return (bindList PLam xt sc))
697+ return (bindList PLam xt sc))
636− ps <- sepBy (do fc <- pfc
698+ <|> (do ps <- sepBy (do fc <- pfc
637− e <- pSimpleExpr syn
699+ e <- pSimpleExpr syn
638− return (fc, e)) (lchar ',')
700+ return (fc, e)) (lchar ',')
639− symbol "=>"
701+ symbol "=>"
640− sc <- pExpr syn
702+ sc <- pExpr syn
641− return (pmList (zip [0..] ps) sc))
703+ return (pmList (zip [0..] ps) sc)))
642 where pmList [] sc = sc
704 where pmList [] sc = sc
643 pmList ((i, (fc, x)) : xs) sc
705 pmList ((i, (fc, x)) : xs) sc
644 = PLam (MN i "lamp") Placeholder
706 = PLam (MN i "lamp") Placeholder
@@ -713,7 +775,9 @@ pComprehension syn
714pDoBlock syn
776pDoBlock syn
715 = do reserved "do"; lchar '{'
777 = do reserved "do"; lchar '{'
716− ds <- endBy1 (pDo syn) (lchar ';')
778+ push_indent
779+ ds <- many1 (do x <- pDo syn; pKeepTerminator; return x)
717 lchar '}'
781 lchar '}'
718 return (PDoBlock ds)
782 return (PDoBlock ds)
@@ -788,23 +852,25 @@ accData (Just Frozen) n ns = do addAcc n (Just Frozen)
788accData a n ns = do addAcc n a; mapM_ (\n -> addAcc n a) ns
852accData a n ns = do addAcc n a; mapM_ (\n -> addAcc n a) ns
790pData :: SyntaxInfo -> IParser PDecl
854pData :: SyntaxInfo -> IParser PDecl
855+pData syn = try (do push_indent
791−pData syn = try (do acc <- pAccessibility
856+ acc <- pAccessibility
792 reserved "data"; fc <- pfc
857 reserved "data"; fc <- pfc
793 tyn_in <- pfName; ty <- pTSig syn
858 tyn_in <- pfName; ty <- pTSig syn
794 let tyn = expandNS syn tyn_in
859 let tyn = expandNS syn tyn_in
795 reserved "where"
860 reserved "where"
796-- ty' <- implicit syn tyn ty
861-- ty' <- implicit syn tyn ty
797 cons <- sepBy (pConstructor syn) (lchar '|')
862 cons <- sepBy (pConstructor syn) (lchar '|')
798− lchar ';'
863+ pTerminator
799 accData acc tyn (map (\ (n, _, _) -> n) cons)
864 accData acc tyn (map (\ (n, _, _) -> n) cons)
800 return $ PData syn fc (PDatadecl tyn ty cons))
865 return $ PData syn fc (PDatadecl tyn ty cons))
801− <|> do acc <- pAccessibility
867+ acc <- pAccessibility
802 reserved "data"; fc <- pfc
868 reserved "data"; fc <- pfc
803 tyn_in <- pfName; args <- many pName
869 tyn_in <- pfName; args <- many pName
804 let tyn = expandNS syn tyn_in
870 let tyn = expandNS syn tyn_in
805 lchar '='
871 lchar '='
806 cons <- sepBy1 (pSimpleCon syn) (lchar '|')
872 cons <- sepBy1 (pSimpleCon syn) (lchar '|')
807− lchar ';'
873+ pTerminator
808 let conty = mkPApp fc (PRef fc tyn) (map (PRef fc) args)
874 let conty = mkPApp fc (PRef fc tyn) (map (PRef fc) args)
809 let ty = bindArgs (map (\a -> PSet) args) PSet
875 let ty = bindArgs (map (\a -> PSet) args) PSet
810-- ty' <- implicit syn tyn ty
876-- ty' <- implicit syn tyn ty
@@ -835,7 +901,8 @@ pSimpleCon syn
835 = do cn_in <- pfName
901 = do cn_in <- pfName
836 let cn = expandNS syn cn_in
902 let cn = expandNS syn cn_in
837 fc <- pfc
903 fc <- pfc
904+ args <- many (do notEndApp
838− args <- many (pSimpleExpr syn)
905+ pSimpleExpr syn)
839 return (cn, args, fc)
906 return (cn, args, fc)
841--------- Pattern match clauses ---------
908--------- Pattern match clauses ---------
@@ -859,7 +926,8 @@ pRHS syn n = do lchar '='; pExpr syn
860pClause :: SyntaxInfo -> IParser PClause
927pClause :: SyntaxInfo -> IParser PClause
861pClause syn
928pClause syn
929+ = try (do push_indent
862− = try (do n_in <- pfName; let n = expandNS syn n_in
930+ n_in <- pfName; let n = expandNS syn n_in
863 cargs <- many (pConstraintArg syn)
931 cargs <- many (pConstraintArg syn)
864 iargs <- many (pImplicitArg syn)
932 iargs <- many (pImplicitArg syn)
865 fc <- pfc
933 fc <- pfc
@@ -869,15 +937,18 @@ pClause syn
869 ist <- getState
937 ist <- getState
870 let ctxt = tt_ctxt ist
938 let ctxt = tt_ctxt ist
871 let wsyn = syn { syn_namespace = [] }
939 let wsyn = syn { syn_namespace = [] }
872− (wheres, nmap) <- choice [pWhereblock n wsyn,
940+ (wheres, nmap) <- choice [do x <- pWhereblock n wsyn
873− do lchar ';'
941+ pop_indent
874 return ([], [])]
944 return ([], [])]
875 let capp = PApp fc (PRef fc n)
945 let capp = PApp fc (PRef fc n)
876 (iargs ++ cargs ++ map pexp args)
946 (iargs ++ cargs ++ map pexp args)
877 ist <- getState
947 ist <- getState
878 setState (ist { lastParse = Just n })
948 setState (ist { lastParse = Just n })
879 return $ PClause n capp wargs rhs wheres)
949 return $ PClause n capp wargs rhs wheres)
950+ <|> try (do push_indent
880− <|> try (do wargs <- many1 (pWExpr syn)
951+ wargs <- many1 (pWExpr syn)
881 ist <- getState
952 ist <- getState
882 n <- case lastParse ist of
953 n <- case lastParse ist of
883 Just t -> return t
954 Just t -> return t
@@ -885,12 +956,15 @@ pClause syn
885 rhs <- pRHS syn n
956 rhs <- pRHS syn n
886 let ctxt = tt_ctxt ist
957 let ctxt = tt_ctxt ist
887 let wsyn = syn { syn_namespace = [] }
958 let wsyn = syn { syn_namespace = [] }
888− (wheres, nmap) <- choice [pWhereblock n wsyn,
959+ (wheres, nmap) <- choice [do x <- pWhereblock n wsyn
889− do lchar ';'
960+ pop_indent
890 return ([], [])]
963 return ([], [])]
891 return $ PClauseR wargs rhs wheres)
964 return $ PClauseR wargs rhs wheres)
966+ <|> try (do push_indent
893− <|> try (do n_in <- pfName; let n = expandNS syn n_in
967+ n_in <- pfName; let n = expandNS syn n_in
894 cargs <- many (pConstraintArg syn)
968 cargs <- many (pConstraintArg syn)
895 iargs <- many (pImplicitArg syn)
969 iargs <- many (pImplicitArg syn)
896 fc <- pfc
970 fc <- pfc
@@ -906,6 +980,7 @@ pClause syn
906 lchar '}'
980 lchar '}'
907 ist <- getState
981 ist <- getState
908 setState (ist { lastParse = Just n })
982 setState (ist { lastParse = Just n })
909 return $ PWith n capp wargs wval withs)
984 return $ PWith n capp wargs wval withs)
911 <|> try (do wargs <- many1 (pWExpr syn)
986 <|> try (do wargs <- many1 (pWExpr syn)
@@ -917,7 +992,8 @@ pClause syn
917 lchar '}'
992 lchar '}'
918 return $ PWithR wargs wval withs)
993 return $ PWithR wargs wval withs)
920− <|> do l <- pArgExpr syn
996+ l <- pArgExpr syn
921 op <- operator
997 op <- operator
922 let n = expandNS syn (UN op)
998 let n = expandNS syn (UN op)
923 r <- pArgExpr syn
999 r <- pArgExpr syn
@@ -925,8 +1001,10 @@ pClause syn
925 wargs <- many (pWExpr syn)
1001 wargs <- many (pWExpr syn)
926 rhs <- pRHS syn n
1002 rhs <- pRHS syn n
927 let wsyn = syn { syn_namespace = [] }
1003 let wsyn = syn { syn_namespace = [] }
928− (wheres, nmap) <- choice [pWhereblock n wsyn,
1004+ (wheres, nmap) <- choice [do x <- pWhereblock n wsyn
929− do lchar ';'
1005+ pop_indent
930 return ([], [])]
1008 return ([], [])]
931 ist <- getState
1009 ist <- getState
932 let capp = PApp fc (PRef fc n) [pexp l, pexp r]
1010 let capp = PApp fc (PRef fc n) [pexp l, pexp r]