@@ -201,13 +201,20 @@ pTerminator = do lchar ';'; pop_indent
201 else fail "Not a terminator"
201 else fail "Not a terminator"
202 <|> lookAhead eof
202 <|> lookAhead eof
205+ = do lchar '|'; return ()
206+ <|> do c <- indent; l <- last_indent
207+ if (c <= l) then return ()
208+ else fail "Not a terminator"
204pKeepTerminator
211pKeepTerminator
205 = do lchar ';'; return ()
212 = do lchar ';'; return ()
206 <|> do c <- indent; l <- last_indent
213 <|> do c <- indent; l <- last_indent
207 if (c <= l) then return ()
214 if (c <= l) then return ()
208 else fail "Not a terminator"
215 else fail "Not a terminator"
209 <|> do i <- getInput; let h = take 1 i
216 <|> do i <- getInput; let h = take 1 i
210− if (h == "}" || h == ")") then return ()
217+ if (h == "}" || h == ")" || h == "|") then return ()
211 else fail "Not a terminator"
218 else fail "Not a terminator"
212 <|> lookAhead eof
219 <|> lookAhead eof
@@ -255,7 +262,7 @@ parseProg syn fname input pos
255 return (collect x)
262 return (collect x)
256 where ishow err = let ln = sourceLine (errorPos err) in
263 where ishow err = let ln = sourceLine (errorPos err) in
257 fname ++ ":" ++ show ln ++ ":parse error"
264 fname ++ ":" ++ show ln ++ ":parse error"
258− ++ " " ++ show (sourceColumn (errorPos err))
265+ ++ " at column " ++ show (sourceColumn (errorPos err))
259-- show (map messageString (errorMessages err))
266-- show (map messageString (errorMessages err))
261-- Collect PClauses with the same function name
268-- Collect PClauses with the same function name
@@ -605,7 +612,12 @@ pSimpleExpr syn =
605 return (PTactics ts)
612 return (PTactics ts)
606 <|> do reserved "case"; fc <- pfc; scr <- pExpr syn; reserved "of";
613 <|> do reserved "case"; fc <- pfc; scr <- pExpr syn; reserved "of";
607 open_block
614 open_block
616+ opts <- many1 (do notEndBlock
608− opts <- sepBy1 (pCaseOpt syn) (lchar '|')
619+ return x) -- sepBy1 (pCaseOpt syn) (lchar '|')
609 close_block
621 close_block
610 return (PCase fc scr opts)
622 return (PCase fc scr opts)
611 <|> try (do x <- pfName; fc <- pfc; return (PRef fc x))
623 <|> try (do x <- pfName; fc <- pfc; return (PRef fc x))
@@ -883,34 +895,36 @@ accData (Just Frozen) n ns = do addAcc n (Just Frozen)
883accData a n ns = do addAcc n a; mapM_ (\n -> addAcc n a) ns
895accData a n ns = do addAcc n a; mapM_ (\n -> addAcc n a) ns
885pData :: SyntaxInfo -> IParser PDecl
897pData :: SyntaxInfo -> IParser PDecl
886−pData syn = try (do push_indent
887− acc <- pAccessibility
898+pData syn = try (do acc <- pAccessibility
888 reserved "data"; fc <- pfc
899 reserved "data"; fc <- pfc
889 tyn_in <- pfName; ty <- pTSig syn
900 tyn_in <- pfName; ty <- pTSig syn
890 let tyn = expandNS syn tyn_in
901 let tyn = expandNS syn tyn_in
891 reserved "where"
902 reserved "where"
892−-- ty' <- implicit syn tyn ty
903+ open_block
905+ cons <- many (do notEndBlock
893− cons <- sepBy (pConstructor syn) (lchar '|')
906+ c <- pConstructor syn
894− pTerminator
907+ pKeepTerminator
908+ return c) -- (lchar '|')
895 accData acc tyn (map (\ (n, _, _) -> n) cons)
911 accData acc tyn (map (\ (n, _, _) -> n) cons)
896 return $ PData syn fc (PDatadecl tyn ty cons))
912 return $ PData syn fc (PDatadecl tyn ty cons))
897− <|> do push_indent
913+ <|> try (do push_indent
898− acc <- pAccessibility
914+ acc <- pAccessibility
899− reserved "data"; fc <- pfc
915+ reserved "data"; fc <- pfc
900− tyn_in <- pfName; args <- many pName
916+ tyn_in <- pfName; args <- many pName
901− let tyn = expandNS syn tyn_in
917+ let tyn = expandNS syn tyn_in
902− lchar '='
918+ lchar '='
903− cons <- sepBy1 (pSimpleCon syn) (lchar '|')
919+ cons <- sepBy1 (pSimpleCon syn) (lchar '|')
904− pTerminator
920+ pTerminator
905− let conty = mkPApp fc (PRef fc tyn) (map (PRef fc) args)
921+ let conty = mkPApp fc (PRef fc tyn) (map (PRef fc) args)
906− let ty = bindArgs (map (\a -> PSet) args) PSet
922+ let ty = bindArgs (map (\a -> PSet) args) PSet
907−-- ty' <- implicit syn tyn ty
908− cons' <- mapM (\ (x, cargs, cfc) ->
923+ cons' <- mapM (\ (x, cargs, cfc) ->
909 do let cty = bindArgs cargs conty
924 do let cty = bindArgs cargs conty
910−-- cty' <- implicit syn x cty
911 return (x, cty, cfc)) cons
925 return (x, cty, cfc)) cons
912− accData acc tyn (map (\ (n, _, _) -> n) cons')
926+ accData acc tyn (map (\ (n, _, _) -> n) cons')
913− return $ PData syn fc (PDatadecl tyn ty cons')
927+ return $ PData syn fc (PDatadecl tyn ty cons'))
915 mkPApp fc t [] = t
929 mkPApp fc t [] = t
916 mkPApp fc t xs = PApp fc t (map pexp xs)
930 mkPApp fc t xs = PApp fc t (map pexp xs)