tools/pas2c/Pas2C.hs
changeset 15776 aa011799cb63
parent 15774 f09db263bc2a
child 15893 9cd8d7748199
--- a/tools/pas2c/Pas2C.hs	Thu Oct 22 12:50:24 2020 +0200
+++ b/tools/pas2c/Pas2C.hs	Thu Oct 22 13:27:49 2020 +0200
@@ -962,12 +962,17 @@
 wrapPhrase p@(Phrases _) = p
 wrapPhrase p = Phrases [p]
 
+parensExpr2C :: Expression -> State RenderState Doc
+parensExpr2C bop@(BinOp _ _ _) = liftM parens $ expr2C bop
+parensExpr2C set@(SetExpression _ ) = liftM parens $ expr2C set
+parensExpr2C e = expr2C e
+
 expr2C :: Expression -> State RenderState Doc
 expr2C (Expression s) = return $ text s
 expr2C bop@(BinOp op expr1 expr2) = do
-    e1 <- expr2C expr1
+    e1 <- parensExpr2C expr1
     t1 <- gets lastType
-    e2 <- expr2C expr2
+    e2 <- parensExpr2C expr2
     t2 <- gets lastType
     case (op2C op, t1, t2) of
         ("+", BTAString, BTAString) -> expr2C $ BuiltInFunCall [expr1, expr2] (SimpleReference $ Identifier "_strconcatA" (fff t1 t2 BTString))
@@ -991,8 +996,8 @@
 
         ("==", BTString, BTString) -> expr2C $ BuiltInFunCall [expr1, expr2] (SimpleReference $ Identifier "_strcompare" (fff t1 t2  BTBool))
         ("!=", BTString, _) -> expr2C $ BuiltInFunCall [expr1, expr2] (SimpleReference $ Identifier "_strncompare" (fff t1 t2  BTBool))
-        ("&", BTBool, _) -> return $ parens e1 <+> text "&&" <+> parens e2
-        ("|", BTBool, _) -> return $ parens e1 <+> text "||" <+> parens e2
+        ("&", BTBool, _) -> return $ e1 <+> text "&&" <+> e2
+        ("|", BTBool, _) -> return $ e1 <+> text "||" <+> e2
         (_, BTRecord t1 _, BTRecord t2 _) -> do
             i <- op2CTyped op [SimpleType (Identifier t1 undefined), SimpleType (Identifier t2 undefined)]
             ref2C $ FunCall [expr1, expr2] (SimpleReference i)
@@ -1009,17 +1014,17 @@
                  _ -> error "'in' against not set expression"
         (o, _, _) | o `elem` boolOps -> do
                         modify(\s -> s{lastType = BTBool})
-                        return $ parens e1 <+> text o <+> parens e2
+                        return $ e1 <+> text o <+> e2
                   | otherwise -> do
                         o' <- return $ case o of
                             "/(float)" -> text "/(float)" -- pascal returns real value
                             _ -> text o
                         e1' <- return $ case (o, t1, t2) of
                                 ("-", BTInt False, BTInt False) -> parens $ text "(int64_t)" <+> parens e1
-                                _ -> parens e1
+                                _ -> e1
                         e2' <- return $ case (o, t1, t2) of
                                 ("-", BTInt False, BTInt False) -> parens $ text "(int64_t)" <+> parens e2
-                                _ -> parens e2
+                                _ -> e2
                         return $ e1' <+> o' <+> e2'
     where
         fff t1 t2 = BTFunction False False [(False, t1), (False, t2)]
@@ -1050,7 +1055,7 @@
    modify(\s -> s{isFunctionType = False}) -- reset
    if isfunc then ref2CF ref False else ref2CF ref True
 expr2C (PrefixOp op expr) = do
-    e <- expr2C expr
+    e <- parensExpr2C expr
     lt <- gets lastType
     case lt of
         BTRecord t _ -> do
@@ -1060,8 +1065,8 @@
             o <- return $ case op of
                      "not" -> text "!"
                      _ -> text (op2C op)
-            return $ o <> parens e
-        _ -> return $ text (op2C op) <> parens e
+            return $ o <> e
+        _ -> return $ text (op2C op) <> e
 expr2C Null = return $ text "NULL"
 expr2C (CharCode a) = do
     modify(\s -> s{lastType = BTChar})