diff --git a/src/ast/parser.lalrpop b/src/ast/parser.lalrpop
index 1594e82b50edf8a9756315d5a971f4b2ca944a8a..d011793644df38ba18ac8e48353c849371014fff 100644
--- a/src/ast/parser.lalrpop
+++ b/src/ast/parser.lalrpop
@@ -19,8 +19,13 @@ CommaNoTrail<T>: Vec<T> = {
     <mut v:(<T> ",")*> <e:T> => { v.push(e); v }
 }
 
-Tier<Op, NextTier>: () = {
-    Tier<Op,NextTier> Op NextTier,
+Tier2<Op, NextTier>: () = {
+    Tier2<Op, NextTier> Op NextTier,
+    NextTier
+};
+
+Tier1<Op, NextTier>: () = {
+    Op NextTier,
     NextTier
 };
 
@@ -45,6 +50,7 @@ Type:() = {
     "i32",
     "bool",
     "()",
+    "!",
 }
 
 Block: () = {
@@ -81,49 +87,50 @@ ExprBlock: () = {
     Block,
 }
 
+// Lowest Precedence
+ExprNoBlock = Tier2<AndOrOp, AndOr>; 
+AndOr = Tier2<ComparisonOp, AddSub>;
+AddSub = Tier2<AddSubOp, MulDiv>;
+MulDiv = Tier2<MulDivOp, Unary>;
+Unary = Tier1<UnaryOp, Term>;
 
-ExprNoBlock = Tier<AndOr, Expr0>;
-Expr0 = Tier<Comparison, Expr1>;
-Expr1 = Tier<AddSub, Expr2>;
-Expr2 = Tier<MulDiv, Expr3>;
-Expr3 = Tier<Unary, Term>;
+// Highest Precedence
+Term: () = {
+    Id,
+    Num,
+    Id "(" CommaNoTrail<Expr> ")",    
+    "(" Expr ")",
+}
 
-AndOr: () = {
+AndOrOp: () = {
     "||",
     "&&",
 }
 
-Comparison: () = {
+ComparisonOp: () = {
     "==",
     "!=", 
     ">", 
     "<",
 }
 
-AddSub: () = {
+AddSubOp: () = {
     "+",
     "-", 
 }
 
-MulDiv: () = {
+MulDivOp: () = {
     "/",
     "*", 
 }
 
-Unary: () = {
+UnaryOp: () = {
     "!",
     "*",
     "&",
     "&" "mut", 
 }
 
-Term: () = {
-    Id,
-    Num,
-    Id "(" CommaNoTrail<Expr> ")",
-    "(" Expr ")",
-}
-
 
 
 Num: i32 = {