@@ -201,13 +201,20 @@ pTerminator = do lchar ';'; pop_indent
201201 else fail "Not a terminator"
202202 <|> lookAhead eof
203203
204+pBarTerminator
205+ = do lchar '|'; return ()
206+ <|> do c <- indent; l <- last_indent
207+ if (c <= l) then return ()
208+ else fail "Not a terminator"
209+ <|> lookAhead eof
210+
204211pKeepTerminator
205212 = do lchar ';'; return ()
206213 <|> do c <- indent; l <- last_indent
207214 if (c <= l) then return ()
208215 else fail "Not a terminator"
209216 <|> do i <- getInput; let h = take 1 i
210− if (h == "}" || h == ")") then return ()
217+ if (h == "}" || h == ")" || h == "|") then return ()
211218 else fail "Not a terminator"
212219 <|> lookAhead eof
213220
@@ -255,7 +262,7 @@ parseProg syn fname input pos
255262 return (collect x)
256263 where ishow err = let ln = sourceLine (errorPos err) in
257264 fname ++ ":" ++ show ln ++ ":parse error"
258− ++ " " ++ show (sourceColumn (errorPos err))
265+ ++ " at column " ++ show (sourceColumn (errorPos err))
259266-- show (map messageString (errorMessages err))
260267
261268-- Collect PClauses with the same function name
@@ -605,7 +612,12 @@ pSimpleExpr syn =
605612 return (PTactics ts)
606613 <|> do reserved "case"; fc <- pfc; scr <- pExpr syn; reserved "of";
607614 open_block
608− opts <- sepBy1 (pCaseOpt syn) (lchar '|')
615+ push_indent
616+ opts <- many1 (do notEndBlock
617+ x <- pCaseOpt syn
618+ pKeepTerminator
619+ return x) -- sepBy1 (pCaseOpt syn) (lchar '|')
620+ pop_indent
609621 close_block
610622 return (PCase fc scr opts)
611623 <|> try (do x <- pfName; fc <- pfc; return (PRef fc x))
@@ -883,34 +895,36 @@ accData (Just Frozen) n ns = do addAcc n (Just Frozen)
883895accData a n ns = do addAcc n a; mapM_ (\n -> addAcc n a) ns
884896
885897pData :: SyntaxInfo -> IParser PDecl
886−pData syn = try (do push_indent
887− acc <- pAccessibility
898+pData syn = try (do acc <- pAccessibility
888899 reserved "data"; fc <- pfc
889900 tyn_in <- pfName; ty <- pTSig syn
890901 let tyn = expandNS syn tyn_in
891902 reserved "where"
892−-- ty' <- implicit syn tyn ty
893− cons <- sepBy (pConstructor syn) (lchar '|')
894− pTerminator
903+ open_block
904+ push_indent
905+ cons <- many (do notEndBlock
906+ c <- pConstructor syn
907+ pKeepTerminator
908+ return c) -- (lchar '|')
909+ pop_indent
910+ close_block
895911 accData acc tyn (map (\ (n, _, _) -> n) cons)
896912 return $ PData syn fc (PDatadecl tyn ty cons))
897− <|> do push_indent
898− acc <- pAccessibility
899− reserved "data"; fc <- pfc
900− tyn_in <- pfName; args <- many pName
901− let tyn = expandNS syn tyn_in
902− lchar '='
903− cons <- sepBy1 (pSimpleCon syn) (lchar '|')
904− pTerminator
905− let conty = mkPApp fc (PRef fc tyn) (map (PRef fc) args)
906− let ty = bindArgs (map (\a -> PSet) args) PSet
907−-- ty' <- implicit syn tyn ty
908− cons' <- mapM (\ (x, cargs, cfc) ->
913+ <|> try (do push_indent
914+ acc <- pAccessibility
915+ reserved "data"; fc <- pfc
916+ tyn_in <- pfName; args <- many pName
917+ let tyn = expandNS syn tyn_in
918+ lchar '='
919+ cons <- sepBy1 (pSimpleCon syn) (lchar '|')
920+ pTerminator
921+ let conty = mkPApp fc (PRef fc tyn) (map (PRef fc) args)
922+ let ty = bindArgs (map (\a -> PSet) args) PSet
923+ cons' <- mapM (\ (x, cargs, cfc) ->
909924 do let cty = bindArgs cargs conty
910−-- cty' <- implicit syn x cty
911925 return (x, cty, cfc)) cons
912− accData acc tyn (map (\ (n, _, _) -> n) cons')
913− return $ PData syn fc (PDatadecl tyn ty cons')
926+ accData acc tyn (map (\ (n, _, _) -> n) cons')
927+ return $ PData syn fc (PDatadecl tyn ty cons'))
914928 where
915929 mkPApp fc t [] = t
916930 mkPApp fc t xs = PApp fc t (map pexp xs)