diff --git a/Language/GLSL/Pretty.hs b/Language/GLSL/Pretty.hs
--- a/Language/GLSL/Pretty.hs
+++ b/Language/GLSL/Pretty.hs
@@ -5,15 +5,26 @@
 import Text.Printf
 
 import Language.GLSL.Syntax
+import Prelude hiding ((<>))
 
 ----------------------------------------------------------------------
 -- helpers (TODO clean)
 ----------------------------------------------------------------------
 
+type Assoc = (Rational -> Rational, Rational -> Rational)
+
+assocLeft, assocRight, assocNone :: Assoc
+assocLeft  = (id,bump)
+assocRight = (bump,id)
+assocNone  = (bump,bump)
+
+bump :: Rational -> Rational
+bump = (+ 0.5)
+
 prettyBinary :: Pretty a =>
-  PrettyLevel -> Rational -> Rational -> String -> a -> a -> Doc
-prettyBinary l p op o e1 e2 = prettyParen (p > op) $
-  pPrintPrec l op e1 <+> text o <+> pPrintPrec l op e2
+  PrettyLevel -> Rational -> Rational -> Assoc -> String -> a -> a -> Doc
+prettyBinary l p op (lf,rf) o e1 e2 = prettyParen (p > op) $
+  pPrintPrec l (lf op) e1 <+> text o <+> pPrintPrec l (rf op) e2
 
 option :: Pretty a => Maybe a -> Doc
 option Nothing = empty
@@ -237,40 +248,40 @@
     UnaryOneComplement e1 -> prettyParen (p > 15) $
       text "~" <> pPrintPrec l 15 e1
   -- binary expression
-    Mul e1 e2 -> prettyBinary l p 14 "*" e1 e2
-    Div e1 e2 -> prettyBinary l p 14 "/" e1 e2
-    Mod e1 e2 -> prettyBinary l p 14 "%" e1 e2
-    Add e1 e2 -> prettyBinary l p 13 "+" e1 e2
-    Sub e1 e2 -> prettyBinary l p 13 "-" e1 e2
-    LeftShift e1 e2 -> prettyBinary l p 12 "<<" e1 e2
-    RightShift e1 e2 -> prettyBinary l p 12 ">>" e1 e2
-    Lt e1 e2 -> prettyBinary l p 11 "<" e1 e2
-    Gt e1 e2 -> prettyBinary l p 11 ">" e1 e2
-    Lte e1 e2 -> prettyBinary l p 11 "<=" e1 e2
-    Gte e1 e2 -> prettyBinary l p 11 ">=" e1 e2
-    Equ e1 e2 -> prettyBinary l p 10 "==" e1 e2
-    Neq e1 e2 -> prettyBinary l p 10 "!=" e1 e2
-    BitAnd e1 e2 -> prettyBinary l p 9 "&" e1 e2
-    BitXor e1 e2 -> prettyBinary l p 8 "^" e1 e2
-    BitOr e1 e2 -> prettyBinary l p 7 "|" e1 e2
-    And e1 e2 -> prettyBinary l p 6 "&&" e1 e2
+    Mul        e1 e2 -> prettyBinary l p 14 assocLeft "*" e1 e2
+    Div        e1 e2 -> prettyBinary l p 14 assocLeft "/" e1 e2
+    Mod        e1 e2 -> prettyBinary l p 14 assocLeft "%" e1 e2
+    Add        e1 e2 -> prettyBinary l p 13 assocLeft "+" e1 e2
+    Sub        e1 e2 -> prettyBinary l p 13 assocLeft "-" e1 e2
+    LeftShift  e1 e2 -> prettyBinary l p 12 assocLeft "<<" e1 e2
+    RightShift e1 e2 -> prettyBinary l p 12 assocLeft ">>" e1 e2
+    Lt         e1 e2 -> prettyBinary l p 11 assocLeft "<" e1 e2
+    Gt         e1 e2 -> prettyBinary l p 11 assocLeft ">" e1 e2
+    Lte        e1 e2 -> prettyBinary l p 11 assocLeft "<=" e1 e2
+    Gte        e1 e2 -> prettyBinary l p 11 assocLeft ">=" e1 e2
+    Equ        e1 e2 -> prettyBinary l p 10 assocLeft "==" e1 e2
+    Neq        e1 e2 -> prettyBinary l p 10 assocLeft "!=" e1 e2
+    BitAnd     e1 e2 -> prettyBinary l p 9 assocLeft "&" e1 e2
+    BitXor     e1 e2 -> prettyBinary l p 8 assocLeft "^" e1 e2
+    BitOr      e1 e2 -> prettyBinary l p 7 assocLeft "|" e1 e2
+    And        e1 e2 -> prettyBinary l p 6 assocLeft "&&" e1 e2
 -- TODO Xor 5 "^^"
-    Or e1 e2 -> prettyBinary l p 4 "||" e1 e2
+    Or         e1 e2 -> prettyBinary l p 4 assocLeft "||" e1 e2
     Selection e1 e2 e3 -> prettyParen (p > 3) $
       pPrintPrec l 3 e1 <+> char '?' <+> pPrintPrec l 3 e2
       <+> char ':' <+> pPrintPrec l 3 e3
   -- assignment, the left Expr should be unary expression
-    Equal e1 e2 -> prettyBinary l p 2 "=" e1 e2
-    MulAssign e1 e2 -> prettyBinary l p 2 "*=" e1 e2
-    DivAssign e1 e2 -> prettyBinary l p 2 "/=" e1 e2
-    ModAssign e1 e2 -> prettyBinary l p 2 "%=" e1 e2
-    AddAssign e1 e2 -> prettyBinary l p 2 "+=" e1 e2
-    SubAssign e1 e2 -> prettyBinary l p 2 "-=" e1 e2
-    LeftAssign e1 e2 -> prettyBinary l p 2 "<<=" e1 e2
-    RightAssign e1 e2 -> prettyBinary l p 2 ">>=" e1 e2
-    AndAssign e1 e2 -> prettyBinary l p 2 "&=" e1 e2
-    XorAssign e1 e2 -> prettyBinary l p 2 "^=" e1 e2
-    OrAssign e1 e2 -> prettyBinary l p 2 "|=" e1 e2
+    Equal       e1 e2 -> prettyBinary l p 2 assocRight "=" e1 e2
+    MulAssign   e1 e2 -> prettyBinary l p 2 assocRight "*=" e1 e2
+    DivAssign   e1 e2 -> prettyBinary l p 2 assocRight "/=" e1 e2
+    ModAssign   e1 e2 -> prettyBinary l p 2 assocRight "%=" e1 e2
+    AddAssign   e1 e2 -> prettyBinary l p 2 assocRight "+=" e1 e2
+    SubAssign   e1 e2 -> prettyBinary l p 2 assocRight "-=" e1 e2
+    LeftAssign  e1 e2 -> prettyBinary l p 2 assocRight "<<=" e1 e2
+    RightAssign e1 e2 -> prettyBinary l p 2 assocRight ">>=" e1 e2
+    AndAssign   e1 e2 -> prettyBinary l p 2 assocRight "&=" e1 e2
+    XorAssign   e1 e2 -> prettyBinary l p 2 assocRight "^=" e1 e2
+    OrAssign    e1 e2 -> prettyBinary l p 2 assocRight "|=" e1 e2
   -- sequence
     Sequence e1 e2 -> prettyParen (p > 1) $
       pPrintPrec l 1 e1 <> char ',' <+> pPrintPrec l 1 e2
diff --git a/glsl/sample-01.glsl b/glsl/sample-01.glsl
--- a/glsl/sample-01.glsl
+++ b/glsl/sample-01.glsl
@@ -124,3 +124,7 @@
 { float pattern[100];
   float arr[];
 };
+
+float x = a / b / c;
+float x = (a / b) / c;
+float x = a / (b / c);
diff --git a/language-glsl.cabal b/language-glsl.cabal
--- a/language-glsl.cabal
+++ b/language-glsl.cabal
@@ -1,5 +1,5 @@
 name:                language-glsl
-version:             0.1.1
+version:             0.3.0
 Cabal-Version:       >= 1.8
 synopsis:            GLSL abstract syntax tree, parser, and pretty-printer
 description:
@@ -36,7 +36,6 @@
   build-depends:       base < 5,
                        language-glsl,
                        parsec,
-                       pretty,
                        prettyclass
   ghc-options:         -Wall
 
