@@ -751,22 +751,53 @@ pClause syn
751751 (wheres, nmap) <- choice [pWhereblock n wsyn,
752752 do lchar ';'
753753 return ([], [])]
754− return $ PClause n (PApp fc (PRef fc n)
755− (iargs ++ cargs ++ map pexp args)) wargs rhs wheres)
754+ let capp = PApp fc (PRef fc n)
755+ (iargs ++ cargs ++ map pexp args)
756+ setState (ist { lastParse = Just (n, capp, wargs) })
757+ return $ PClause n capp wargs rhs wheres)
758+ <|> try (do wargs <- many (pWExpr syn)
759+ ist <- getState
760+ (n, capp, owargs) <- case lastParse ist of
761+ Just t -> return t
762+ Nothing -> fail "Invalid clause"
763+ rhs <- pRHS syn n
764+ let ctxt = tt_ctxt ist
765+ let wsyn = syn { syn_namespace = [] }
766+ (wheres, nmap) <- choice [pWhereblock n wsyn,
767+ do lchar ';'
768+ return ([], [])]
769+ return $ PClause n capp (owargs ++ wargs) rhs wheres)
770+
756771 <|> try (do n_in <- pfName; let n = expandNS syn n_in
757772 cargs <- many (pConstraintArg syn)
758773 iargs <- many (pImplicitArg syn)
759774 fc <- pfc
760775 args <- many (pArgExpr syn)
761776 wargs <- many (pWExpr syn)
777+ let capp = PApp fc (PRef fc n)
778+ (iargs ++ cargs ++ map pexp args)
779+ ist <- getState
780+ setState (ist { lastParse = Just (n, capp, wargs) })
762781 reserved "with"
763782 wval <- pExpr syn
764783 lchar '{'
765784 ds <- many1 $ pFunDecl syn
766785 let withs = concat ds
767786 lchar '}'
768− return $ PWith n (PApp fc (PRef fc n)
769− (iargs ++ cargs ++ map pexp args)) wargs wval withs)
787+ return $ PWith n capp wargs wval withs)
788+
789+ <|> try (do wargs <- many (pWExpr syn)
790+ reserved "with"
791+ ist <- getState
792+ (n, capp, owargs) <- case lastParse ist of
793+ Just t -> return t
794+ Nothing -> fail "Invalid clause"
795+ wval <- pExpr syn
796+ lchar '{'
797+ ds <- many1 $ pFunDecl syn
798+ let withs = concat ds
799+ lchar '}'
800+ return $ PWith n capp (owargs ++ wargs) wval withs)
770801
771802 <|> do l <- pArgExpr syn
772803 op <- operator
@@ -779,8 +810,10 @@ pClause syn
779810 (wheres, nmap) <- choice [pWhereblock n wsyn,
780811 do lchar ';'
781812 return ([], [])]
782− return $ PClause n (PApp fc (PRef fc n) [pexp l,pexp r])
783− wargs rhs wheres
813+ ist <- getState
814+ let capp = PApp fc (PRef fc n) [pexp l, pexp r]
815+ setState (ist { lastParse = Just (n, capp, wargs) })
816+ return $ PClause n capp wargs rhs wheres
784817
785818 <|> do l <- pArgExpr syn
786819 op <- operator
@@ -794,7 +827,10 @@ pClause syn
794827 ds <- many1 $ pFunDecl syn
795828 let withs = concat ds
796829 lchar '}'
797− return $ PWith n (PApp fc (PRef fc n) [pexp l, pexp r]) wargs wval withs
830+ ist <- getState
831+ let capp = PApp fc (PRef fc n) [pexp l, pexp r]
832+ setState (ist { lastParse = Just (n, capp, wargs) })
833+ return $ PWith n capp wargs wval withs
798834
799835pWExpr :: SyntaxInfo -> IParser PTerm
800836pWExpr syn = do lchar '|'; pExpr' syn