@@ -161,7 +161,7 @@ last_indent :: IParser Int
161161last_indent = do ist <- getState
162162 case indent_stack ist of
163163 (x : xs) -> return x
164− _ -> return (-1)
164+ _ -> return 1
165165
166166indent :: IParser Int
167167indent = do pos <- getPosition
@@ -172,11 +172,32 @@ pop_indent = do ist <- getState
172172 let (x : xs) = indent_stack ist
173173 setState (ist { indent_stack = xs })
174174
175+open_block :: IParser ()
176+open_block = do lchar '{'
177+ ist <- getState
178+ setState (ist { brace_stack = Nothing : brace_stack ist })
179+ <|> do ist <- getState
180+ lvl <- indent
181+ setState (ist { brace_stack = Just lvl : brace_stack ist })
182+
183+close_block :: IParser ()
184+close_block = do ist <- getState
185+ bs <- case brace_stack ist of
186+ Nothing : xs -> do lchar '}'
187+ return xs
188+ Just lvl : xs -> do i <- indent
189+ inp <- getInput
190+-- trace (show (take 10 inp, i, lvl)) $
191+ if (i >= lvl && take 1 inp /= ")")
192+ then fail "Not end of block"
193+ else return xs
194+ setState (ist { brace_stack = bs })
195+
175196pTerminator = do lchar ';'; pop_indent
176197 <|> do c <- indent; l <- last_indent
177198 if (c <= l) then pop_indent
178199 else fail "Not a terminator"
179− <|> do i <- getInput; if (take 1 i == "}") then pop_indent
200+ <|> do i <- getInput; if (take 1 i == "}" || take 1 i == ")") then pop_indent
180201 else fail "Not a terminator"
181202 <|> lookAhead eof
182203
@@ -189,6 +210,20 @@ pKeepTerminator
189210 else fail "Not a terminator"
190211 <|> lookAhead eof
191212
213+notEndApp = do c <- indent; l <- last_indent
214+ i <- getInput
215+ if (c <= l) then fail "Terminator"
216+ else return ()
217+
218+notEndBlock = do ist <- getState
219+ case brace_stack ist of
220+ Just lvl : xs -> do i <- indent
221+ inp <- getInput
222+ if (i < lvl || take 1 inp == ")")
223+ then fail "End of block"
224+ else return ()
225+ _ -> return ()
226+
192227pfc :: IParser FC
193228pfc = do s <- getPosition
194229 let (dir, file) = splitFileName (sourceName s)
@@ -252,7 +287,9 @@ pFullExpr syn
252287 return $ desugar syn i x
253288
254289pDecl :: SyntaxInfo -> IParser [PDecl]
255−pDecl syn
290+pDecl syn = do notEndBlock
291+ pDeclBody where
292+ pDeclBody
256293 = do d <- pDecl' syn
257294 i <- getState
258295 let d' = fmap (desugar syn i) d
@@ -270,7 +307,8 @@ pDecl syn
270307
271308pFunDecl :: SyntaxInfo -> IParser [PDecl]
272309pFunDecl syn
273− = try (do d <- pFunDecl' syn
310+ = try (do notEndBlock
311+ d <- pFunDecl' syn
274312 i <- getState
275313 let d' = fmap (desugar syn i) d
276314 return [d'])
@@ -351,10 +389,10 @@ pUsing syn =
351389 lchar '('
352390 ns <- tyDeclList syn
353391 lchar ')'
354− lchar '{'
392+ open_block
355393 let uvars = using syn
356394 ds <- many1 (pDecl (syn { using = uvars ++ ns }))
357− lchar '}'
395+ close_block
358396 return (concat ds)
359397
360398pParams :: SyntaxInfo -> IParser [PDecl]
@@ -374,9 +412,9 @@ pNamespace :: SyntaxInfo -> IParser [PDecl]
374412pNamespace syn =
375413 do reserved "namespace";
376414 n <- identifier
377− lchar '{'
415+ open_block
378416 ds <- many1 (pDecl syn { syn_namespace = n : syn_namespace syn })
379− lchar '}'
417+ close_block
380418 return [PNamespace n (concat ds)]
381419
382420expandNS :: SyntaxInfo -> Name -> Name
@@ -415,9 +453,9 @@ pClass syn = do acc <- pAccessibility
415453 cons <- pConstList syn
416454 n_in <- pName; let n = expandNS syn n_in
417455 cs <- many1 carg
418− reserved "where"; lchar '{'
419− ds <- many1 $ pFunDecl syn;
420− lchar '}'
456+ reserved "where"; open_block
457+ ds <- many1 $ pFunDecl syn
458+ close_block
421459 let allDs = concat ds
422460 accData acc n (concatMap declared allDs)
423461 return [PClass syn fc cons n cs allDs]
@@ -435,9 +473,9 @@ pInstance syn = do reserved "instance"
435473 args <- many1 (pSimpleExpr syn)
436474 let sc = PApp fc (PRef fc cn) (map pexp args)
437475 let t = bindList (PPi constraint) (map (\x -> (MN 0 "c", x)) cs) sc
438− reserved "where"; lchar '{'
439− ds <- many1 $ pFunDecl syn;
440− lchar '}'
476+ reserved "where"; open_block
477+ ds <- many1 $ pFunDecl syn
478+ close_block
441479 return [PInstance syn fc cs cn args t (concat ds)]
442480
443481--------- Expressions ---------
@@ -565,9 +603,9 @@ pSimpleExpr syn =
565603 lchar '}'
566604 return (PTactics ts)
567605 <|> do reserved "case"; fc <- pfc; scr <- pExpr syn; reserved "of";
568− lchar '{'
606+ open_block
569607 opts <- sepBy1 (pCaseOpt syn) (lchar '|')
570− lchar '}'
608+ close_block
571609 return (PCase fc scr opts)
572610 <|> try (do x <- pfName; fc <- pfc; return (PRef fc x))
573611 <|> try (pList syn)
@@ -661,15 +699,6 @@ pApp syn = do f <- pSimpleExpr syn
661699 pArg syn)
662700 return (PApp fc f args)
663701
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−
673702pArg :: SyntaxInfo -> IParser PArg
674703pArg syn = try (pImplicitArg syn)
675704 <|> try (pConstraintArg syn)
@@ -774,11 +803,11 @@ pComprehension syn
774803 addGuard x = x
775804
776805pDoBlock syn
777− = do reserved "do"; lchar '{'
806+ = do reserved "do"; open_block
778807 push_indent
779− ds <- many1 (do x <- pDo syn; pKeepTerminator; return x)
808+ ds <- many1 (do notEndBlock; x <- pDo syn; pKeepTerminator; return x)
780809 pop_indent
781− lchar '}'
810+ close_block
782811 return (PDoBlock ds)
783812
784813pDo syn
@@ -973,11 +1002,11 @@ pClause syn
9731002 let capp = PApp fc (PRef fc n)
9741003 (iargs ++ cargs ++ map pexp args)
9751004 reserved "with"
976− wval <- pExpr syn
977− lchar '{'
1005+ wval <- pSimpleExpr syn
1006+ open_block
9781007 ds <- many1 $ pFunDecl syn
9791008 let withs = map (fillLHSD n capp wargs) $ concat ds
980− lchar '}'
1009+ close_block
9811010 ist <- getState
9821011 setState (ist { lastParse = Just n })
9831012 pop_indent
@@ -985,11 +1014,11 @@ pClause syn
9851014
9861015 <|> try (do wargs <- many1 (pWExpr syn)
9871016 reserved "with"
988− wval <- pExpr syn
989− lchar '{'
1017+ wval <- pSimpleExpr syn
1018+ open_block
9901019 ds <- many1 $ pFunDecl syn
9911020 let withs = concat ds
992− lchar '}'
1021+ close_block
9931022 return $ PWithR wargs wval withs)
9941023
9951024 <|> do push_indent
@@ -1018,10 +1047,10 @@ pClause syn
10181047 fc <- pfc
10191048 wargs <- many (pWExpr syn)
10201049 reserved "with"
1021− wval <- pExpr syn
1022− lchar '{'
1050+ wval <- pSimpleExpr syn
1051+ open_block
10231052 ds <- many1 $ pFunDecl syn
1024− lchar '}'
1053+ close_block
10251054 ist <- getState
10261055 let capp = PApp fc (PRef fc n) [pexp l, pexp r]
10271056 let withs = map (fillLHSD n capp wargs) $ concat ds
@@ -1043,10 +1072,10 @@ pWExpr syn = do lchar '|'; pExpr' syn
10431072
10441073pWhereblock :: Name -> SyntaxInfo -> IParser ([PDecl], [(Name, Name)])
10451074pWhereblock n syn
1046− = do reserved "where"; lchar '{'
1047− ds <- many1 $ pFunDecl syn;
1075+ = do reserved "where"; open_block
1076+ ds <- many1 $ pFunDecl syn
10481077 let dns = concatMap (concatMap declared) ds
1049− lchar '}';
1078+ close_block
10501079 return (concat ds, map (\x -> (x, decoration syn x)) dns)
10511080
10521081pDirective :: IParser [PDecl]