diff --git a/language-lua.cabal b/language-lua.cabal
--- a/language-lua.cabal
+++ b/language-lua.cabal
@@ -2,6 +2,12 @@
 Description:         Lua 5.2 lexer, parser and pretty-printer. Documentation: (<https://osa1.github.com/language-lua>)
                      .
                      Changelog:
+                     .
+                     \0.4.4:
+                     .
+                     - Printer now takes operator precedences into account while printing `Binop` and `Unop` expressions and prints parenthesis as necessary.
+                     - Printer now does not put line break in `Binop` expressions.
+                     .
                      \0.4.3:
                      .
                      - `Data` and `Typeable` instances are implemented for syntax tree.
@@ -39,7 +45,7 @@
                      \0.2.0:
                      .
                      - Syntax tree is annotated. All parsers(`parseText`, `parseFile`) annotate resulting tree with source positions.
-Version:             0.4.3
+Version:             0.4.4
 Synopsis:            Lua parser and pretty-printer
 Homepage:            http://github.com/osa1/language-lua
 Bug-reports:         http://github.com/osa1/language-lua/issues
diff --git a/src/Language/Lua/PrettyPrinter.hs b/src/Language/Lua/PrettyPrinter.hs
--- a/src/Language/Lua/PrettyPrinter.hs
+++ b/src/Language/Lua/PrettyPrinter.hs
@@ -25,9 +25,15 @@
 x <$> y | isEmpty y = x
         | otherwise = x <> line <> y
 
+type Precedence = Int
+
 class LPretty a where
     pprint :: a -> Doc
+    pprint = pprint' 0
 
+    pprint' :: Precedence -> a -> Doc
+    pprint' _ = pprint
+
 instance LPretty [Char] where
     pprint = text
 
@@ -36,16 +42,22 @@
     pprint False = text "false"
 
 instance LPretty Exp where
-    pprint Nil            = text "nil"
-    pprint (Bool s)       = pprint s
-    pprint (Number n)     = text n
-    pprint (String s)     = dquotes (text s)
-    pprint Vararg         = text "..."
-    pprint (EFunDef f)    = pprint f
-    pprint (PrefixExp pe) = pprint pe
-    pprint (TableConst t) = pprint t
-    pprint (Binop op e1 e2) = group (pprint e1 <+> pprint op <$> pprint e2)
-    pprint (Unop op e)    = pprint op <> pprint e
+    pprint' _ Nil            = text "nil"
+    pprint' _ (Bool s)       = pprint s
+    pprint' _ (Number n)     = text n
+    pprint' _ (String s)     = dquotes (text s)
+    pprint' _ Vararg         = text "..."
+    pprint' _ (EFunDef f)    = pprint f
+    pprint' _ (PrefixExp pe) = pprint pe
+    pprint' _ (TableConst t) = pprint t
+    pprint' p (Binop op e1 e2) = ps (pprint' opPrec e1 <+> pprint op <+> pprint' opPrec e2)
+      where
+        opPrec = getBinopPrec op
+        ps = if opPrec < p then parens else id
+    pprint' p (Unop op e)    = ps (pprint op <> pprint' opPrec e)
+      where
+        opPrec = getUnopPrec op
+        ps = if opPrec < p then parens else id
 
 instance LPretty Var where
     pprint (VarName n)          = pprint n
@@ -73,6 +85,28 @@
     pprint Neg = char '-'
     pprint Not = text "not "
     pprint Len = char '#'
+
+getBinopPrec :: Binop -> Precedence
+getBinopPrec op =
+    case op of
+      Add -> 5
+      Sub -> 5
+      Mul -> 6
+      Div -> 6
+      Exp -> 8
+      Mod -> 6
+      Concat -> 4
+      LT -> 3
+      LTE -> 3
+      GT -> 3
+      GTE -> 3
+      EQ -> 3
+      NEQ -> 3
+      And -> 2
+      Or -> 1
+
+getUnopPrec :: Unop -> Precedence
+getUnopPrec = const 7
 
 instance LPretty PrefixExp where
     pprint (PEVar var)         = pprint var
