@@ -161,7 +161,7 @@ last_indent :: IParser Int
161last_indent = do ist <- getState
161last_indent = do ist <- getState
162 case indent_stack ist of
162 case indent_stack ist of
163 (x : xs) -> return x
163 (x : xs) -> return x
164− _ -> return (-1)
164+ _ -> return 1
166indent :: IParser Int
166indent :: IParser Int
167indent = do pos <- getPosition
167indent = do pos <- getPosition
@@ -172,11 +172,32 @@ pop_indent = do ist <- getState
172 let (x : xs) = indent_stack ist
172 let (x : xs) = indent_stack ist
173 setState (ist { indent_stack = xs })
173 setState (ist { indent_stack = xs })
175+open_block :: IParser ()
176+open_block = do lchar '{'
178+ setState (ist { brace_stack = Nothing : brace_stack ist })
179+ <|> do ist <- getState
181+ setState (ist { brace_stack = Just lvl : brace_stack ist })
183+close_block :: IParser ()
184+close_block = do ist <- getState
185+ bs <- case brace_stack ist of
186+ Nothing : xs -> do lchar '}'
188+ Just lvl : xs -> do i <- indent
190+-- trace (show (take 10 inp, i, lvl)) $
191+ if (i >= lvl && take 1 inp /= ")")
192+ then fail "Not end of block"
194+ setState (ist { brace_stack = bs })
175pTerminator = do lchar ';'; pop_indent
196pTerminator = do lchar ';'; pop_indent
176 <|> do c <- indent; l <- last_indent
197 <|> do c <- indent; l <- last_indent
177 if (c <= l) then pop_indent
198 if (c <= l) then pop_indent
178 else fail "Not a terminator"
199 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
180 else fail "Not a terminator"
201 else fail "Not a terminator"
181 <|> lookAhead eof
202 <|> lookAhead eof
@@ -189,6 +210,20 @@ pKeepTerminator
189 else fail "Not a terminator"
210 else fail "Not a terminator"
190 <|> lookAhead eof
211 <|> lookAhead eof
213+notEndApp = do c <- indent; l <- last_indent
215+ if (c <= l) then fail "Terminator"
218+notEndBlock = do ist <- getState
219+ case brace_stack ist of
220+ Just lvl : xs -> do i <- indent
222+ if (i < lvl || take 1 inp == ")")
223+ then fail "End of block"
192pfc :: IParser FC
227pfc :: IParser FC
193pfc = do s <- getPosition
228pfc = do s <- getPosition
194 let (dir, file) = splitFileName (sourceName s)
229 let (dir, file) = splitFileName (sourceName s)
@@ -252,7 +287,9 @@ pFullExpr syn
252 return $ desugar syn i x
287 return $ desugar syn i x
254pDecl :: SyntaxInfo -> IParser [PDecl]
289pDecl :: SyntaxInfo -> IParser [PDecl]
255−pDecl syn
290+pDecl syn = do notEndBlock
256 = do d <- pDecl' syn
293 = do d <- pDecl' syn
257 i <- getState
294 i <- getState
258 let d' = fmap (desugar syn i) d
295 let d' = fmap (desugar syn i) d
@@ -270,7 +307,8 @@ pDecl syn
271pFunDecl :: SyntaxInfo -> IParser [PDecl]
308pFunDecl :: SyntaxInfo -> IParser [PDecl]
272pFunDecl syn
309pFunDecl syn
310+ = try (do notEndBlock
273− = try (do d <- pFunDecl' syn
311+ d <- pFunDecl' syn
274 i <- getState
312 i <- getState
275 let d' = fmap (desugar syn i) d
313 let d' = fmap (desugar syn i) d
276 return [d'])
314 return [d'])
@@ -351,10 +389,10 @@ pUsing syn =
351 lchar '('
389 lchar '('
352 ns <- tyDeclList syn
390 ns <- tyDeclList syn
353 lchar ')'
391 lchar ')'
354− lchar '{'
392+ open_block
355 let uvars = using syn
393 let uvars = using syn
356 ds <- many1 (pDecl (syn { using = uvars ++ ns }))
394 ds <- many1 (pDecl (syn { using = uvars ++ ns }))
357− lchar '}'
395+ close_block
358 return (concat ds)
396 return (concat ds)
360pParams :: SyntaxInfo -> IParser [PDecl]
398pParams :: SyntaxInfo -> IParser [PDecl]
@@ -374,9 +412,9 @@ pNamespace :: SyntaxInfo -> IParser [PDecl]
374pNamespace syn =
412pNamespace syn =
375 do reserved "namespace";
413 do reserved "namespace";
376 n <- identifier
414 n <- identifier
377− lchar '{'
415+ open_block
378 ds <- many1 (pDecl syn { syn_namespace = n : syn_namespace syn })
416 ds <- many1 (pDecl syn { syn_namespace = n : syn_namespace syn })
379− lchar '}'
417+ close_block
380 return [PNamespace n (concat ds)]
418 return [PNamespace n (concat ds)]
382expandNS :: SyntaxInfo -> Name -> Name
420expandNS :: SyntaxInfo -> Name -> Name
@@ -415,9 +453,9 @@ pClass syn = do acc <- pAccessibility
415 cons <- pConstList syn
453 cons <- pConstList syn
416 n_in <- pName; let n = expandNS syn n_in
454 n_in <- pName; let n = expandNS syn n_in
417 cs <- many1 carg
455 cs <- many1 carg
418− reserved "where"; lchar '{'
456+ reserved "where"; open_block
419− ds <- many1 $ pFunDecl syn;
457+ ds <- many1 $ pFunDecl syn
420− lchar '}'
458+ close_block
421 let allDs = concat ds
459 let allDs = concat ds
422 accData acc n (concatMap declared allDs)
460 accData acc n (concatMap declared allDs)
423 return [PClass syn fc cons n cs allDs]
461 return [PClass syn fc cons n cs allDs]
@@ -435,9 +473,9 @@ pInstance syn = do reserved "instance"
435 args <- many1 (pSimpleExpr syn)
473 args <- many1 (pSimpleExpr syn)
436 let sc = PApp fc (PRef fc cn) (map pexp args)
474 let sc = PApp fc (PRef fc cn) (map pexp args)
437 let t = bindList (PPi constraint) (map (\x -> (MN 0 "c", x)) cs) sc
475 let t = bindList (PPi constraint) (map (\x -> (MN 0 "c", x)) cs) sc
438− reserved "where"; lchar '{'
476+ reserved "where"; open_block
439− ds <- many1 $ pFunDecl syn;
477+ ds <- many1 $ pFunDecl syn
440− lchar '}'
478+ close_block
441 return [PInstance syn fc cs cn args t (concat ds)]
479 return [PInstance syn fc cs cn args t (concat ds)]
443--------- Expressions ---------
481--------- Expressions ---------
@@ -565,9 +603,9 @@ pSimpleExpr syn =
565 lchar '}'
603 lchar '}'
566 return (PTactics ts)
604 return (PTactics ts)
567 <|> do reserved "case"; fc <- pfc; scr <- pExpr syn; reserved "of";
605 <|> do reserved "case"; fc <- pfc; scr <- pExpr syn; reserved "of";
568− lchar '{'
606+ open_block
569 opts <- sepBy1 (pCaseOpt syn) (lchar '|')
607 opts <- sepBy1 (pCaseOpt syn) (lchar '|')
570− lchar '}'
608+ close_block
571 return (PCase fc scr opts)
609 return (PCase fc scr opts)
572 <|> try (do x <- pfName; fc <- pfc; return (PRef fc x))
610 <|> try (do x <- pfName; fc <- pfc; return (PRef fc x))
573 <|> try (pList syn)
611 <|> try (pList syn)
@@ -661,15 +699,6 @@ pApp syn = do f <- pSimpleExpr syn
661 pArg syn)
699 pArg syn)
662 return (PApp fc f args)
700 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"
673pArg :: SyntaxInfo -> IParser PArg
702pArg :: SyntaxInfo -> IParser PArg
674pArg syn = try (pImplicitArg syn)
703pArg syn = try (pImplicitArg syn)
675 <|> try (pConstraintArg syn)
704 <|> try (pConstraintArg syn)
@@ -774,11 +803,11 @@ pComprehension syn
774 addGuard x = x
803 addGuard x = x
776pDoBlock syn
805pDoBlock syn
777− = do reserved "do"; lchar '{'
806+ = do reserved "do"; open_block
778 push_indent
807 push_indent
779− ds <- many1 (do x <- pDo syn; pKeepTerminator; return x)
808+ ds <- many1 (do notEndBlock; x <- pDo syn; pKeepTerminator; return x)
780 pop_indent
809 pop_indent
781− lchar '}'
810+ close_block
782 return (PDoBlock ds)
811 return (PDoBlock ds)
@@ -973,11 +1002,11 @@ pClause syn
973 let capp = PApp fc (PRef fc n)
1002 let capp = PApp fc (PRef fc n)
974 (iargs ++ cargs ++ map pexp args)
1003 (iargs ++ cargs ++ map pexp args)
975 reserved "with"
1004 reserved "with"
976− wval <- pExpr syn
1005+ wval <- pSimpleExpr syn
977− lchar '{'
1006+ open_block
978 ds <- many1 $ pFunDecl syn
1007 ds <- many1 $ pFunDecl syn
979 let withs = map (fillLHSD n capp wargs) $ concat ds
1008 let withs = map (fillLHSD n capp wargs) $ concat ds
980− lchar '}'
1009+ close_block
981 ist <- getState
1010 ist <- getState
982 setState (ist { lastParse = Just n })
1011 setState (ist { lastParse = Just n })
983 pop_indent
1012 pop_indent
@@ -985,11 +1014,11 @@ pClause syn
986 <|> try (do wargs <- many1 (pWExpr syn)
1015 <|> try (do wargs <- many1 (pWExpr syn)
987 reserved "with"
1016 reserved "with"
988− wval <- pExpr syn
1017+ wval <- pSimpleExpr syn
989− lchar '{'
1018+ open_block
990 ds <- many1 $ pFunDecl syn
1019 ds <- many1 $ pFunDecl syn
991 let withs = concat ds
1020 let withs = concat ds
992− lchar '}'
1021+ close_block
993 return $ PWithR wargs wval withs)
1022 return $ PWithR wargs wval withs)
995 <|> do push_indent
1024 <|> do push_indent
@@ -1018,10 +1047,10 @@ pClause syn
1018 fc <- pfc
1047 fc <- pfc
1019 wargs <- many (pWExpr syn)
1048 wargs <- many (pWExpr syn)
1020 reserved "with"
1049 reserved "with"
1021− wval <- pExpr syn
1050+ wval <- pSimpleExpr syn
1022− lchar '{'
1051+ open_block
1023 ds <- many1 $ pFunDecl syn
1052 ds <- many1 $ pFunDecl syn
1024− lchar '}'
1053+ close_block
1025 ist <- getState
1054 ist <- getState
1026 let capp = PApp fc (PRef fc n) [pexp l, pexp r]
1055 let capp = PApp fc (PRef fc n) [pexp l, pexp r]
1027 let withs = map (fillLHSD n capp wargs) $ concat ds
1056 let withs = map (fillLHSD n capp wargs) $ concat ds
@@ -1043,10 +1072,10 @@ pWExpr syn = do lchar '|'; pExpr' syn
1044pWhereblock :: Name -> SyntaxInfo -> IParser ([PDecl], [(Name, Name)])
1073pWhereblock :: Name -> SyntaxInfo -> IParser ([PDecl], [(Name, Name)])
1045pWhereblock n syn
1074pWhereblock n syn
1046− = do reserved "where"; lchar '{'
1075+ = do reserved "where"; open_block
1047− ds <- many1 $ pFunDecl syn;
1076+ ds <- many1 $ pFunDecl syn
1048 let dns = concatMap (concatMap declared) ds
1077 let dns = concatMap (concatMap declared) ds
1049− lchar '}';
1078+ close_block
1050 return (concat ds, map (\x -> (x, decoration syn x)) dns)
1079 return (concat ds, map (\x -> (x, decoration syn x)) dns)
1052pDirective :: IParser [PDecl]
1081pDirective :: IParser [PDecl]