diff --git a/Tests/Minify.hs b/Tests/Minify.hs
--- a/Tests/Minify.hs
+++ b/Tests/Minify.hs
@@ -115,12 +115,15 @@
 
     it "string concatenation" $ do
         minifyExpr " 'ab' + \"cd\" " `shouldBe` "'abcd'"
-        minifyExpr " \"bc\" + 'de' " `shouldBe` "\"bcde\""
-        minifyExpr " \"cd\" + 'ef' + 'gh' " `shouldBe` "\"cdefgh\""
-        -- TODO: Correct, but can we do better?
-        minifyExpr " 'de' + \"'fg'\" + 'hi' " `shouldBe` "'de'+\"'fg'\"+'hi'"
+        minifyExpr " \"bc\" + 'de' " `shouldBe` "'bcde'"
+        minifyExpr " \"cd\" + 'ef' + 'gh' " `shouldBe` "'cdefgh'"
 
+        minifyExpr " 'de' + '\"fg\"' + 'hi' " `shouldBe` "'de\"fg\"hi'"
+        minifyExpr " 'ef' + \"'gh'\" + 'ij' " `shouldBe` "'ef\\'gh\\'ij'"
 
+--        minifyExpr " 'de' + '\"fg\"' + 'hi' " `shouldBe` "'de\"fg\"hi'"
+--        minifyExpr " 'ef' + \"'gh'\" + 'ij' " `shouldBe` "'ef'gh'ij'"
+
 testMinifyStmt :: Spec
 testMinifyStmt = describe "Minify statements:" $ do
     forM_ [ "break", "continue", "return" ] $ \kw ->
@@ -205,7 +208,7 @@
         minifyStmt " var d = 1, x = 2 ; " `shouldBe` "var d=1,x=2"
 
     it "string concatenation" $
-        minifyStmt " f (\"ab\"+\"cd\") " `shouldBe` "f(\"abcd\")"
+        minifyStmt " f (\"ab\"+\"cd\") " `shouldBe` "f('abcd')"
 
 
 testMinifyProg :: Spec
diff --git a/dist/build/Language/JavaScript/Parser/Grammar5.hs b/dist/build/Language/JavaScript/Parser/Grammar5.hs
--- a/dist/build/Language/JavaScript/Parser/Grammar5.hs
+++ b/dist/build/Language/JavaScript/Parser/Grammar5.hs
@@ -1355,7 +1355,7 @@
 happyReduction_4 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn7
-		 (AST.JSSemi (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSSemi (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_5 = happySpecReduce_0  0# happyReduction_5
@@ -1367,7 +1367,7 @@
 happyReduction_6 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn8
-		 (AST.JSSemi (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSSemi (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_7 = happySpecReduce_1  1# happyReduction_7
@@ -1385,518 +1385,518 @@
 happyReduction_9 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn9
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_10 = happySpecReduce_1  3# happyReduction_10
 happyReduction_10 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn10
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_11 = happySpecReduce_1  4# happyReduction_11
 happyReduction_11 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn11
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_12 = happySpecReduce_1  5# happyReduction_12
 happyReduction_12 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn12
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_13 = happySpecReduce_1  6# happyReduction_13
 happyReduction_13 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn13
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_14 = happySpecReduce_1  7# happyReduction_14
 happyReduction_14 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn14
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_15 = happySpecReduce_1  8# happyReduction_15
 happyReduction_15 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn15
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_16 = happySpecReduce_1  9# happyReduction_16
 happyReduction_16 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn16
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_17 = happySpecReduce_1  10# happyReduction_17
 happyReduction_17 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn17
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_18 = happySpecReduce_1  11# happyReduction_18
 happyReduction_18 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn18
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_19 = happySpecReduce_1  12# happyReduction_19
 happyReduction_19 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn19
-		 (AST.JSUnaryOpIncr (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSUnaryOpIncr (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_20 = happySpecReduce_1  13# happyReduction_20
 happyReduction_20 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn20
-		 (AST.JSUnaryOpDecr (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSUnaryOpDecr (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_21 = happySpecReduce_1  14# happyReduction_21
 happyReduction_21 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn21
-		 (AST.JSUnaryOpDelete (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSUnaryOpDelete (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_22 = happySpecReduce_1  15# happyReduction_22
 happyReduction_22 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn22
-		 (AST.JSUnaryOpVoid (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSUnaryOpVoid (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_23 = happySpecReduce_1  16# happyReduction_23
 happyReduction_23 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn23
-		 (AST.JSUnaryOpTypeof (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSUnaryOpTypeof (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_24 = happySpecReduce_1  17# happyReduction_24
 happyReduction_24 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn24
-		 (AST.JSBinOpPlus (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpPlus (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_25 = happySpecReduce_1  18# happyReduction_25
 happyReduction_25 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn25
-		 (AST.JSBinOpMinus (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpMinus (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_26 = happySpecReduce_1  19# happyReduction_26
 happyReduction_26 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn26
-		 (AST.JSUnaryOpTilde (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSUnaryOpTilde (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_27 = happySpecReduce_1  20# happyReduction_27
 happyReduction_27 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn27
-		 (AST.JSUnaryOpNot (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSUnaryOpNot (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_28 = happySpecReduce_1  21# happyReduction_28
 happyReduction_28 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn28
-		 (AST.JSBinOpTimes (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpTimes (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_29 = happySpecReduce_1  22# happyReduction_29
 happyReduction_29 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn29
-		 (AST.JSBinOpDivide (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpDivide (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_30 = happySpecReduce_1  23# happyReduction_30
 happyReduction_30 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn30
-		 (AST.JSBinOpMod (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpMod (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_31 = happySpecReduce_1  24# happyReduction_31
 happyReduction_31 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn31
-		 (AST.JSBinOpLsh (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpLsh (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_32 = happySpecReduce_1  25# happyReduction_32
 happyReduction_32 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn32
-		 (AST.JSBinOpRsh (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpRsh (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_33 = happySpecReduce_1  26# happyReduction_33
 happyReduction_33 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn33
-		 (AST.JSBinOpUrsh (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpUrsh (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_34 = happySpecReduce_1  27# happyReduction_34
 happyReduction_34 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn34
-		 (AST.JSBinOpLe (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpLe (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_35 = happySpecReduce_1  28# happyReduction_35
 happyReduction_35 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn35
-		 (AST.JSBinOpLt (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpLt (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_36 = happySpecReduce_1  29# happyReduction_36
 happyReduction_36 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn36
-		 (AST.JSBinOpGe (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpGe (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_37 = happySpecReduce_1  30# happyReduction_37
 happyReduction_37 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn37
-		 (AST.JSBinOpGt (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpGt (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_38 = happySpecReduce_1  31# happyReduction_38
 happyReduction_38 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn38
-		 (AST.JSBinOpIn (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpIn (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_39 = happySpecReduce_1  32# happyReduction_39
 happyReduction_39 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn39
-		 (AST.JSBinOpInstanceOf (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpInstanceOf (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_40 = happySpecReduce_1  33# happyReduction_40
 happyReduction_40 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn40
-		 (AST.JSBinOpStrictEq (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpStrictEq (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_41 = happySpecReduce_1  34# happyReduction_41
 happyReduction_41 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn41
-		 (AST.JSBinOpEq (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpEq (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_42 = happySpecReduce_1  35# happyReduction_42
 happyReduction_42 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn42
-		 (AST.JSBinOpStrictNeq (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpStrictNeq (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_43 = happySpecReduce_1  36# happyReduction_43
 happyReduction_43 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn43
-		 (AST.JSBinOpNeq (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpNeq (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_44 = happySpecReduce_1  37# happyReduction_44
 happyReduction_44 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn44
-		 (AST.JSBinOpOr (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpOr (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_45 = happySpecReduce_1  38# happyReduction_45
 happyReduction_45 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn45
-		 (AST.JSBinOpAnd (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpAnd (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_46 = happySpecReduce_1  39# happyReduction_46
 happyReduction_46 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn46
-		 (AST.JSBinOpBitOr (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpBitOr (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_47 = happySpecReduce_1  40# happyReduction_47
 happyReduction_47 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn47
-		 (AST.JSBinOpBitAnd (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpBitAnd (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_48 = happySpecReduce_1  41# happyReduction_48
 happyReduction_48 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn48
-		 (AST.JSBinOpBitXor (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBinOpBitXor (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_49 = happySpecReduce_1  42# happyReduction_49
 happyReduction_49 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn49
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_50 = happySpecReduce_1  43# happyReduction_50
 happyReduction_50 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn50
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_51 = happySpecReduce_1  44# happyReduction_51
 happyReduction_51 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn51
-		 (AST.JSTimesAssign  (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSTimesAssign  (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_52 = happySpecReduce_1  44# happyReduction_52
 happyReduction_52 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn51
-		 (AST.JSDivideAssign (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSDivideAssign (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_53 = happySpecReduce_1  44# happyReduction_53
 happyReduction_53 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn51
-		 (AST.JSModAssign    (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSModAssign    (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_54 = happySpecReduce_1  44# happyReduction_54
 happyReduction_54 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn51
-		 (AST.JSPlusAssign   (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSPlusAssign   (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_55 = happySpecReduce_1  44# happyReduction_55
 happyReduction_55 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn51
-		 (AST.JSMinusAssign  (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSMinusAssign  (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_56 = happySpecReduce_1  44# happyReduction_56
 happyReduction_56 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn51
-		 (AST.JSLshAssign    (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSLshAssign    (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_57 = happySpecReduce_1  44# happyReduction_57
 happyReduction_57 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn51
-		 (AST.JSRshAssign    (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSRshAssign    (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_58 = happySpecReduce_1  44# happyReduction_58
 happyReduction_58 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn51
-		 (AST.JSUrshAssign   (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSUrshAssign   (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_59 = happySpecReduce_1  44# happyReduction_59
 happyReduction_59 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn51
-		 (AST.JSBwAndAssign  (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBwAndAssign  (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_60 = happySpecReduce_1  44# happyReduction_60
 happyReduction_60 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn51
-		 (AST.JSBwXorAssign  (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBwXorAssign  (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_61 = happySpecReduce_1  44# happyReduction_61
 happyReduction_61 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn51
-		 (AST.JSBwOrAssign   (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))
+		 (AST.JSBwOrAssign   (mkJSAnnot happy_var_1)
 	)}
 
 happyReduce_62 = happySpecReduce_1  45# happyReduction_62
 happyReduction_62 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn52
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_63 = happySpecReduce_1  46# happyReduction_63
 happyReduction_63 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn53
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_64 = happySpecReduce_1  47# happyReduction_64
 happyReduction_64 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn54
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_65 = happySpecReduce_1  48# happyReduction_65
 happyReduction_65 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn55
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_66 = happySpecReduce_1  49# happyReduction_66
 happyReduction_66 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn56
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_67 = happySpecReduce_1  50# happyReduction_67
 happyReduction_67 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn57
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_68 = happySpecReduce_1  51# happyReduction_68
 happyReduction_68 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn58
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_69 = happySpecReduce_1  52# happyReduction_69
 happyReduction_69 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn59
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_70 = happySpecReduce_1  53# happyReduction_70
 happyReduction_70 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn60
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_71 = happySpecReduce_1  54# happyReduction_71
 happyReduction_71 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn61
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_72 = happySpecReduce_1  55# happyReduction_72
 happyReduction_72 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn62
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_73 = happySpecReduce_1  56# happyReduction_73
 happyReduction_73 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn63
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_74 = happySpecReduce_1  57# happyReduction_74
 happyReduction_74 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn64
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_75 = happySpecReduce_1  58# happyReduction_75
 happyReduction_75 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn65
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_76 = happySpecReduce_1  59# happyReduction_76
 happyReduction_76 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn66
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1) {- 'Throw' -}
+		 (mkJSAnnot happy_var_1 {- 'Throw' -}
 	)}
 
 happyReduce_77 = happySpecReduce_1  60# happyReduction_77
 happyReduction_77 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn67
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_78 = happySpecReduce_1  61# happyReduction_78
 happyReduction_78 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn68
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_79 = happySpecReduce_1  62# happyReduction_79
 happyReduction_79 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn69
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_80 = happySpecReduce_1  63# happyReduction_80
 happyReduction_80 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn70
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1) {- 'Function' -}
+		 (mkJSAnnot happy_var_1 {- 'Function' -}
 	)}
 
 happyReduce_81 = happySpecReduce_1  64# happyReduction_81
 happyReduction_81 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn71
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)
+		 (mkJSAnnot happy_var_1
 	)}
 
 happyReduce_82 = happySpecReduce_1  65# happyReduction_82
 happyReduction_82 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn72
-		 (AST.JSAnnot (ts happy_var_1) (tc happy_var_1) {- 'Eof' -}
+		 (mkJSAnnot happy_var_1 {- 'Eof' -}
 	)}
 
 happyReduce_83 = happySpecReduce_1  66# happyReduction_83
@@ -1938,63 +1938,63 @@
 happyReduction_88 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn74
-		 (AST.JSLiteral (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "null"
+		 (AST.JSLiteral (mkJSAnnot happy_var_1) "null"
 	)}
 
 happyReduce_89 = happySpecReduce_1  68# happyReduction_89
 happyReduction_89 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn75
-		 (AST.JSLiteral (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "true"
+		 (AST.JSLiteral (mkJSAnnot happy_var_1) "true"
 	)}
 
 happyReduce_90 = happySpecReduce_1  68# happyReduction_90
 happyReduction_90 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn75
-		 (AST.JSLiteral (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "false"
+		 (AST.JSLiteral (mkJSAnnot happy_var_1) "false"
 	)}
 
 happyReduce_91 = happySpecReduce_1  69# happyReduction_91
 happyReduction_91 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn76
-		 (AST.JSDecimal (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) (tokenLiteral happy_var_1)
+		 (AST.JSDecimal (mkJSAnnot happy_var_1) (tokenLiteral happy_var_1)
 	)}
 
 happyReduce_92 = happySpecReduce_1  69# happyReduction_92
 happyReduction_92 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn76
-		 (AST.JSHexInteger (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) (tokenLiteral happy_var_1)
+		 (AST.JSHexInteger (mkJSAnnot happy_var_1) (tokenLiteral happy_var_1)
 	)}
 
 happyReduce_93 = happySpecReduce_1  69# happyReduction_93
 happyReduction_93 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn76
-		 (AST.JSOctal (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) (tokenLiteral happy_var_1)
+		 (AST.JSOctal (mkJSAnnot happy_var_1) (tokenLiteral happy_var_1)
 	)}
 
 happyReduce_94 = happySpecReduce_1  70# happyReduction_94
 happyReduction_94 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn77
-		 (AST.JSStringLiteral (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) (tokenLiteral happy_var_1)
+		 (AST.JSStringLiteral (mkJSAnnot happy_var_1) (tokenLiteral happy_var_1)
 	)}
 
 happyReduce_95 = happySpecReduce_1  71# happyReduction_95
 happyReduction_95 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn78
-		 (AST.JSRegEx (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) (tokenLiteral happy_var_1)
+		 (AST.JSRegEx (mkJSAnnot happy_var_1) (tokenLiteral happy_var_1)
 	)}
 
 happyReduce_96 = happySpecReduce_1  72# happyReduction_96
 happyReduction_96 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn79
-		 (AST.JSLiteral (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "this"
+		 (AST.JSLiteral (mkJSAnnot happy_var_1) "this"
 	)}
 
 happyReduce_97 = happySpecReduce_1  72# happyReduction_97
@@ -2040,21 +2040,21 @@
 happyReduction_102 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn80
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) (tokenLiteral happy_var_1)
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) (tokenLiteral happy_var_1)
 	)}
 
 happyReduce_103 = happySpecReduce_1  73# happyReduction_103
 happyReduction_103 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn80
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "get"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "get"
 	)}
 
 happyReduce_104 = happySpecReduce_1  73# happyReduction_104
 happyReduction_104 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn80
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "set"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "set"
 	)}
 
 happyReduce_105 = happySpecReduce_1  74# happyReduction_105
@@ -2068,238 +2068,238 @@
 happyReduction_106 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "break"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "break"
 	)}
 
 happyReduce_107 = happySpecReduce_1  74# happyReduction_107
 happyReduction_107 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "case"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "case"
 	)}
 
 happyReduce_108 = happySpecReduce_1  74# happyReduction_108
 happyReduction_108 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "catch"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "catch"
 	)}
 
 happyReduce_109 = happySpecReduce_1  74# happyReduction_109
 happyReduction_109 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "const"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "const"
 	)}
 
 happyReduce_110 = happySpecReduce_1  74# happyReduction_110
 happyReduction_110 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "continue"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "continue"
 	)}
 
 happyReduce_111 = happySpecReduce_1  74# happyReduction_111
 happyReduction_111 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "debugger"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "debugger"
 	)}
 
 happyReduce_112 = happySpecReduce_1  74# happyReduction_112
 happyReduction_112 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "default"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "default"
 	)}
 
 happyReduce_113 = happySpecReduce_1  74# happyReduction_113
 happyReduction_113 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "delete"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "delete"
 	)}
 
 happyReduce_114 = happySpecReduce_1  74# happyReduction_114
 happyReduction_114 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "do"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "do"
 	)}
 
 happyReduce_115 = happySpecReduce_1  74# happyReduction_115
 happyReduction_115 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "else"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "else"
 	)}
 
 happyReduce_116 = happySpecReduce_1  74# happyReduction_116
 happyReduction_116 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "enum"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "enum"
 	)}
 
 happyReduce_117 = happySpecReduce_1  74# happyReduction_117
 happyReduction_117 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "false"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "false"
 	)}
 
 happyReduce_118 = happySpecReduce_1  74# happyReduction_118
 happyReduction_118 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "finally"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "finally"
 	)}
 
 happyReduce_119 = happySpecReduce_1  74# happyReduction_119
 happyReduction_119 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "for"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "for"
 	)}
 
 happyReduce_120 = happySpecReduce_1  74# happyReduction_120
 happyReduction_120 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "function"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "function"
 	)}
 
 happyReduce_121 = happySpecReduce_1  74# happyReduction_121
 happyReduction_121 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "get"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "get"
 	)}
 
 happyReduce_122 = happySpecReduce_1  74# happyReduction_122
 happyReduction_122 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "if"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "if"
 	)}
 
 happyReduce_123 = happySpecReduce_1  74# happyReduction_123
 happyReduction_123 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "in"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "in"
 	)}
 
 happyReduce_124 = happySpecReduce_1  74# happyReduction_124
 happyReduction_124 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "instanceof"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "instanceof"
 	)}
 
 happyReduce_125 = happySpecReduce_1  74# happyReduction_125
 happyReduction_125 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "new"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "new"
 	)}
 
 happyReduce_126 = happySpecReduce_1  74# happyReduction_126
 happyReduction_126 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "null"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "null"
 	)}
 
 happyReduce_127 = happySpecReduce_1  74# happyReduction_127
 happyReduction_127 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "return"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "return"
 	)}
 
 happyReduce_128 = happySpecReduce_1  74# happyReduction_128
 happyReduction_128 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "set"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "set"
 	)}
 
 happyReduce_129 = happySpecReduce_1  74# happyReduction_129
 happyReduction_129 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "switch"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "switch"
 	)}
 
 happyReduce_130 = happySpecReduce_1  74# happyReduction_130
 happyReduction_130 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "this"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "this"
 	)}
 
 happyReduce_131 = happySpecReduce_1  74# happyReduction_131
 happyReduction_131 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "throw"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "throw"
 	)}
 
 happyReduce_132 = happySpecReduce_1  74# happyReduction_132
 happyReduction_132 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "true"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "true"
 	)}
 
 happyReduce_133 = happySpecReduce_1  74# happyReduction_133
 happyReduction_133 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "try"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "try"
 	)}
 
 happyReduce_134 = happySpecReduce_1  74# happyReduction_134
 happyReduction_134 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "typeof"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "typeof"
 	)}
 
 happyReduce_135 = happySpecReduce_1  74# happyReduction_135
 happyReduction_135 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "var"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "var"
 	)}
 
 happyReduce_136 = happySpecReduce_1  74# happyReduction_136
 happyReduction_136 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "void"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "void"
 	)}
 
 happyReduce_137 = happySpecReduce_1  74# happyReduction_137
 happyReduction_137 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "while"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "while"
 	)}
 
 happyReduce_138 = happySpecReduce_1  74# happyReduction_138
 happyReduction_138 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "with"
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) "with"
 	)}
 
 happyReduce_139 = happySpecReduce_1  74# happyReduction_139
 happyReduction_139 happy_x_1
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	happyIn81
-		 (AST.JSIdentifier (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) (tokenLiteral happy_var_1)
+		 (AST.JSIdentifier (mkJSAnnot happy_var_1) (tokenLiteral happy_var_1)
 	)}
 
 happyReduce_140 = happySpecReduce_2  75# happyReduction_140
@@ -2466,7 +2466,7 @@
 	case happyOut10 happy_x_4 of { happy_var_4 -> 
 	case happyOut160 happy_x_5 of { happy_var_5 -> 
 	happyIn87
-		 (AST.JSPropertyAccessor (AST.JSAccessorGet (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))) happy_var_2 happy_var_3 [] happy_var_4 happy_var_5
+		 (AST.JSPropertyAccessor (AST.JSAccessorGet (mkJSAnnot happy_var_1)) happy_var_2 happy_var_3 [] happy_var_4 happy_var_5
 	) `HappyStk` happyRest}}}}}
 
 happyReduce_156 = happyReduce 6# 80# happyReduction_156
@@ -2484,7 +2484,7 @@
 	case happyOut10 happy_x_5 of { happy_var_5 -> 
 	case happyOut160 happy_x_6 of { happy_var_6 -> 
 	happyIn87
-		 (AST.JSPropertyAccessor (AST.JSAccessorSet (AST.JSAnnot (ts happy_var_1) (tc happy_var_1))) happy_var_2 happy_var_3 [happy_var_4] happy_var_5 happy_var_6
+		 (AST.JSPropertyAccessor (AST.JSAccessorSet (mkJSAnnot happy_var_1)) happy_var_2 happy_var_3 [happy_var_4] happy_var_5 happy_var_6
 	) `HappyStk` happyRest}}}}}}
 
 happyReduce_157 = happySpecReduce_1  81# happyReduction_157
@@ -4247,7 +4247,7 @@
 	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
 	case happyOut7 happy_x_2 of { happy_var_2 -> 
 	happyIn153
-		 (AST.JSExpressionStatement (AST.JSLiteral (AST.JSAnnot (ts happy_var_1) (tc happy_var_1)) "debugger") happy_var_2 {- 'DebuggerStatement' -}
+		 (AST.JSExpressionStatement (AST.JSLiteral (mkJSAnnot happy_var_1) "debugger") happy_var_2 {- 'DebuggerStatement' -}
 	)}}
 
 happyReduce_334 = happySpecReduce_2  147# happyReduction_334
@@ -4566,22 +4566,11 @@
 mkJSMemberNew :: AST.JSAnnot -> AST.JSExpression -> JSArguments -> AST.JSExpression
 mkJSMemberNew a e (JSArguments l arglist r) = AST.JSMemberNew a e l arglist r
 
-
 parseError :: Token -> Alex a
 parseError = alexError . show
 
--- --------------------------------
-
-ts :: Token -> TokenPosn
-ts = tokenSpan
-
--- ------------------------------
-
-tc :: Token -> [CommentAnnotation]
-tc = tokenComment
-
-mtc :: [Token] -> [CommentAnnotation]
-mtc xs = concatMap tokenComment xs
+mkJSAnnot :: Token -> AST.JSAnnot
+mkJSAnnot a = AST.JSAnnot (tokenSpan a) (tokenComment a)
 
 -- ---------------------------------------------------------------------
 -- | mkUnary : The parser detects '+' and '-' as the binary version of these
@@ -4608,7 +4597,7 @@
 {-# LINE 1 "templates/GenericTemplate.hs" #-}
 {-# LINE 1 "<built-in>" #-}
 {-# LINE 1 "<command-line>" #-}
-{-# LINE 11 "<command-line>" #-}
+{-# LINE 13 "<command-line>" #-}
 # 1 "/usr/include/stdc-predef.h" 1 3 4
 
 # 17 "/usr/include/stdc-predef.h" 3 4
@@ -4654,7 +4643,8 @@
 
 
 
-{-# LINE 11 "<command-line>" #-}
+
+{-# LINE 13 "<command-line>" #-}
 {-# LINE 1 "/usr/lib/ghc/include/ghcversion.h" #-}
 
 
@@ -4673,7 +4663,171 @@
 
 
 
-{-# LINE 11 "<command-line>" #-}
+{-# LINE 13 "<command-line>" #-}
+{-# LINE 1 "/tmp/ghc6015_0/ghc_2.h" #-}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{-# LINE 13 "<command-line>" #-}
 {-# LINE 1 "templates/GenericTemplate.hs" #-}
 -- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp 
 
diff --git a/dist/build/Language/JavaScript/Parser/Lexer.hs b/dist/build/Language/JavaScript/Parser/Lexer.hs
--- a/dist/build/Language/JavaScript/Parser/Lexer.hs
+++ b/dist/build/Language/JavaScript/Parser/Lexer.hs
@@ -86,10 +86,6 @@
 
 
 
-
-
-
-
 {-# LINE 10 "<command-line>" #-}
 {-# LINE 1 "/usr/lib/ghc/include/ghcversion.h" #-}
 
@@ -163,24 +159,24 @@
                   String)       -- current input string
 
 ignorePendingBytes :: AlexInput -> AlexInput
-ignorePendingBytes (p,c,ps,s) = (p,c,[],s)
+ignorePendingBytes (p,c,_ps,s) = (p,c,[],s)
 
 alexInputPrevChar :: AlexInput -> Char
-alexInputPrevChar (p,c,bs,s) = c
+alexInputPrevChar (_p,c,_bs,_s) = c
 
 alexGetByte :: AlexInput -> Maybe (Byte,AlexInput)
 alexGetByte (p,c,(b:bs),s) = Just (b,(p,c,bs,s))
-alexGetByte (p,c,[],[]) = Nothing
-alexGetByte (p,_,[],(c:s))  = let p' = alexMove p c 
+alexGetByte (_,_,[],[]) = Nothing
+alexGetByte (p,_,[],(c:s))  = let p' = alexMove p c
                                   (b:bs) = utf8Encode c
                               in p' `seq`  Just (b, (p', c, bs, s))
 
 
-{-# LINE 101 "templates/wrappers.hs" #-}
+{-# LINE 102 "templates/wrappers.hs" #-}
 
-{-# LINE 119 "templates/wrappers.hs" #-}
+{-# LINE 120 "templates/wrappers.hs" #-}
 
-{-# LINE 137 "templates/wrappers.hs" #-}
+{-# LINE 138 "templates/wrappers.hs" #-}
 
 -- -----------------------------------------------------------------------------
 -- Token positions
@@ -201,7 +197,7 @@
 
 alexMove :: AlexPosn -> Char -> AlexPosn
 alexMove (AlexPn a l c) '\t' = AlexPn (a+1)  l     (((c+alex_tab_size-1) `div` alex_tab_size)*alex_tab_size+1)
-alexMove (AlexPn a l c) '\n' = AlexPn (a+1) (l+1)   1
+alexMove (AlexPn a l _) '\n' = AlexPn (a+1) (l+1)   1
 alexMove (AlexPn a l c) _    = AlexPn (a+1)  l     (c+1)
 
 
@@ -223,9 +219,9 @@
 -- Compile with -funbox-strict-fields for best results!
 
 runAlex :: String -> Alex a -> Either String a
-runAlex input (Alex f) 
+runAlex input (Alex f)
    = case f (AlexState {alex_pos = alexStartPos,
-                        alex_inp = input,       
+                        alex_inp = input,
                         alex_chr = '\n',
                         alex_bytes = [],
 
@@ -250,14 +246,14 @@
                                                Right (s'', b) -> Right (s'', f b)
 
 instance Monad Alex where
-  m >>= k  = Alex $ \s -> case unAlex m s of 
+  m >>= k  = Alex $ \s -> case unAlex m s of
                                 Left msg -> Left msg
                                 Right (s',a) -> unAlex (k a) s'
   return = App.pure
 
 alexGetInput :: Alex AlexInput
 alexGetInput
- = Alex $ \s@AlexState{alex_pos=pos,alex_chr=c,alex_bytes=bs,alex_inp=inp} -> 
+ = Alex $ \s@AlexState{alex_pos=pos,alex_chr=c,alex_bytes=bs,alex_inp=inp} ->
         Right (s, (pos,c,bs,inp))
 
 alexSetInput :: AlexInput -> Alex ()
@@ -266,7 +262,7 @@
                   s@(AlexState{}) -> Right (s, ())
 
 alexError :: String -> Alex a
-alexError message = Alex $ \s -> Left message
+alexError message = Alex $ const $ Left message
 
 alexGetStartCode :: Alex Int
 alexGetStartCode = Alex $ \s@AlexState{alex_scd=sc} -> Right (s, sc)
@@ -288,7 +284,7 @@
   case alexScan inp sc of
     AlexEOF -> alexEOF
     AlexError ((AlexPn _ line column),_,_,_) -> alexError $ "lexical error at line " ++ (show line) ++ ", column " ++ (show column)
-    AlexSkip  inp' len -> do
+    AlexSkip  inp' _len -> do
         alexSetInput inp'
         alexMonadScan
     AlexToken inp' len action -> do
@@ -302,11 +298,11 @@
 
 -- just ignore this token and scan another one
 -- skip :: AlexAction result
-skip input len = alexMonadScan
+skip _input _len = alexMonadScan
 
 -- ignore this token, but set the start code to a new value
 -- begin :: Int -> AlexAction result
-begin code input len = do alexSetStartCode code; alexMonadScan
+begin code _input _len = do alexSetStartCode code; alexMonadScan
 
 -- perform an action for this token, and set the start code to a new value
 andBegin :: AlexAction result -> Int -> AlexAction result
@@ -320,21 +316,21 @@
 -- -----------------------------------------------------------------------------
 -- Monad (with ByteString input)
 
-{-# LINE 374 "templates/wrappers.hs" #-}
+{-# LINE 375 "templates/wrappers.hs" #-}
 
 
 -- -----------------------------------------------------------------------------
 -- Basic wrapper
 
-{-# LINE 401 "templates/wrappers.hs" #-}
+{-# LINE 402 "templates/wrappers.hs" #-}
 
 
 -- -----------------------------------------------------------------------------
 -- Basic wrapper, ByteString version
 
-{-# LINE 421 "templates/wrappers.hs" #-}
+{-# LINE 422 "templates/wrappers.hs" #-}
 
-{-# LINE 437 "templates/wrappers.hs" #-}
+{-# LINE 438 "templates/wrappers.hs" #-}
 
 
 -- -----------------------------------------------------------------------------
@@ -342,13 +338,13 @@
 
 -- Adds text positions to the basic model.
 
-{-# LINE 454 "templates/wrappers.hs" #-}
+{-# LINE 455 "templates/wrappers.hs" #-}
 
 
 -- -----------------------------------------------------------------------------
 -- Posn wrapper, ByteString version
 
-{-# LINE 470 "templates/wrappers.hs" #-}
+{-# LINE 471 "templates/wrappers.hs" #-}
 
 
 -- -----------------------------------------------------------------------------
@@ -370,7 +366,10 @@
 alex_deflt :: AlexAddr
 alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xac\x01\xff\xff\xab\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\xff\xff\x3e\x00\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x56\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6d\x00\x6d\x00\xff\xff\xff\xff\x7a\x00\x7a\x00\x7e\x00\x7e\x00\x7f\x00\x80\x00\x80\x00\x7f\x00\xff\xff\x84\x00\x84\x00\xff\xff\x87\x00\x87\x00\xff\xff\x8d\x00\x8d\x00\x56\x00\x56\x00\x56\x00\x96\x00\x97\x00\x97\x00\x96\x00\xff\xff\x9c\x00\x9c\x00\xff\xff\xa1\x00\xa1\x00\xff\xff\xff\xff\xab\x00\xab\x00\xab\x00\xad\x00\xad\x00\x3e\x00\x3d\x00\xff\xff\x3e\x00\x3e\x00\x3d\x00\x3e\x00\x3d\x00\x3c\x00\xff\xff\xff\xff\x3c\x00\x3c\x00\xb9\x00\xff\xff\xff\xff\xb9\x00\xb9\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xab\x00\xa0\x01\xa0\x01\xa0\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb9\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xac\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xac\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xaa\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
 
-alex_accept = listArray (0::Int,486) [AlexAccSkip,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAcc (alex_action_1),AlexAcc (alex_action_2),AlexAcc (alex_action_3),AlexAcc (alex_action_4),AlexAcc (alex_action_5),AlexAcc (alex_action_6),AlexAcc (alex_action_7),AlexAcc (alex_action_8),AlexAcc (alex_action_8),AlexAcc (alex_action_9),AlexAcc (alex_action_9),AlexAcc (alex_action_9),AlexAcc (alex_action_9),AlexAccSkip,AlexAcc (alex_action_11),AlexAcc (alex_action_12),AlexAcc (alex_action_13),AlexAcc (alex_action_14),AlexAcc (alex_action_15),AlexAcc (alex_action_16),AlexAcc (alex_action_17),AlexAcc (alex_action_18),AlexAcc (alex_action_19),AlexAcc (alex_action_20),AlexAcc (alex_action_21),AlexAcc (alex_action_22),AlexAcc (alex_action_23),AlexAcc (alex_action_24),AlexAcc (alex_action_25),AlexAcc (alex_action_26),AlexAcc (alex_action_27),AlexAcc (alex_action_28),AlexAcc (alex_action_29),AlexAcc (alex_action_30),AlexAcc (alex_action_31),AlexAcc (alex_action_32),AlexAcc (alex_action_33),AlexAcc (alex_action_34),AlexAcc (alex_action_35),AlexAcc (alex_action_36),AlexAcc (alex_action_37),AlexAcc (alex_action_38),AlexAcc (alex_action_39),AlexAcc (alex_action_40),AlexAcc (alex_action_41),AlexAcc (alex_action_42),AlexAcc (alex_action_43),AlexAcc (alex_action_44),AlexAcc (alex_action_45),AlexAcc (alex_action_46),AlexAcc (alex_action_47),AlexAcc (alex_action_48),AlexAcc (alex_action_49),AlexAcc (alex_action_50),AlexAcc (alex_action_51),AlexAcc (alex_action_52),AlexAcc (alex_action_53),AlexAcc (alex_action_54),AlexAcc (alex_action_55),AlexAcc (alex_action_56),AlexAcc (alex_action_57),AlexAcc (alex_action_58)]
+alex_accept = listArray (0::Int,486) [AlexAccSkip,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAcc 60,AlexAcc 59,AlexAcc 58,AlexAcc 57,AlexAcc 56,AlexAcc 55,AlexAcc 54,AlexAcc 53,AlexAcc 52,AlexAcc 51,AlexAcc 50,AlexAcc 49,AlexAcc 48,AlexAccSkip,AlexAcc 47,AlexAcc 46,AlexAcc 45,AlexAcc 44,AlexAcc 43,AlexAcc 42,AlexAcc 41,AlexAcc 40,AlexAcc 39,AlexAcc 38,AlexAcc 37,AlexAcc 36,AlexAcc 35,AlexAcc 34,AlexAcc 33,AlexAcc 32,AlexAcc 31,AlexAcc 30,AlexAcc 29,AlexAcc 28,AlexAcc 27,AlexAcc 26,AlexAcc 25,AlexAcc 24,AlexAcc 23,AlexAcc 22,AlexAcc 21,AlexAcc 20,AlexAcc 19,AlexAcc 18,AlexAcc 17,AlexAcc 16,AlexAcc 15,AlexAcc 14,AlexAcc 13,AlexAcc 12,AlexAcc 11,AlexAcc 10,AlexAcc 9,AlexAcc 8,AlexAcc 7,AlexAcc 6,AlexAcc 5,AlexAcc 4,AlexAcc 3,AlexAcc 2,AlexAcc 1,AlexAcc 0]
+
+alex_actions = array (0::Int,61) [(60,alex_action_1),(59,alex_action_2),(58,alex_action_3),(57,alex_action_4),(56,alex_action_5),(55,alex_action_6),(54,alex_action_7),(53,alex_action_8),(52,alex_action_8),(51,alex_action_9),(50,alex_action_9),(49,alex_action_9),(48,alex_action_9),(47,alex_action_11),(46,alex_action_12),(45,alex_action_13),(44,alex_action_14),(43,alex_action_15),(42,alex_action_16),(41,alex_action_17),(40,alex_action_18),(39,alex_action_19),(38,alex_action_20),(37,alex_action_21),(36,alex_action_22),(35,alex_action_23),(34,alex_action_24),(33,alex_action_25),(32,alex_action_26),(31,alex_action_27),(30,alex_action_28),(29,alex_action_29),(28,alex_action_30),(27,alex_action_31),(26,alex_action_32),(25,alex_action_33),(24,alex_action_34),(23,alex_action_35),(22,alex_action_36),(21,alex_action_37),(20,alex_action_38),(19,alex_action_39),(18,alex_action_40),(17,alex_action_41),(16,alex_action_42),(15,alex_action_43),(14,alex_action_44),(13,alex_action_45),(12,alex_action_46),(11,alex_action_47),(10,alex_action_48),(9,alex_action_49),(8,alex_action_50),(7,alex_action_51),(6,alex_action_52),(5,alex_action_53),(4,alex_action_54),(3,alex_action_55),(2,alex_action_56),(1,alex_action_57),(0,alex_action_58)]
+
 {-# LINE 330 "src/Language/JavaScript/Parser/Lexer.x" #-}
 
 
@@ -465,7 +464,7 @@
 
     -- If the token is a WsToken and it contains a newline, convert it to an
     -- AutoSemiToken and call the continuation, otherwise, just lexLoop.
-    maybeAutoSemi ws@(WsToken sp tl cmt) =
+    maybeAutoSemi (WsToken sp tl cmt) =
         if any (== '\n') tl
             then cont $ AutoSemiToken sp tl cmt
             else lexLoop
@@ -473,7 +472,7 @@
 
 
 toCommentAnnotation :: [Token] -> [CommentAnnotation]
-toCommentAnnotation [] = [NoComment]
+toCommentAnnotation [] = []
 toCommentAnnotation xs =
     reverse $ map go xs
   where
@@ -733,10 +732,6 @@
 
 
 
-
-
-
-
 {-# LINE 10 "<command-line>" #-}
 {-# LINE 1 "/usr/lib/ghc/include/ghcversion.h" #-}
 
@@ -808,7 +803,7 @@
 
 
 {-# INLINE alexIndexInt32OffAddr #-}
-alexIndexInt32OffAddr (AlexA# arr) off = 
+alexIndexInt32OffAddr (AlexA# arr) off =
 #ifdef WORDS_BIGENDIAN
   narrow32Int# i
   where
@@ -854,30 +849,30 @@
 
 alexScanUser user input (I# (sc))
   = case alex_scan_tkn user input 0# input sc AlexNone of
-        (AlexNone, input') ->
-                case alexGetByte input of
-                        Nothing -> 
+  (AlexNone, input') ->
+    case alexGetByte input of
+      Nothing ->
 
 
 
                                    AlexEOF
-                        Just _ ->
+      Just _ ->
 
 
 
                                    AlexError input'
 
-        (AlexLastSkip input'' len, _) ->
+  (AlexLastSkip input'' len, _) ->
 
 
 
-                AlexSkip input'' len
+    AlexSkip input'' len
 
-        (AlexLastAcc k input''' len, _) ->
+  (AlexLastAcc k input''' len, _) ->
 
 
 
-                AlexToken input''' len k
+    AlexToken input''' len (alex_actions ! k)
 
 
 -- Push the input through the DFA, remembering the most recent accepting
@@ -885,13 +880,13 @@
 
 alex_scan_tkn user orig_input len input s last_acc =
   input `seq` -- strict in the input
-  let 
-        new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))
+  let
+  new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))
   in
   new_acc `seq`
   case alexGetByte input of
      Nothing -> (new_acc, input)
-     Just (c, new_input) -> 
+     Just (c, new_input) ->
 
 
 
@@ -900,7 +895,7 @@
                 base   = alexIndexInt32OffAddr alex_base s
                 offset = (base +# ord_c)
                 check  = alexIndexInt16OffAddr alex_check offset
-                
+
                 new_s = if GTE(offset,0#) && EQ(check,ord_c)
                           then alexIndexInt16OffAddr alex_table offset
                           else alexIndexInt16OffAddr alex_deflt s
@@ -919,17 +914,12 @@
         check_accs (AlexAccSkip) = AlexLastSkip  input (I# (len))
 {-# LINE 198 "templates/GenericTemplate.hs" #-}
 
-data AlexLastAcc a
+data AlexLastAcc
   = AlexNone
-  | AlexLastAcc a !AlexInput !Int
-  | AlexLastSkip  !AlexInput !Int
-
-instance Functor AlexLastAcc where
-    fmap _ AlexNone = AlexNone
-    fmap f (AlexLastAcc x y z) = AlexLastAcc (f x) y z
-    fmap _ (AlexLastSkip x y) = AlexLastSkip x y
+  | AlexLastAcc !Int !AlexInput !Int
+  | AlexLastSkip     !AlexInput !Int
 
-data AlexAcc a user
+data AlexAcc user
   = AlexAccNone
-  | AlexAcc a
+  | AlexAcc Int
   | AlexAccSkip
diff --git a/language-javascript.cabal b/language-javascript.cabal
--- a/language-javascript.cabal
+++ b/language-javascript.cabal
@@ -1,5 +1,5 @@
 Name:                language-javascript
-Version:             0.6.0.8
+Version:             0.6.0.9
 Synopsis:            Parser for JavaScript
 Description:         Parses Javascript into an Abstract Syntax Tree (AST).  Initially intended as frontend to hjsmin.
                      .
@@ -13,8 +13,8 @@
 Copyright:           (c) 2010-2015 Alan Zimmerman, 2015 Erik de Castro Lopo
 Category:            Language
 Build-type:          Simple
-homepage:            http://github.com/erikd/language-javascript
-bug-reports:         http://github.com/erikd/language-javascript/issues
+homepage:            https://github.com/erikd/language-javascript
+bug-reports:         https://github.com/erikd/language-javascript/issues
 Extra-source-files:  README.md
                      .ghci
                      buildall.sh
diff --git a/src/Language/JavaScript/Parser/AST.hs b/src/Language/JavaScript/Parser/AST.hs
--- a/src/Language/JavaScript/Parser/AST.hs
+++ b/src/Language/JavaScript/Parser/AST.hs
@@ -23,6 +23,7 @@
     , JSCommaList (..)
     , JSCommaTrailingList (..)
 
+    , binOpEq
     , showStripped
     ) where
 
@@ -35,6 +36,7 @@
 
 data JSAnnot
     = JSAnnot !TokenPosn ![CommentAnnotation] -- ^Annotation: position and comment/whitespace information
+    | JSAnnotSpace -- ^A single space character
     | JSNoAnnot -- ^No annotation
     deriving (Data, Eq, Show, Typeable)
 
@@ -425,3 +427,32 @@
 commaIf :: String -> String
 commaIf "" = ""
 commaIf xs = ',' : xs
+
+
+deAnnot :: JSBinOp -> JSBinOp
+deAnnot (JSBinOpAnd _) = JSBinOpAnd JSNoAnnot
+deAnnot (JSBinOpBitAnd _) = JSBinOpBitAnd JSNoAnnot
+deAnnot (JSBinOpBitOr _) = JSBinOpBitOr JSNoAnnot
+deAnnot (JSBinOpBitXor _) = JSBinOpBitXor JSNoAnnot
+deAnnot (JSBinOpDivide _) = JSBinOpDivide JSNoAnnot
+deAnnot (JSBinOpEq _) = JSBinOpEq JSNoAnnot
+deAnnot (JSBinOpGe _) = JSBinOpGe JSNoAnnot
+deAnnot (JSBinOpGt _) = JSBinOpGt JSNoAnnot
+deAnnot (JSBinOpIn _) = JSBinOpIn JSNoAnnot
+deAnnot (JSBinOpInstanceOf _) = JSBinOpInstanceOf JSNoAnnot
+deAnnot (JSBinOpLe _) = JSBinOpLe JSNoAnnot
+deAnnot (JSBinOpLsh _) = JSBinOpLsh JSNoAnnot
+deAnnot (JSBinOpLt _) = JSBinOpLt JSNoAnnot
+deAnnot (JSBinOpMinus _) = JSBinOpMinus JSNoAnnot
+deAnnot (JSBinOpMod _) = JSBinOpMod JSNoAnnot
+deAnnot (JSBinOpNeq _) = JSBinOpNeq JSNoAnnot
+deAnnot (JSBinOpOr _) = JSBinOpOr JSNoAnnot
+deAnnot (JSBinOpPlus _) = JSBinOpPlus JSNoAnnot
+deAnnot (JSBinOpRsh _) = JSBinOpRsh JSNoAnnot
+deAnnot (JSBinOpStrictEq _) = JSBinOpStrictEq JSNoAnnot
+deAnnot (JSBinOpStrictNeq _) = JSBinOpStrictNeq JSNoAnnot
+deAnnot (JSBinOpTimes _) = JSBinOpTimes JSNoAnnot
+deAnnot (JSBinOpUrsh _) = JSBinOpUrsh JSNoAnnot
+
+binOpEq :: JSBinOp -> JSBinOp -> Bool
+binOpEq a b = deAnnot a == deAnnot b
diff --git a/src/Language/JavaScript/Parser/Grammar5.y b/src/Language/JavaScript/Parser/Grammar5.y
--- a/src/Language/JavaScript/Parser/Grammar5.y
+++ b/src/Language/JavaScript/Parser/Grammar5.y
@@ -136,11 +136,11 @@
 -- by the Alex lexer or nothing.
 
 MaybeSemi :: { AST.JSSemi }
-MaybeSemi : ';' { AST.JSSemi (AST.JSAnnot (ts $1) (tc $1)) }
+MaybeSemi : ';' { AST.JSSemi (mkJSAnnot $1) }
          |      { AST.JSSemiAuto }
 
 AutoSemi :: { AST.JSSemi }
-AutoSemi : ';'         { AST.JSSemi (AST.JSAnnot (ts $1) (tc $1)) }
+AutoSemi : ';'         { AST.JSSemi (mkJSAnnot $1) }
          | 'autosemi'  { AST.JSSemiAuto }
          |             { AST.JSSemiAuto }
 
@@ -149,207 +149,207 @@
 -- Helpers
 
 LParen :: { AST.JSAnnot }
-LParen : '(' { AST.JSAnnot (ts $1) (tc $1) }
+LParen : '(' { mkJSAnnot $1 }
 
 RParen :: { AST.JSAnnot }
-RParen : ')' { AST.JSAnnot (ts $1) (tc $1) }
+RParen : ')' { mkJSAnnot $1 }
 
 LBrace :: { AST.JSAnnot }
-LBrace : '{' { AST.JSAnnot (ts $1) (tc $1) }
+LBrace : '{' { mkJSAnnot $1 }
 
 RBrace :: { AST.JSAnnot }
-RBrace : '}' { AST.JSAnnot (ts $1) (tc $1) }
+RBrace : '}' { mkJSAnnot $1 }
 
 LSquare :: { AST.JSAnnot }
-LSquare : '[' { AST.JSAnnot (ts $1) (tc $1) }
+LSquare : '[' { mkJSAnnot $1 }
 
 RSquare :: { AST.JSAnnot }
-RSquare : ']' { AST.JSAnnot (ts $1) (tc $1) }
+RSquare : ']' { mkJSAnnot $1 }
 
 Comma :: { AST.JSAnnot }
-Comma : ',' { AST.JSAnnot (ts $1) (tc $1) }
+Comma : ',' { mkJSAnnot $1 }
 
 Colon :: { AST.JSAnnot }
-Colon : ':' { AST.JSAnnot (ts $1) (tc $1) }
+Colon : ':' { mkJSAnnot $1 }
 
 Semi :: { AST.JSAnnot }
-Semi : ';' { AST.JSAnnot (ts $1) (tc $1) }
+Semi : ';' { mkJSAnnot $1 }
 
 Dot :: { AST.JSAnnot }
-Dot : '.' { AST.JSAnnot (ts $1) (tc $1) }
+Dot : '.' { mkJSAnnot $1 }
 
 Increment :: { AST.JSUnaryOp }
-Increment : '++' { AST.JSUnaryOpIncr (AST.JSAnnot (ts $1) (tc $1)) }
+Increment : '++' { AST.JSUnaryOpIncr (mkJSAnnot $1) }
 
 Decrement :: { AST.JSUnaryOp }
-Decrement : '--' { AST.JSUnaryOpDecr (AST.JSAnnot (ts $1) (tc $1)) }
+Decrement : '--' { AST.JSUnaryOpDecr (mkJSAnnot $1) }
 
 Delete :: { AST.JSUnaryOp }
-Delete : 'delete' { AST.JSUnaryOpDelete (AST.JSAnnot (ts $1) (tc $1)) }
+Delete : 'delete' { AST.JSUnaryOpDelete (mkJSAnnot $1) }
 
 Void :: { AST.JSUnaryOp }
-Void : 'void' { AST.JSUnaryOpVoid (AST.JSAnnot (ts $1) (tc $1)) }
+Void : 'void' { AST.JSUnaryOpVoid (mkJSAnnot $1) }
 
 Typeof :: { AST.JSUnaryOp }
-Typeof : 'typeof' { AST.JSUnaryOpTypeof (AST.JSAnnot (ts $1) (tc $1)) }
+Typeof : 'typeof' { AST.JSUnaryOpTypeof (mkJSAnnot $1) }
 
 Plus :: { AST.JSBinOp }
-Plus : '+' { AST.JSBinOpPlus (AST.JSAnnot (ts $1) (tc $1)) }
+Plus : '+' { AST.JSBinOpPlus (mkJSAnnot $1) }
 
 Minus :: { AST.JSBinOp }
-Minus : '-' { AST.JSBinOpMinus (AST.JSAnnot (ts $1) (tc $1)) }
+Minus : '-' { AST.JSBinOpMinus (mkJSAnnot $1) }
 
 Tilde :: { AST.JSUnaryOp }
-Tilde : '~' { AST.JSUnaryOpTilde (AST.JSAnnot (ts $1) (tc $1)) }
+Tilde : '~' { AST.JSUnaryOpTilde (mkJSAnnot $1) }
 
 Not :: { AST.JSUnaryOp }
-Not : '!' { AST.JSUnaryOpNot (AST.JSAnnot (ts $1) (tc $1)) }
+Not : '!' { AST.JSUnaryOpNot (mkJSAnnot $1) }
 
 Mul :: { AST.JSBinOp }
-Mul : '*' { AST.JSBinOpTimes (AST.JSAnnot (ts $1) (tc $1)) }
+Mul : '*' { AST.JSBinOpTimes (mkJSAnnot $1) }
 
 Div :: { AST.JSBinOp }
-Div : '/' { AST.JSBinOpDivide (AST.JSAnnot (ts $1) (tc $1)) }
+Div : '/' { AST.JSBinOpDivide (mkJSAnnot $1) }
 
 Mod :: { AST.JSBinOp }
-Mod : '%' { AST.JSBinOpMod (AST.JSAnnot (ts $1) (tc $1)) }
+Mod : '%' { AST.JSBinOpMod (mkJSAnnot $1) }
 
 Lsh :: { AST.JSBinOp }
-Lsh : '<<' { AST.JSBinOpLsh (AST.JSAnnot (ts $1) (tc $1)) }
+Lsh : '<<' { AST.JSBinOpLsh (mkJSAnnot $1) }
 
 Rsh :: { AST.JSBinOp }
-Rsh : '>>' { AST.JSBinOpRsh (AST.JSAnnot (ts $1) (tc $1)) }
+Rsh : '>>' { AST.JSBinOpRsh (mkJSAnnot $1) }
 
 Ursh :: { AST.JSBinOp }
-Ursh : '>>>' { AST.JSBinOpUrsh (AST.JSAnnot (ts $1) (tc $1)) }
+Ursh : '>>>' { AST.JSBinOpUrsh (mkJSAnnot $1) }
 
 Le :: { AST.JSBinOp }
-Le : '<=' { AST.JSBinOpLe (AST.JSAnnot (ts $1) (tc $1)) }
+Le : '<=' { AST.JSBinOpLe (mkJSAnnot $1) }
 
 Lt :: { AST.JSBinOp }
-Lt : '<' { AST.JSBinOpLt (AST.JSAnnot (ts $1) (tc $1)) }
+Lt : '<' { AST.JSBinOpLt (mkJSAnnot $1) }
 
 Ge :: { AST.JSBinOp }
-Ge : '>=' { AST.JSBinOpGe (AST.JSAnnot (ts $1) (tc $1)) }
+Ge : '>=' { AST.JSBinOpGe (mkJSAnnot $1) }
 
 Gt :: { AST.JSBinOp }
-Gt : '>' { AST.JSBinOpGt (AST.JSAnnot (ts $1) (tc $1)) }
+Gt : '>' { AST.JSBinOpGt (mkJSAnnot $1) }
 
 In :: { AST.JSBinOp }
-In : 'in' { AST.JSBinOpIn (AST.JSAnnot (ts $1) (tc $1)) }
+In : 'in' { AST.JSBinOpIn (mkJSAnnot $1) }
 
 Instanceof :: { AST.JSBinOp }
-Instanceof : 'instanceof' { AST.JSBinOpInstanceOf (AST.JSAnnot (ts $1) (tc $1)) }
+Instanceof : 'instanceof' { AST.JSBinOpInstanceOf (mkJSAnnot $1) }
 
 StrictEq :: { AST.JSBinOp }
-StrictEq : '===' { AST.JSBinOpStrictEq (AST.JSAnnot (ts $1) (tc $1)) }
+StrictEq : '===' { AST.JSBinOpStrictEq (mkJSAnnot $1) }
 
 Equal :: { AST.JSBinOp }
-Equal : '==' { AST.JSBinOpEq (AST.JSAnnot (ts $1) (tc $1)) }
+Equal : '==' { AST.JSBinOpEq (mkJSAnnot $1) }
 
 StrictNe :: { AST.JSBinOp }
-StrictNe : '!==' { AST.JSBinOpStrictNeq (AST.JSAnnot (ts $1) (tc $1)) }
+StrictNe : '!==' { AST.JSBinOpStrictNeq (mkJSAnnot $1) }
 
 Ne :: { AST.JSBinOp }
-Ne : '!=' { AST.JSBinOpNeq (AST.JSAnnot (ts $1) (tc $1))}
+Ne : '!=' { AST.JSBinOpNeq (mkJSAnnot $1)}
 
 Or :: { AST.JSBinOp }
-Or : '||' { AST.JSBinOpOr (AST.JSAnnot (ts $1) (tc $1)) }
+Or : '||' { AST.JSBinOpOr (mkJSAnnot $1) }
 
 And :: { AST.JSBinOp }
-And : '&&' { AST.JSBinOpAnd (AST.JSAnnot (ts $1) (tc $1)) }
+And : '&&' { AST.JSBinOpAnd (mkJSAnnot $1) }
 
 BitOr :: { AST.JSBinOp }
-BitOr : '|' { AST.JSBinOpBitOr (AST.JSAnnot (ts $1) (tc $1)) }
+BitOr : '|' { AST.JSBinOpBitOr (mkJSAnnot $1) }
 
 BitAnd :: { AST.JSBinOp }
-BitAnd : '&' { AST.JSBinOpBitAnd (AST.JSAnnot (ts $1) (tc $1)) }
+BitAnd : '&' { AST.JSBinOpBitAnd (mkJSAnnot $1) }
 
 BitXor :: { AST.JSBinOp }
-BitXor : '^' { AST.JSBinOpBitXor (AST.JSAnnot (ts $1) (tc $1))}
+BitXor : '^' { AST.JSBinOpBitXor (mkJSAnnot $1)}
 
 Hook :: { AST.JSAnnot }
-Hook : '?' { AST.JSAnnot (ts $1) (tc $1) }
+Hook : '?' { mkJSAnnot $1 }
 
 SimpleAssign :: { AST.JSAnnot }
-SimpleAssign : '=' { AST.JSAnnot (ts $1) (tc $1) }
+SimpleAssign : '=' { mkJSAnnot $1 }
 
 OpAssign :: { AST.JSAssignOp }
-OpAssign : '*='     { AST.JSTimesAssign  (AST.JSAnnot (ts $1) (tc $1)) }
-         | '/='     { AST.JSDivideAssign (AST.JSAnnot (ts $1) (tc $1)) }
-         | '%='     { AST.JSModAssign    (AST.JSAnnot (ts $1) (tc $1)) }
-         | '+='     { AST.JSPlusAssign   (AST.JSAnnot (ts $1) (tc $1)) }
-         | '-='     { AST.JSMinusAssign  (AST.JSAnnot (ts $1) (tc $1)) }
-         | '<<='    { AST.JSLshAssign    (AST.JSAnnot (ts $1) (tc $1)) }
-         | '>>='    { AST.JSRshAssign    (AST.JSAnnot (ts $1) (tc $1)) }
-         | '>>>='   { AST.JSUrshAssign   (AST.JSAnnot (ts $1) (tc $1)) }
-         | '&='     { AST.JSBwAndAssign  (AST.JSAnnot (ts $1) (tc $1)) }
-         | '^='     { AST.JSBwXorAssign  (AST.JSAnnot (ts $1) (tc $1)) }
-         | '|='     { AST.JSBwOrAssign   (AST.JSAnnot (ts $1) (tc $1)) }
+OpAssign : '*='     { AST.JSTimesAssign  (mkJSAnnot $1) }
+         | '/='     { AST.JSDivideAssign (mkJSAnnot $1) }
+         | '%='     { AST.JSModAssign    (mkJSAnnot $1) }
+         | '+='     { AST.JSPlusAssign   (mkJSAnnot $1) }
+         | '-='     { AST.JSMinusAssign  (mkJSAnnot $1) }
+         | '<<='    { AST.JSLshAssign    (mkJSAnnot $1) }
+         | '>>='    { AST.JSRshAssign    (mkJSAnnot $1) }
+         | '>>>='   { AST.JSUrshAssign   (mkJSAnnot $1) }
+         | '&='     { AST.JSBwAndAssign  (mkJSAnnot $1) }
+         | '^='     { AST.JSBwXorAssign  (mkJSAnnot $1) }
+         | '|='     { AST.JSBwOrAssign   (mkJSAnnot $1) }
 
 Var :: { AST.JSAnnot }
-Var : 'var' { AST.JSAnnot (ts $1) (tc $1) }
+Var : 'var' { mkJSAnnot $1 }
 
 Const :: { AST.JSAnnot }
-Const : 'const' { AST.JSAnnot (ts $1) (tc $1) }
+Const : 'const' { mkJSAnnot $1 }
 
 If :: { AST.JSAnnot }
-If : 'if' { AST.JSAnnot (ts $1) (tc $1) }
+If : 'if' { mkJSAnnot $1 }
 
 Else :: { AST.JSAnnot }
-Else : 'else' { AST.JSAnnot (ts $1) (tc $1) }
+Else : 'else' { mkJSAnnot $1 }
 
 Do :: { AST.JSAnnot }
-Do : 'do' { AST.JSAnnot (ts $1) (tc $1) }
+Do : 'do' { mkJSAnnot $1 }
 
 While :: { AST.JSAnnot }
-While : 'while' { AST.JSAnnot (ts $1) (tc $1) }
+While : 'while' { mkJSAnnot $1 }
 
 For :: { AST.JSAnnot }
-For : 'for' { AST.JSAnnot (ts $1) (tc $1) }
+For : 'for' { mkJSAnnot $1 }
 
 Continue :: { AST.JSAnnot }
-Continue : 'continue' { AST.JSAnnot (ts $1) (tc $1) }
+Continue : 'continue' { mkJSAnnot $1 }
 
 Break :: { AST.JSAnnot }
-Break : 'break' { AST.JSAnnot (ts $1) (tc $1) }
+Break : 'break' { mkJSAnnot $1 }
 
 Return :: { AST.JSAnnot }
-Return : 'return' { AST.JSAnnot (ts $1) (tc $1) }
+Return : 'return' { mkJSAnnot $1 }
 
 With :: { AST.JSAnnot }
-With : 'with' { AST.JSAnnot (ts $1) (tc $1) }
+With : 'with' { mkJSAnnot $1 }
 
 Switch :: { AST.JSAnnot }
-Switch : 'switch' { AST.JSAnnot (ts $1) (tc $1) }
+Switch : 'switch' { mkJSAnnot $1 }
 
 Case :: { AST.JSAnnot }
-Case : 'case' { AST.JSAnnot (ts $1) (tc $1) }
+Case : 'case' { mkJSAnnot $1 }
 
 Default :: { AST.JSAnnot }
-Default : 'default' { AST.JSAnnot (ts $1) (tc $1) }
+Default : 'default' { mkJSAnnot $1 }
 
 Throw :: { AST.JSAnnot }
-Throw : 'throw' { AST.JSAnnot (ts $1) (tc $1) {- 'Throw' -} }
+Throw : 'throw' { mkJSAnnot $1 {- 'Throw' -} }
 
 Try :: { AST.JSAnnot }
-Try : 'try' { AST.JSAnnot (ts $1) (tc $1) }
+Try : 'try' { mkJSAnnot $1 }
 
 CatchL :: { AST.JSAnnot }
-CatchL : 'catch' { AST.JSAnnot (ts $1) (tc $1) }
+CatchL : 'catch' { mkJSAnnot $1 }
 
 FinallyL :: { AST.JSAnnot }
-FinallyL : 'finally' { AST.JSAnnot (ts $1) (tc $1) }
+FinallyL : 'finally' { mkJSAnnot $1 }
 
 Function :: { AST.JSAnnot }
-Function : 'function' { AST.JSAnnot (ts $1) (tc $1) {- 'Function' -} }
+Function : 'function' { mkJSAnnot $1 {- 'Function' -} }
 
 New :: { AST.JSAnnot }
-New : 'new' { AST.JSAnnot (ts $1) (tc $1) }
+New : 'new' { mkJSAnnot $1 }
 
 
 Eof :: { AST.JSAnnot }
-Eof : 'tail' { AST.JSAnnot (ts $1) (tc $1) {- 'Eof' -} }
+Eof : 'tail' { mkJSAnnot $1 {- 'Eof' -} }
 
 -- Literal ::                                                                See 7.8
 --         NullLiteral
@@ -364,26 +364,26 @@
         | RegularExpressionLiteral { $1 }
 
 NullLiteral :: { AST.JSExpression }
-NullLiteral : 'null' { AST.JSLiteral (AST.JSAnnot (ts $1) (tc $1)) "null" }
+NullLiteral : 'null' { AST.JSLiteral (mkJSAnnot $1) "null" }
 
 BooleanLiteral :: { AST.JSExpression }
-BooleanLiteral : 'true'  { AST.JSLiteral (AST.JSAnnot (ts $1) (tc $1)) "true" }
-               | 'false' { AST.JSLiteral (AST.JSAnnot (ts $1) (tc $1)) "false" }
+BooleanLiteral : 'true'  { AST.JSLiteral (mkJSAnnot $1) "true" }
+               | 'false' { AST.JSLiteral (mkJSAnnot $1) "false" }
 
 -- <Numeric Literal> ::= DecimalLiteral
 --                     | HexIntegerLiteral
 --                     | OctalLiteral
 NumericLiteral :: { AST.JSExpression }
-NumericLiteral : 'decimal'    { AST.JSDecimal (AST.JSAnnot (ts $1) (tc $1)) (tokenLiteral $1) }
-               | 'hexinteger' { AST.JSHexInteger (AST.JSAnnot (ts $1) (tc $1)) (tokenLiteral $1) }
-               | 'octal'      { AST.JSOctal (AST.JSAnnot (ts $1) (tc $1)) (tokenLiteral $1) }
+NumericLiteral : 'decimal'    { AST.JSDecimal (mkJSAnnot $1) (tokenLiteral $1) }
+               | 'hexinteger' { AST.JSHexInteger (mkJSAnnot $1) (tokenLiteral $1) }
+               | 'octal'      { AST.JSOctal (mkJSAnnot $1) (tokenLiteral $1) }
 
 StringLiteral :: { AST.JSExpression }
-StringLiteral : 'string'  { AST.JSStringLiteral (AST.JSAnnot (ts $1) (tc $1)) (tokenLiteral $1) }
+StringLiteral : 'string'  { AST.JSStringLiteral (mkJSAnnot $1) (tokenLiteral $1) }
 
 -- <Regular Expression Literal> ::= RegExp
 RegularExpressionLiteral :: { AST.JSExpression }
-RegularExpressionLiteral : 'regex' { AST.JSRegEx (AST.JSAnnot (ts $1) (tc $1)) (tokenLiteral $1) }
+RegularExpressionLiteral : 'regex' { AST.JSRegEx (mkJSAnnot $1) (tokenLiteral $1) }
 
 -- PrimaryExpression :                                                   See 11.1
 --        this
@@ -393,7 +393,7 @@
 --        ObjectLiteral
 --        ( Expression )
 PrimaryExpression :: { AST.JSExpression }
-PrimaryExpression : 'this'                   { AST.JSLiteral (AST.JSAnnot (ts $1) (tc $1)) "this" }
+PrimaryExpression : 'this'                   { AST.JSLiteral (mkJSAnnot $1) "this" }
                   | Identifier               { $1 {- 'PrimaryExpression1' -} }
                   | Literal                  { $1 {- 'PrimaryExpression2' -} }
                   | ArrayLiteral             { $1 {- 'PrimaryExpression3' -} }
@@ -406,47 +406,47 @@
 --         IdentifierStart
 --         IdentifierName IdentifierPart
 Identifier :: { AST.JSExpression }
-Identifier : 'ident' { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) (tokenLiteral $1) }
-           | 'get'   { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "get" }
-           | 'set'   { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "set" }
+Identifier : 'ident' { AST.JSIdentifier (mkJSAnnot $1) (tokenLiteral $1) }
+           | 'get'   { AST.JSIdentifier (mkJSAnnot $1) "get" }
+           | 'set'   { AST.JSIdentifier (mkJSAnnot $1) "set" }
 
 -- TODO: make this include any reserved word too, including future ones
 IdentifierName :: { AST.JSExpression }
 IdentifierName : Identifier {$1}
-             | 'break'      { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "break" }
-             | 'case'       { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "case" }
-             | 'catch'      { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "catch" }
-             | 'const'      { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "const" }
-             | 'continue'   { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "continue" }
-             | 'debugger'   { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "debugger" }
-             | 'default'    { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "default" }
-             | 'delete'     { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "delete" }
-             | 'do'         { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "do" }
-             | 'else'       { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "else" }
-             | 'enum'       { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "enum" }
-             | 'false'      { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "false" }
-             | 'finally'    { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "finally" }
-             | 'for'        { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "for" }
-             | 'function'   { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "function" }
-             | 'get'        { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "get" }
-             | 'if'         { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "if" }
-             | 'in'         { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "in" }
-             | 'instanceof' { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "instanceof" }
-             | 'new'        { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "new" }
-             | 'null'       { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "null" }
-             | 'return'     { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "return" }
-             | 'set'        { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "set" }
-             | 'switch'     { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "switch" }
-             | 'this'       { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "this" }
-             | 'throw'      { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "throw" }
-             | 'true'       { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "true" }
-             | 'try'        { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "try" }
-             | 'typeof'     { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "typeof" }
-             | 'var'        { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "var" }
-             | 'void'       { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "void" }
-             | 'while'      { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "while" }
-             | 'with'       { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) "with" }
-             | 'future'     { AST.JSIdentifier (AST.JSAnnot (ts $1) (tc $1)) (tokenLiteral $1) }
+             | 'break'      { AST.JSIdentifier (mkJSAnnot $1) "break" }
+             | 'case'       { AST.JSIdentifier (mkJSAnnot $1) "case" }
+             | 'catch'      { AST.JSIdentifier (mkJSAnnot $1) "catch" }
+             | 'const'      { AST.JSIdentifier (mkJSAnnot $1) "const" }
+             | 'continue'   { AST.JSIdentifier (mkJSAnnot $1) "continue" }
+             | 'debugger'   { AST.JSIdentifier (mkJSAnnot $1) "debugger" }
+             | 'default'    { AST.JSIdentifier (mkJSAnnot $1) "default" }
+             | 'delete'     { AST.JSIdentifier (mkJSAnnot $1) "delete" }
+             | 'do'         { AST.JSIdentifier (mkJSAnnot $1) "do" }
+             | 'else'       { AST.JSIdentifier (mkJSAnnot $1) "else" }
+             | 'enum'       { AST.JSIdentifier (mkJSAnnot $1) "enum" }
+             | 'false'      { AST.JSIdentifier (mkJSAnnot $1) "false" }
+             | 'finally'    { AST.JSIdentifier (mkJSAnnot $1) "finally" }
+             | 'for'        { AST.JSIdentifier (mkJSAnnot $1) "for" }
+             | 'function'   { AST.JSIdentifier (mkJSAnnot $1) "function" }
+             | 'get'        { AST.JSIdentifier (mkJSAnnot $1) "get" }
+             | 'if'         { AST.JSIdentifier (mkJSAnnot $1) "if" }
+             | 'in'         { AST.JSIdentifier (mkJSAnnot $1) "in" }
+             | 'instanceof' { AST.JSIdentifier (mkJSAnnot $1) "instanceof" }
+             | 'new'        { AST.JSIdentifier (mkJSAnnot $1) "new" }
+             | 'null'       { AST.JSIdentifier (mkJSAnnot $1) "null" }
+             | 'return'     { AST.JSIdentifier (mkJSAnnot $1) "return" }
+             | 'set'        { AST.JSIdentifier (mkJSAnnot $1) "set" }
+             | 'switch'     { AST.JSIdentifier (mkJSAnnot $1) "switch" }
+             | 'this'       { AST.JSIdentifier (mkJSAnnot $1) "this" }
+             | 'throw'      { AST.JSIdentifier (mkJSAnnot $1) "throw" }
+             | 'true'       { AST.JSIdentifier (mkJSAnnot $1) "true" }
+             | 'try'        { AST.JSIdentifier (mkJSAnnot $1) "try" }
+             | 'typeof'     { AST.JSIdentifier (mkJSAnnot $1) "typeof" }
+             | 'var'        { AST.JSIdentifier (mkJSAnnot $1) "var" }
+             | 'void'       { AST.JSIdentifier (mkJSAnnot $1) "void" }
+             | 'while'      { AST.JSIdentifier (mkJSAnnot $1) "while" }
+             | 'with'       { AST.JSIdentifier (mkJSAnnot $1) "with" }
+             | 'future'     { AST.JSIdentifier (mkJSAnnot $1) (tokenLiteral $1) }
 
 
 
@@ -506,10 +506,10 @@
 PropertyAssignment : PropertyName Colon AssignmentExpression { AST.JSPropertyNameandValue $1 $2 [$3] }
                    -- Should be "get" in next, but is not a Token
                    | 'get' PropertyName LParen RParen FunctionBody
-                       { AST.JSPropertyAccessor (AST.JSAccessorGet (AST.JSAnnot (ts $1) (tc $1))) $2 $3 [] $4 $5 }
+                       { AST.JSPropertyAccessor (AST.JSAccessorGet (mkJSAnnot $1)) $2 $3 [] $4 $5 }
                    -- Should be "set" in next, but is not a Token
                    | 'set' PropertyName LParen PropertySetParameterList RParen FunctionBody
-                       { AST.JSPropertyAccessor (AST.JSAccessorSet (AST.JSAnnot (ts $1) (tc $1))) $2 $3 [$4] $5 $6 }
+                       { AST.JSPropertyAccessor (AST.JSAccessorSet (mkJSAnnot $1)) $2 $3 [$4] $5 $6 }
 
 -- PropertyName :                                                        See 11.1.5
 --        IdentifierName
@@ -1067,7 +1067,7 @@
 -- DebuggerStatement :                                                        See 12.15
 --        debugger ;
 DebuggerStatement :: { AST.JSStatement }
-DebuggerStatement : 'debugger' MaybeSemi { AST.JSExpressionStatement (AST.JSLiteral (AST.JSAnnot (ts $1) (tc $1)) "debugger") $2 {- 'DebuggerStatement' -} }
+DebuggerStatement : 'debugger' MaybeSemi { AST.JSExpressionStatement (AST.JSLiteral (mkJSAnnot $1) "debugger") $2 {- 'DebuggerStatement' -} }
 
 -- FunctionDeclaration :                                                      See clause 13
 --        function Identifier ( FormalParameterListopt ) { FunctionBody }
@@ -1152,22 +1152,11 @@
 mkJSMemberNew :: AST.JSAnnot -> AST.JSExpression -> JSArguments -> AST.JSExpression
 mkJSMemberNew a e (JSArguments l arglist r) = AST.JSMemberNew a e l arglist r
 
-
 parseError :: Token -> Alex a
 parseError = alexError . show
 
--- --------------------------------
-
-ts :: Token -> TokenPosn
-ts = tokenSpan
-
--- ------------------------------
-
-tc :: Token -> [CommentAnnotation]
-tc = tokenComment
-
-mtc :: [Token] -> [CommentAnnotation]
-mtc xs = concatMap tokenComment xs
+mkJSAnnot :: Token -> AST.JSAnnot
+mkJSAnnot a = AST.JSAnnot (tokenSpan a) (tokenComment a)
 
 -- ---------------------------------------------------------------------
 -- | mkUnary : The parser detects '+' and '-' as the binary version of these
diff --git a/src/Language/JavaScript/Parser/Lexer.x b/src/Language/JavaScript/Parser/Lexer.x
--- a/src/Language/JavaScript/Parser/Lexer.x
+++ b/src/Language/JavaScript/Parser/Lexer.x
@@ -420,7 +420,7 @@
 
     -- If the token is a WsToken and it contains a newline, convert it to an
     -- AutoSemiToken and call the continuation, otherwise, just lexLoop.
-    maybeAutoSemi ws@(WsToken sp tl cmt) =
+    maybeAutoSemi (WsToken sp tl cmt) =
         if any (== '\n') tl
             then cont $ AutoSemiToken sp tl cmt
             else lexLoop
@@ -428,7 +428,7 @@
 
 
 toCommentAnnotation :: [Token] -> [CommentAnnotation]
-toCommentAnnotation [] = [NoComment]
+toCommentAnnotation [] = []
 toCommentAnnotation xs =
     reverse $ map go xs
   where
diff --git a/src/Language/JavaScript/Process/Minify.hs b/src/Language/JavaScript/Process/Minify.hs
--- a/src/Language/JavaScript/Process/Minify.hs
+++ b/src/Language/JavaScript/Process/Minify.hs
@@ -145,7 +145,7 @@
     fix a (JSCallExpressionDot    ex _ xs)            = JSCallExpressionDot (fix a ex) emptyAnnot (fixEmpty xs)
     fix a (JSCallExpressionSquare ex _ xs _)          = JSCallExpressionSquare (fix a ex) emptyAnnot (fixEmpty xs) emptyAnnot
     fix a (JSCommaExpression      le _ re)            = JSCommaExpression (fix a le) emptyAnnot (fixEmpty re)
-    fix a (JSExpressionBinary     lhs op rhs)         = fixBinOpExpression a op (fixEmpty lhs) (fixEmpty rhs)
+    fix a (JSExpressionBinary     lhs op rhs)         = fixBinOpExpression a op lhs rhs
     fix _ (JSExpressionParen      _ e _)              = JSExpressionParen emptyAnnot (fixEmpty e) emptyAnnot
     fix a (JSExpressionPostfix    e op)               = JSExpressionPostfix (fix a e) (fixEmpty op)
     fix a (JSExpressionTernary    cond _ v1 _ v2)     = JSExpressionTernary (fix a cond) emptyAnnot (fixEmpty v1) emptyAnnot (fixEmpty v2)
@@ -165,24 +165,43 @@
 fixVarList JSLNil = JSLNil
 
 fixBinOpExpression :: JSAnnot -> JSBinOp -> JSExpression -> JSExpression -> JSExpression
-fixBinOpExpression _ (JSBinOpPlus _) (JSStringLiteral _ s1) (JSStringLiteral _ s2) = stringLitConcat s1 s2
+fixBinOpExpression a (JSBinOpPlus _) lhs rhs = fixBinOpPlus a lhs rhs
 fixBinOpExpression a (JSBinOpIn _) lhs rhs = JSExpressionBinary (fix a lhs) (JSBinOpIn spaceAnnot) (fix spaceAnnot rhs)
 fixBinOpExpression a (JSBinOpInstanceOf _) lhs rhs = JSExpressionBinary (fix a lhs) (JSBinOpInstanceOf spaceAnnot) (fix spaceAnnot rhs)
 fixBinOpExpression a op lhs rhs = JSExpressionBinary (fix a lhs) (fixEmpty op) (fixEmpty rhs)
 
+fixBinOpPlus :: JSAnnot -> JSExpression -> JSExpression -> JSExpression
+fixBinOpPlus a lhs rhs =
+    case (fix a lhs, fixEmpty rhs) of
+        (JSStringLiteral _ s1, JSStringLiteral _ s2) -> stringLitConcat (normalizeToSQ s1) (normalizeToSQ s2)
+        (nlhs, nrhs) -> JSExpressionBinary nlhs (JSBinOpPlus emptyAnnot) nrhs
+
 -- Concatenate two JSStringLiterals. Since the strings will include the string
 -- terminators (either single or double quotes) we use whatever terminator is
--- used bu the first string.
+-- used by the first string.
 stringLitConcat :: String -> String -> JSExpression
 stringLitConcat xs [] = JSStringLiteral emptyAnnot xs
 stringLitConcat [] ys = JSStringLiteral emptyAnnot ys
-stringLitConcat xall@(q:_) yall@(_:yss) =
-    let ys = init yss in
-    if q `notElem` ys
-        then JSStringLiteral emptyAnnot (init xall ++ ys ++ [q])
-        else -- TODO: Correct, but can we do better?
-            JSExpressionBinary (JSStringLiteral emptyAnnot xall) (JSBinOpPlus emptyAnnot) (JSStringLiteral emptyAnnot yall)
+stringLitConcat xall (_:yss) =
+    JSStringLiteral emptyAnnot (init xall ++ init yss ++ "'")
 
+-- Normalize a String. If its single quoted, just return it and its double quoted
+-- convert it to single quoted.
+normalizeToSQ :: String -> String
+normalizeToSQ str =
+    case str of
+        [] -> []
+        ('\'' : _) -> str
+        ('"' : xs) -> '\'' : convertSQ xs
+        other -> other -- Should not happen.
+  where
+    convertSQ [] = []
+    convertSQ [_] = "'"
+    convertSQ ('\'':xs) = '\\' : '\'' : convertSQ xs
+    convertSQ ('\\':'\"':xs) = '"' : convertSQ xs
+    convertSQ (x:xs) = x : convertSQ xs
+
+
 instance MinifyJS JSBinOp where
     fix _ (JSBinOpAnd        _) = JSBinOpAnd emptyAnnot
     fix _ (JSBinOpBitAnd     _) = JSBinOpBitAnd emptyAnnot
@@ -319,7 +338,7 @@
 spaceAnnot = JSAnnot tokenPosnEmpty [WhiteSpace tokenPosnEmpty " "]
 
 emptyAnnot :: JSAnnot
-emptyAnnot = JSAnnot tokenPosnEmpty []
+emptyAnnot = JSNoAnnot
 
 newlineAnnot :: JSAnnot
 newlineAnnot = JSAnnot tokenPosnEmpty [WhiteSpace tokenPosnEmpty "\n"]
