@@ -140,17 +140,54 @@ parseImports fname input
140140 Right (x, i) -> do put i
141141 return x
142142 where ishow err = let ln = sourceLine (errorPos err) in
143− fname ++ ":" ++ show ln ++ ":parse error"
143+ fname ++ ":" ++ show ln ++ ":parse error"
144144-- show (map messageString (errorMessages err))
145145
146146pHeader :: IParser [String]
147−pHeader = try (do reserved "module"; i <- identifier; lchar ';'
147+pHeader = try (do reserved "module"; i <- identifier; option ';' (lchar ';')
148148 return (parseName i))
149149 <|> return []
150150 where parseName x = case span (/='.') x of
151151 (x, "") -> [x]
152152 (x, '.':y) -> x : parseName y
153153
154+push_indent :: IParser ()
155+push_indent = do pos <- getPosition
156+ ist <- getState
157+ setState (ist { indent_stack = sourceColumn pos :
158+ indent_stack ist })
159+
160+last_indent :: IParser Int
161+last_indent = do ist <- getState
162+ case indent_stack ist of
163+ (x : xs) -> return x
164+ _ -> return (-1)
165+
166+indent :: IParser Int
167+indent = do pos <- getPosition
168+ return (sourceColumn pos)
169+
170+pop_indent :: IParser ()
171+pop_indent = do ist <- getState
172+ let (x : xs) = indent_stack ist
173+ setState (ist { indent_stack = xs })
174+
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"
181+ <|> lookAhead eof
182+
183+pKeepTerminator
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"
190+ <|> lookAhead eof
154191
155192pfc :: IParser FC
156193pfc = do s <- getPosition
@@ -163,7 +200,7 @@ pfc = do s <- getPosition
163200pImport :: IParser String
164201pImport = do reserved "import"
165202 f <- identifier
166− lchar ';'
203+ option ';' (lchar ';')
167204 return (map dot f)
168205 where dot '.' = '/'
169206 dot c = c
@@ -182,6 +219,7 @@ parseProg syn fname input pos
182219 return (collect x)
183220 where ishow err = let ln = sourceLine (errorPos err) in
184221 fname ++ ":" ++ show ln ++ ":parse error"
222+ ++ " " ++ show (sourceColumn (errorPos err))
185223-- show (map messageString (errorMessages err))
186224
187225-- Collect PClauses with the same function name
@@ -244,7 +282,7 @@ pDecl' syn
244282 = try pFixity
245283 <|> pFunDecl' syn
246284 <|> try (pData syn)
247− <|> try (pSyntaxDecl syn)
285+ <|> pSyntaxDecl syn
248286
249287pSyntaxDecl :: SyntaxInfo -> IParser PDecl
250288pSyntaxDecl syn
@@ -267,7 +305,8 @@ pSyntaxDecl syn
267305
268306pSyntaxRule :: SyntaxInfo -> IParser Syntax
269307pSyntaxRule syn
270− = do sty <- option AnySyntax (do reserved "term"; return TermSyntax
308+ = do push_indent
309+ sty <- option AnySyntax (do reserved "term"; return TermSyntax
271310 <|> do reserved "pattern"; return PatternSyntax)
272311 reserved "syntax"
273312 syms <- many1 pSynSym
@@ -277,7 +316,7 @@ pSyntaxRule syn
277316 $ fail "Repeated variable in syntax rule"
278317 lchar '='
279318 tm <- pExpr syn
280− lchar ';'
319+ pTerminator
281320 return (Rule syms tm sty)
282321 where
283322 expr (Expr _) = True
@@ -294,12 +333,13 @@ pSynSym = try (do lchar '['; n <- pName; lchar ']'
294333 return (Symbol sym)
295334
296335pFunDecl' :: SyntaxInfo -> IParser PDecl
297−pFunDecl' syn = try (do acc <- pAccessibility
336+pFunDecl' syn = try (do push_indent
337+ acc <- pAccessibility
298338 n_in <- pfName
299339 let n = expandNS syn n_in
300340 ty <- pTSig syn
301341 fc <- pfc
302− lchar ';'
342+ pTerminator
303343-- ty' <- implicit syn n ty
304344 addAcc n acc
305345 return (PTy syn fc n ty))
@@ -348,8 +388,9 @@ expandNS syn n = case syn_namespace syn of
348388--------- Fixity ---------
349389
350390pFixity :: IParser PDecl
351−pFixity = do f <- fixity; i <- natural; ops <- sepBy1 operator (lchar ',')
352− lchar ';'
391+pFixity = do push_indent
392+ f <- fixity; i <- natural; ops <- sepBy1 operator (lchar ',')
393+ pTerminator
353394 let prec = fromInteger i
354395 istate <- getState
355396 let fs = map (Fix (f prec)) ops
@@ -428,12 +469,12 @@ pSimpleExtExpr syn = do i <- getState
428469
429470pNoExtExpr syn =
430471 try (pApp syn)
431− <|> try (pComprehension syn)
432− <|> pSimpleExpr syn
472+ <|> try (pSimpleExpr syn)
433473 <|> pLambda syn
434474 <|> pLet syn
435475 <|> pPi syn
436476 <|> pDoBlock syn
477+ <|> pComprehension syn
437478
438479pExtensions :: SyntaxInfo -> [Syntax] -> IParser PTerm
439480pExtensions syn rules = choice (map (\x -> try (pExt syn x)) (filter valid rules))
@@ -529,19 +570,10 @@ pSimpleExpr syn =
529570 lchar '}'
530571 return (PCase fc scr opts)
531572 <|> try (do x <- pfName; fc <- pfc; return (PRef fc x))
532− <|> try (pPair syn)
533573 <|> try (pList syn)
534574 <|> try (pAlt syn)
535575 <|> try (pIdiom syn)
536− <|> try (do lchar '('; e <- pExpr syn; lchar ')'; return e)
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")),
540− pexp e]))
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"))]))
576+ <|> try (do lchar '('; bracketed syn)
545577 <|> try (do c <- pConstant; fc <- pfc
546578 return (modifyConst syn fc (PConstant c)))
547579 <|> do reserved "Set"; return PSet
@@ -550,6 +582,18 @@ pSimpleExpr syn =
550582 <|> do lchar '_'; return Placeholder
551583 <|> pSimpleExtExpr syn
552584
585+bracketed syn =
586+ try (pPair 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")),
591+ pexp e]))
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"))]))
596+
553597pCaseOpt :: SyntaxInfo -> IParser (PTerm, PTerm)
554598pCaseOpt syn = do lhs <- pExpr syn; symbol "=>";
555599 rhs <- pExpr syn
@@ -568,28 +612,37 @@ pList syn = do lchar '['; fc <- pfc
568612 mkList fc [] = PRef fc (UN "Nil")
569613 mkList fc (x : xs) = PApp fc (PRef fc (UN "::")) [pexp x, pexp (mkList fc xs)]
570614
571−pPair syn = try (do lchar '('; l <- pExpr syn; op <- pairOp
615+pPair syn = try (do l <- pExpr syn
572616 fc <- pfc
573− r <- pExpr syn; lchar ')';
574− return (op fc l r))
575− <|> try (do lchar '('; x <- ntuple
617+ rest <- restTuple
618+ case rest of
619+ [] -> return l
620+ [Left r] -> return (PPair fc l r)
621+ [Right r] -> return (PDPair fc l Placeholder r))
622+ <|> try (do x <- ntuple
576623 lchar ')'
577624 return x)
578− <|> do lchar '('; ln <- pName; lchar ':'; lty <- pExpr syn;
625+ <|> do ln <- pName; lchar ':'; lty <- pExpr syn;
579626 reservedOp "**";
580627 fc <- pfc
581628 r <- pExpr syn; lchar ')';
582629 return (PDPair fc (PRef fc ln) lty r)
583630 where
631+ restTuple = do lchar ')'; return []
632+ <|> do lchar ','
633+ r <- pExpr syn
634+ lchar ')'
635+ return [Left r]
636+ <|> do reservedOp "**"
637+ r <- pExpr syn
638+ lchar ')'
639+ return [Right r]
584640 ntuple = try (do l <- pExpr syn; fc <- pfc; lchar ','
585641 rest <- ntuple
586642 return (PPair fc l rest))
587643 <|> (do l <- pExpr syn; fc <- pfc; lchar ','
588644 r <- pExpr syn
589645 return (PPair fc l r))
590−
591− pairOp = do lchar ','; return PPair
592− <|> do reservedOp "**"; return (\f x y -> PDPair f x Placeholder y)
593646
594647pAlt syn = do symbol "(|";
595648 alts <- sepBy1 (pExpr' syn) (lchar ',')
@@ -604,9 +657,19 @@ pHSimpleExpr syn
604657
605658pApp syn = do f <- pSimpleExpr syn
606659 fc <- pfc
607− args <- many1 (pArg syn)
660+ args <- many1 (do notEndApp
661+ pArg syn)
608662 return (PApp fc f args)
609663
664+notEndApp = do c <- indent; l <- last_indent
665+ i <- getInput
666+ if (c <= l || take 1 i == "}"
667+ || take 1 i == ")"
668+ || take 1 i == ","
669+ || take 2 i == "->"
670+ || take 2 i == "=>") then fail "Terminator"
671+ else return ()
672+
610673pArg :: SyntaxInfo -> IParser PArg
611674pArg syn = try (pImplicitArg syn)
612675 <|> try (pConstraintArg syn)
@@ -627,18 +690,17 @@ pTSig syn = do lchar ':'
627690 sc <- pExpr syn
628691 return (bindList (PPi constraint) (map (\x -> (MN 0 "c", x)) cs) sc)
629692
630−pLambda syn = try (do lchar '\\';
631− xt <- tyOptDeclList syn
632− symbol "=>"
633− sc <- pExpr syn
634− return (bindList PLam xt sc))
635− <|> (do lchar '\\'
636− ps <- sepBy (do fc <- pfc
637− e <- pSimpleExpr syn
638− return (fc, e)) (lchar ',')
639− symbol "=>"
640− sc <- pExpr syn
641− return (pmList (zip [0..] ps) sc))
693+pLambda syn = do lchar '\\'
694+ (try (do xt <- tyOptDeclList syn
695+ symbol "=>"
696+ sc <- pExpr syn
697+ return (bindList PLam xt sc))
698+ <|> (do ps <- sepBy (do fc <- pfc
699+ e <- pSimpleExpr syn
700+ return (fc, e)) (lchar ',')
701+ symbol "=>"
702+ sc <- pExpr syn
703+ return (pmList (zip [0..] ps) sc)))
642704 where pmList [] sc = sc
643705 pmList ((i, (fc, x)) : xs) sc
644706 = PLam (MN i "lamp") Placeholder
@@ -713,7 +775,9 @@ pComprehension syn
713775
714776pDoBlock syn
715777 = do reserved "do"; lchar '{'
716− ds <- endBy1 (pDo syn) (lchar ';')
778+ push_indent
779+ ds <- many1 (do x <- pDo syn; pKeepTerminator; return x)
780+ pop_indent
717781 lchar '}'
718782 return (PDoBlock ds)
719783
@@ -788,23 +852,25 @@ accData (Just Frozen) n ns = do addAcc n (Just Frozen)
788852accData a n ns = do addAcc n a; mapM_ (\n -> addAcc n a) ns
789853
790854pData :: SyntaxInfo -> IParser PDecl
791−pData syn = try (do acc <- pAccessibility
855+pData syn = try (do push_indent
856+ acc <- pAccessibility
792857 reserved "data"; fc <- pfc
793858 tyn_in <- pfName; ty <- pTSig syn
794859 let tyn = expandNS syn tyn_in
795860 reserved "where"
796861-- ty' <- implicit syn tyn ty
797862 cons <- sepBy (pConstructor syn) (lchar '|')
798− lchar ';'
863+ pTerminator
799864 accData acc tyn (map (\ (n, _, _) -> n) cons)
800865 return $ PData syn fc (PDatadecl tyn ty cons))
801− <|> do acc <- pAccessibility
866+ <|> do push_indent
867+ acc <- pAccessibility
802868 reserved "data"; fc <- pfc
803869 tyn_in <- pfName; args <- many pName
804870 let tyn = expandNS syn tyn_in
805871 lchar '='
806872 cons <- sepBy1 (pSimpleCon syn) (lchar '|')
807− lchar ';'
873+ pTerminator
808874 let conty = mkPApp fc (PRef fc tyn) (map (PRef fc) args)
809875 let ty = bindArgs (map (\a -> PSet) args) PSet
810876-- ty' <- implicit syn tyn ty
@@ -835,7 +901,8 @@ pSimpleCon syn
835901 = do cn_in <- pfName
836902 let cn = expandNS syn cn_in
837903 fc <- pfc
838− args <- many (pSimpleExpr syn)
904+ args <- many (do notEndApp
905+ pSimpleExpr syn)
839906 return (cn, args, fc)
840907
841908--------- Pattern match clauses ---------
@@ -859,7 +926,8 @@ pRHS syn n = do lchar '='; pExpr syn
859926
860927pClause :: SyntaxInfo -> IParser PClause
861928pClause syn
862− = try (do n_in <- pfName; let n = expandNS syn n_in
929+ = try (do push_indent
930+ n_in <- pfName; let n = expandNS syn n_in
863931 cargs <- many (pConstraintArg syn)
864932 iargs <- many (pImplicitArg syn)
865933 fc <- pfc
@@ -869,15 +937,18 @@ pClause syn
869937 ist <- getState
870938 let ctxt = tt_ctxt ist
871939 let wsyn = syn { syn_namespace = [] }
872− (wheres, nmap) <- choice [pWhereblock n wsyn,
873− do lchar ';'
940+ (wheres, nmap) <- choice [do x <- pWhereblock n wsyn
941+ pop_indent
942+ return x,
943+ do pTerminator
874944 return ([], [])]
875945 let capp = PApp fc (PRef fc n)
876946 (iargs ++ cargs ++ map pexp args)
877947 ist <- getState
878948 setState (ist { lastParse = Just n })
879949 return $ PClause n capp wargs rhs wheres)
880− <|> try (do wargs <- many1 (pWExpr syn)
950+ <|> try (do push_indent
951+ wargs <- many1 (pWExpr syn)
881952 ist <- getState
882953 n <- case lastParse ist of
883954 Just t -> return t
@@ -885,12 +956,15 @@ pClause syn
885956 rhs <- pRHS syn n
886957 let ctxt = tt_ctxt ist
887958 let wsyn = syn { syn_namespace = [] }
888− (wheres, nmap) <- choice [pWhereblock n wsyn,
889− do lchar ';'
959+ (wheres, nmap) <- choice [do x <- pWhereblock n wsyn
960+ pop_indent
961+ return x,
962+ do pTerminator
890963 return ([], [])]
891964 return $ PClauseR wargs rhs wheres)
892965
893− <|> try (do n_in <- pfName; let n = expandNS syn n_in
966+ <|> try (do push_indent
967+ n_in <- pfName; let n = expandNS syn n_in
894968 cargs <- many (pConstraintArg syn)
895969 iargs <- many (pImplicitArg syn)
896970 fc <- pfc
@@ -906,6 +980,7 @@ pClause syn
906980 lchar '}'
907981 ist <- getState
908982 setState (ist { lastParse = Just n })
983+ pop_indent
909984 return $ PWith n capp wargs wval withs)
910985
911986 <|> try (do wargs <- many1 (pWExpr syn)
@@ -917,7 +992,8 @@ pClause syn
917992 lchar '}'
918993 return $ PWithR wargs wval withs)
919994
920− <|> do l <- pArgExpr syn
995+ <|> do push_indent
996+ l <- pArgExpr syn
921997 op <- operator
922998 let n = expandNS syn (UN op)
923999 r <- pArgExpr syn
@@ -925,8 +1001,10 @@ pClause syn
9251001 wargs <- many (pWExpr syn)
9261002 rhs <- pRHS syn n
9271003 let wsyn = syn { syn_namespace = [] }
928− (wheres, nmap) <- choice [pWhereblock n wsyn,
929− do lchar ';'
1004+ (wheres, nmap) <- choice [do x <- pWhereblock n wsyn
1005+ pop_indent
1006+ return x,
1007+ do pTerminator
9301008 return ([], [])]
9311009 ist <- getState
9321010 let capp = PApp fc (PRef fc n) [pexp l, pexp r]