From 94ed5858afcf501c952f90a9fc9aab101cbf6d73 Mon Sep 17 00:00:00 2001
From: Finn Teegen <fte@informatik.uni-kiel.de>
Date: Sat, 11 Jun 2016 20:27:46 +0200
Subject: [PATCH] Remove explicit overloading of numeric literals

---
 src/Curry/Syntax/Lexer.hs      |  3 --
 src/Curry/Syntax/Parser.hs     | 59 +++++++++++++---------------------
 src/Curry/Syntax/Pretty.hs     |  7 ++--
 src/Curry/Syntax/ShowModule.hs |  9 ++----
 src/Curry/Syntax/Type.hs       | 21 +++++-------
 src/Curry/Syntax/Utils.hs      |  6 +---
 6 files changed, 39 insertions(+), 66 deletions(-)

diff --git a/src/Curry/Syntax/Lexer.hs b/src/Curry/Syntax/Lexer.hs
index bb19ea1..66a3f64 100644
--- a/src/Curry/Syntax/Lexer.hs
+++ b/src/Curry/Syntax/Lexer.hs
@@ -131,7 +131,6 @@ data Category
   -- special operators
   | SymDot      -- .
   | SymMinus    -- -
-  | SymMinusDot -- -.
 
   -- special symbols
   | SymStar -- *
@@ -239,7 +238,6 @@ instance Show Token where
   showsPrec _ (Token Tilde              _) = showsEscaped "~"
   showsPrec _ (Token SymDot             _) = showsSpecialOperator "."
   showsPrec _ (Token SymMinus           _) = showsSpecialOperator "-"
-  showsPrec _ (Token SymMinusDot        _) = showsSpecialOperator "-."
   showsPrec _ (Token SymStar            _) = showsEscaped "*"
   showsPrec _ (Token KW_case            _) = showsEscaped "case"
   showsPrec _ (Token KW_class           _) = showsEscaped "class"
@@ -354,7 +352,6 @@ reservedSpecialOps :: Map.Map String Category
 reservedSpecialOps = Map.union reservedOps $ Map.fromList
   [ ("." , SymDot     )
   , ("-" , SymMinus   )
-  , ("-.", SymMinusDot)
   , ("*" , SymStar    )
   ]
 
diff --git a/src/Curry/Syntax/Parser.hs b/src/Curry/Syntax/Parser.hs
index 909a163..e1327ba 100644
--- a/src/Curry/Syntax/Parser.hs
+++ b/src/Curry/Syntax/Parser.hs
@@ -26,7 +26,7 @@ import Curry.Base.LLParseComb
 import Curry.Syntax.Extension
 import Curry.Syntax.Lexer (Token (..), Category (..), Attributes (..), lexer)
 import Curry.Syntax.Type
-import Curry.Syntax.Utils (mkInt, addSrcRefs)
+import Curry.Syntax.Utils (addSrcRefs)
 
 -- |Parse a 'Module'
 parseSource :: FilePath -> String -> CYM (Module ())
@@ -512,7 +512,7 @@ listType = ListType <$> type0 `opt` (ConstructorType qListId)
 --          |  '"' <escaped string> '"'
 literal :: Parser a Token Literal
 literal = mk Char   <$> char
-      <|> mkInt     <$> integer
+      <|> mk Int    <$> integer
       <|> mk Float  <$> float
       <|> mk String <$> string
 
@@ -533,8 +533,7 @@ pattern0 = pattern1 `chainr1` (flip (InfixPattern ()) <$> gconop)
 pattern1 :: Parser a Token (Pattern ())
 pattern1 =  varId <**> identPattern'            -- unqualified
         <|> qConId <\> varId <**> constrPattern -- qualified
-        <|> minus     <**> negNum
-        <|> fminus    <**> negFloat
+        <|> minus     <-*> negNum
         <|> leftParen <-*> parenPattern'
         <|> pattern2  <\> qConId <\> leftParen
   where
@@ -546,14 +545,12 @@ pattern1 =  varId <**> identPattern'            -- unqualified
 
   mkConsPattern f ts c = ConstructorPattern () (f c) ts
 
-  parenPattern' =  minus  <**> minusPattern negNum
-               <|> fminus <**> minusPattern negFloat
+  parenPattern' =  minus <**> minusPattern
                <|> gconPattern
-               <|> funSym <\> minus <\> fminus <*-> rightParen
-                                               <**> identPattern'
-               <|> parenTuplePattern <\> minus <\> fminus <*-> rightParen
-  minusPattern p = rightParen           <-*> identPattern' -- (-) and (-.) as variables
-                <|> parenMinusPattern p <*-> rightParen
+               <|> funSym <\> minus <*-> rightParen <**> identPattern'
+               <|> parenTuplePattern <\> minus <*-> rightParen
+  minusPattern = rightParen         <-*> identPattern'
+              <|> parenMinusPattern <*-> rightParen
   gconPattern = ConstructorPattern () <$> gconId <*-> rightParen
                                       <*> many pattern2
 
@@ -579,14 +576,12 @@ identPattern =  varId <**> optAsRecPattern -- unqualified
 parenPattern :: Parser a Token (Pattern ())
 parenPattern = leftParen <-*> parenPattern'
   where
-  parenPattern' = minus  <**> minusPattern negNum
-              <|> fminus <**> minusPattern negFloat
+  parenPattern' = minus <**> minusPattern
               <|> flip (ConstructorPattern ()) [] <$> gconId <*-> rightParen
-              <|> funSym <\> minus <\> fminus <*-> rightParen
-                                              <**> optAsRecPattern
-              <|> parenTuplePattern <\> minus <\> fminus <*-> rightParen
-  minusPattern p = rightParen <-*> optAsRecPattern
-                <|> parenMinusPattern p <*-> rightParen
+              <|> funSym <\> minus <*-> rightParen <**> optAsRecPattern
+              <|> parenTuplePattern <\> minus <*-> rightParen
+  minusPattern = rightParen <-*> optAsRecPattern
+              <|> parenMinusPattern <*-> rightParen
 
 -- listPattern ::= '[' pattern0s ']'
 -- pattern0s   ::= {- empty -}
@@ -613,13 +608,9 @@ optRecPattern = mkRecPattern <$> fields pattern0 `opt` mkConPattern
 gconId :: Parser a Token QualIdent
 gconId = colon <|> tupleCommas
 
-negNum :: Parser a Token (Ident -> Pattern ())
-negNum = flip (NegativePattern ())
-         <$> (mkInt <$> integer <|> mk Float <$> float)
-
-negFloat :: Parser a Token (Ident -> Pattern ())
-negFloat = flip (NegativePattern ()) . mk Float
-           <$> (fromIntegral <$> integer <|> float)
+negNum :: Parser a Token (Pattern ())
+negNum = mk (NegativePattern ())
+         <$> (mk Int <$> integer <|> mk Float <$> float)
 
 optAsRecPattern :: Parser a Token (Ident -> Pattern ())
 optAsRecPattern =  flip AsPattern <$-> token At <*> pattern2
@@ -638,8 +629,7 @@ optTuplePattern = tuple <$> many1 (comma <-*> pattern0)
   where tuple ts t = mk TuplePattern (t:ts)
 
 parenMinusPattern :: Parser a Token (Ident -> Pattern ())
-                  -> Parser a Token (Ident -> Pattern ())
-parenMinusPattern p = p <.> optInfixPattern <.> optTuplePattern
+parenMinusPattern = const <$> negNum <.> optInfixPattern <.> optTuplePattern
 
 parenTuplePattern :: Parser a Token (Pattern ())
 parenTuplePattern = pattern0 <**> optTuplePattern
@@ -670,7 +660,7 @@ expr0 = expr1 `chainr1` (flip InfixApply <$> infixOp)
 
 -- expr1 ::= - expr2 | -. expr2 | expr2
 expr1 :: Parser a Token (Expression ())
-expr1 =  UnaryMinus <$> (minus <|> fminus) <*> expr2
+expr1 =  mk UnaryMinus <$-> minus <*> expr2
      <|> expr2
 
 -- expr2 ::= lambdaExpr | letExpr | doExpr | ifExpr | caseExpr | expr3
@@ -701,12 +691,12 @@ variable = qFunId <**> optRecord
 parenExpr :: Parser a Token (Expression ())
 parenExpr = parens pExpr
   where
-  pExpr = (minus <|> fminus) <**> minusOrTuple
+  pExpr = minus <**> minusOrTuple
       <|> Constructor () <$> tupleCommas
-      <|> leftSectionOrTuple <\> minus <\> fminus
-      <|> opOrRightSection <\> minus <\> fminus
+      <|> leftSectionOrTuple <\> minus
+      <|> opOrRightSection <\> minus
       `opt` mk Tuple []
-  minusOrTuple = flip UnaryMinus <$> expr1 <.> infixOrTuple
+  minusOrTuple = const . mk UnaryMinus <$> expr1 <.> infixOrTuple
             `opt` Variable () . qualify
   leftSectionOrTuple = expr1 <**> infixOrTuple
   infixOrTuple = ($ id) <$> infixOrTuple'
@@ -945,7 +935,7 @@ qIdent =  qualify  <$> ident
 
 sym :: Parser a Token Ident
 sym = (\ pos -> mkIdentPosition pos . sval) <$> position <*>
-      tokens [Sym, SymDot, SymMinus, SymMinusDot, SymStar]
+      tokens [Sym, SymDot, SymMinus, SymStar]
 
 qSym :: Parser a Token QualIdent
 qSym = qualify <$> sym <|> mkQIdent <$> position <*> token QSym
@@ -958,9 +948,6 @@ colon = (\ p -> qualify $ addPositionIdent p consId) <$> tokenPos Colon
 minus :: Parser a Token Ident
 minus = (\ p -> addPositionIdent p minusId) <$> tokenPos SymMinus
 
-fminus :: Parser a Token Ident
-fminus = (\ p -> addPositionIdent p fminusId) <$> tokenPos SymMinusDot
-
 tupleCommas :: Parser a Token QualIdent
 tupleCommas = (\ p -> qualify . addPositionIdent p . tupleId . succ . length)
               <$> position <*> many1 comma
diff --git a/src/Curry/Syntax/Pretty.hs b/src/Curry/Syntax/Pretty.hs
index 8ab0ae1..b724c1e 100644
--- a/src/Curry/Syntax/Pretty.hs
+++ b/src/Curry/Syntax/Pretty.hs
@@ -315,8 +315,8 @@ ppPattern p (LiteralPattern _ l) = parenIf (p > 1 && isNegative l) (ppLiteral l)
         isNegative (Int    _ i) = i < 0
         isNegative (Float  _ f) = f < 0.0
         isNegative (String _ _) = False
-ppPattern p (NegativePattern     _ op l) = parenIf (p > 1)
-  (ppInfixOp op <> ppLiteral l)
+ppPattern p (NegativePattern      _ _ l) = parenIf (p > 1)
+  (ppInfixOp minusId <> ppLiteral l)
 ppPattern _ (VariablePattern        _ v) = ppIdent v
 ppPattern p (ConstructorPattern  _ c ts) = parenIf (p > 1 && not (null ts))
   (ppQIdent c <+> fsep (map (ppPattern 2) ts))
@@ -366,7 +366,8 @@ ppExpr _ (EnumFromTo        e1 e2) =
 ppExpr _ (EnumFromThenTo e1 e2 e3) =
   brackets (ppExpr 0 e1 <> comma <+> ppExpr 0 e2
               <+> text ".." <+> ppExpr 0 e3)
-ppExpr p (UnaryMinus       op e) = parenIf (p > 1) (ppInfixOp op <> ppExpr 1 e)
+ppExpr p (UnaryMinus        _ e) =
+  parenIf (p > 1) (ppInfixOp minusId <> ppExpr 1 e)
 ppExpr p (Apply           e1 e2) =
   parenIf (p > 1) (sep [ppExpr 1 e1,indent (ppExpr 2 e2)])
 ppExpr p (InfixApply   e1 op e2) =
diff --git a/src/Curry/Syntax/ShowModule.hs b/src/Curry/Syntax/ShowModule.hs
index f928f68..9489889 100644
--- a/src/Curry/Syntax/ShowModule.hs
+++ b/src/Curry/Syntax/ShowModule.hs
@@ -351,9 +351,8 @@ showsLiteral (Char _ c)
   = showsString "(Char "
   . shows c
   . showsString ")"
-showsLiteral (Int ident n)
+showsLiteral (Int _ n)
   = showsString "(Int "
-  . showsIdent ident . space
   . shows n
   . showsString ")"
 showsLiteral (Float _ x)
@@ -370,9 +369,8 @@ showsConsTerm (LiteralPattern _ lit)
   = showsString "(LiteralPattern "
   . showsLiteral lit
   . showsString ")"
-showsConsTerm (NegativePattern _ ident lit)
+showsConsTerm (NegativePattern _ _ lit)
   = showsString "(NegativePattern "
-  . showsIdent ident . space
   . showsLiteral lit
   . showsString ")"
 showsConsTerm (VariablePattern _ ident)
@@ -483,9 +481,8 @@ showsExpression (EnumFromThenTo exp1 exp2 exp3)
   . showsExpression exp2 . space
   . showsExpression exp3
   . showsString ")"
-showsExpression (UnaryMinus ident expr)
+showsExpression (UnaryMinus _ expr)
   = showsString "(UnaryMinus "
-  . showsIdent ident . space
   . showsExpression expr
   . showsString ")"
 showsExpression (Apply exp1 exp2)
diff --git a/src/Curry/Syntax/Type.hs b/src/Curry/Syntax/Type.hs
index 4577767..799f152 100644
--- a/src/Curry/Syntax/Type.hs
+++ b/src/Curry/Syntax/Type.hs
@@ -251,14 +251,9 @@ data CondExpr a = CondExpr Position (Expression a) (Expression a)
     deriving (Eq, Read, Show, Data, Typeable)
 
 -- |Literal
--- The 'Ident' argument of an @Int@ literal is used for supporting ad-hoc
--- polymorphism on integer numbers. An integer literal can be used either as
--- an integer number or as a floating-point number depending on its context.
--- The compiler uses the identifier of the @Int@ literal for maintaining its
--- type.
 data Literal
   = Char   SrcRef Char
-  | Int    Ident  Integer
+  | Int    SrcRef Integer
   | Float  SrcRef Double
   | String SrcRef String
     deriving (Eq, Read, Show, Data, Typeable)
@@ -266,7 +261,7 @@ data Literal
 -- |Constructor term (used for patterns)
 data Pattern a
   = LiteralPattern     a Literal
-  | NegativePattern    a Ident Literal
+  | NegativePattern    a SrcRef Literal
   | VariablePattern    a Ident
   | ConstructorPattern a QualIdent [Pattern a]
   | InfixPattern       a (Pattern a) QualIdent (Pattern a)
@@ -296,7 +291,7 @@ data Expression a
   | EnumFromThen      (Expression a) (Expression a)
   | EnumFromTo        (Expression a) (Expression a)
   | EnumFromThenTo    (Expression a) (Expression a) (Expression a)
-  | UnaryMinus        Ident (Expression a)
+  | UnaryMinus        SrcRef (Expression a)
   | Apply             (Expression a) (Expression a)
   | InfixApply        (Expression a) (InfixOp a) (Expression a)
   | LeftSection       (Expression a) (InfixOp a)
@@ -388,7 +383,7 @@ instance Functor CondExpr where
 
 instance Functor Pattern where
   fmap f (LiteralPattern a l) = LiteralPattern (f a) l
-  fmap f (NegativePattern a i l) = NegativePattern (f a) i l
+  fmap f (NegativePattern a ref l) = NegativePattern (f a) ref l
   fmap f (VariablePattern a v) = VariablePattern (f a) v
   fmap f (ConstructorPattern a c ts) =
     ConstructorPattern (f a) c (map (fmap f) ts)
@@ -422,7 +417,7 @@ instance Functor Expression where
   fmap f (EnumFromTo e1 e2) = EnumFromTo (fmap f e1) (fmap f e2)
   fmap f (EnumFromThenTo e1 e2 e3) =
     EnumFromThenTo (fmap f e1) (fmap f e2) (fmap f e3)
-  fmap f (UnaryMinus i e) = UnaryMinus i (fmap f e)
+  fmap f (UnaryMinus ref e) = UnaryMinus ref (fmap f e)
   fmap f (Apply e1 e2) = Apply (fmap f e1) (fmap f e2)
   fmap f (InfixApply e1 op e2) =
     InfixApply (fmap f e1) (fmap f op) (fmap f e2)
@@ -457,8 +452,8 @@ instance Functor Goal where
   fmap f (Goal p e ds) = Goal p (fmap f e) (map (fmap f) ds)
 
 instance SrcRefOf (Pattern a) where
-  srcRefOf (LiteralPattern     _   l) = srcRefOf l
-  srcRefOf (NegativePattern    _ i _) = srcRefOf i
+  srcRefOf (LiteralPattern       _ l) = srcRefOf l
+  srcRefOf (NegativePattern    _ s _) = s
   srcRefOf (VariablePattern    _   i) = srcRefOf i
   srcRefOf (ConstructorPattern _ i _) = srcRefOf i
   srcRefOf (InfixPattern     _ _ i _) = srcRefOf i
@@ -474,6 +469,6 @@ instance SrcRefOf (Pattern a) where
 
 instance SrcRefOf Literal where
   srcRefOf (Char   s _) = s
-  srcRefOf (Int    i _) = srcRefOf i
+  srcRefOf (Int    s _) = s
   srcRefOf (Float  s _) = s
   srcRefOf (String s _) = s
diff --git a/src/Curry/Syntax/Utils.hs b/src/Curry/Syntax/Utils.hs
index 033a740..a2edbea 100644
--- a/src/Curry/Syntax/Utils.hs
+++ b/src/Curry/Syntax/Utils.hs
@@ -22,7 +22,7 @@ module Curry.Syntax.Utils
   , isClassDecl, isTypeOrClassDecl, isInstanceDecl
   , isFunctionDecl, isExternalDecl, patchModuleId
   , isVariableType, isSimpleType
-  , flatLhs, mkInt, fieldLabel, fieldTerm, field2Tuple, opName
+  , flatLhs, fieldLabel, fieldTerm, field2Tuple, opName
   , addSrcRefs
   , constrId, nconstrId
   , recordLabels, nrecordLabels
@@ -134,10 +134,6 @@ flatLhs lhs = flat lhs []
         flat (OpLhs t1 op t2) ts' = (op, t1 : t2 : ts')
         flat (ApLhs  lhs' ts) ts' = flat lhs' (ts ++ ts')
 
--- |Construct an Integer literal
-mkInt :: Integer -> Literal
-mkInt i = mk (\r -> Int (addPositionIdent (AST r) anonId) i)
-
 -- |Select the label of a field
 fieldLabel :: Field a -> QualIdent
 fieldLabel (Field _ l _) = l
-- 
GitLab