diff --git a/dist/build/ewe/ewe-tmp/Language/EWE/Parser.hs b/dist/build/ewe/ewe-tmp/Language/EWE/Parser.hs
--- a/dist/build/ewe/ewe-tmp/Language/EWE/Parser.hs
+++ b/dist/build/ewe/ewe-tmp/Language/EWE/Parser.hs
@@ -3,13 +3,14 @@
 {-# OPTIONS -w #-}
 module Language.EWE.Parser(pEWE) where
 
-import Language.EWE.Token(Tkns,Tkn(..))
+import Language.EWE.Token(Tkns,Tkn(..), Tkn_(..))
 import Language.EWE.Scanner
 import Language.EWE.AbsSyn
 import qualified Data.Array as Happy_Data_Array
 import qualified GHC.Exts as Happy_GHC_Exts
+import Control.Applicative(Applicative(..))
 
--- parser produced by Happy Version 1.18.10
+-- parser produced by Happy Version 1.19.4
 
 newtype HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 = HappyAbsSyn HappyAny
 #if __GLASGOW_HASKELL__ >= 607
@@ -154,7 +155,7 @@
 happyReduction_4 happy_x_3
 	happy_x_2
 	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TknId happy_var_1) -> 
+	 =  case happyOutTok happy_x_1 of { (Tkn _ (TknId happy_var_1)) -> 
 	case happyOut6 happy_x_3 of { happy_var_3 -> 
 	happyIn6
 		 (addLabel happy_var_1 happy_var_3
@@ -172,7 +173,7 @@
 	happy_x_2
 	happy_x_1
 	 =  case happyOut9 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_3 of { (TknInt happy_var_3) -> 
+	case happyOutTok happy_x_3 of { (Tkn _ (TknInt happy_var_3)) -> 
 	happyIn7
 		 (IMMI happy_var_1 happy_var_3
 	)}}
@@ -182,7 +183,7 @@
 	happy_x_2
 	happy_x_1
 	 =  case happyOut9 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_3 of { (TknStr happy_var_3) -> 
+	case happyOutTok happy_x_3 of { (Tkn _ (TknStr happy_var_3)) -> 
 	happyIn7
 		 (IMMS happy_var_1 happy_var_3
 	)}}
@@ -195,7 +196,7 @@
 	happy_x_1 `HappyStk`
 	happyRest)
 	 = case happyOut9 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_5 of { (TknInt happy_var_5) -> 
+	case happyOutTok happy_x_5 of { (Tkn _ (TknInt happy_var_5)) -> 
 	happyIn7
 		 (IMRPC happy_var_1 happy_var_5
 	) `HappyStk` happyRest}}
@@ -301,7 +302,7 @@
 	happyRest)
 	 = case happyOut9 happy_x_1 of { happy_var_1 -> 
 	case happyOut9 happy_x_5 of { happy_var_5 -> 
-	case happyOutTok happy_x_7 of { (TknInt happy_var_7) -> 
+	case happyOutTok happy_x_7 of { (Tkn _ (TknInt happy_var_7)) -> 
 	happyIn7
 		 (IMRI happy_var_1 happy_var_5 happy_var_7
 	) `HappyStk` happyRest}}}
@@ -317,7 +318,7 @@
 	happy_x_1 `HappyStk`
 	happyRest)
 	 = case happyOut9 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_5 of { (TknInt happy_var_5) -> 
+	case happyOutTok happy_x_5 of { (Tkn _ (TknInt happy_var_5)) -> 
 	case happyOut9 happy_x_8 of { happy_var_8 -> 
 	happyIn7
 		 (IMMR happy_var_3 happy_var_5 happy_var_8
@@ -373,7 +374,7 @@
 happyReduce_22 = happySpecReduce_2  3# happyReduction_22
 happyReduction_22 happy_x_2
 	happy_x_1
-	 =  case happyOutTok happy_x_2 of { (TknInt happy_var_2) -> 
+	 =  case happyOutTok happy_x_2 of { (Tkn _ (TknInt happy_var_2)) -> 
 	happyIn7
 		 (IGI happy_var_2
 	)}
@@ -381,7 +382,7 @@
 happyReduce_23 = happySpecReduce_2  3# happyReduction_23
 happyReduction_23 happy_x_2
 	happy_x_1
-	 =  case happyOutTok happy_x_2 of { (TknId happy_var_2) -> 
+	 =  case happyOutTok happy_x_2 of { (Tkn _ (TknId happy_var_2)) -> 
 	happyIn7
 		 (IGS happy_var_2
 	)}
@@ -398,7 +399,7 @@
 	 = case happyOut9 happy_x_2 of { happy_var_2 -> 
 	case happyOut10 happy_x_3 of { happy_var_3 -> 
 	case happyOut9 happy_x_4 of { happy_var_4 -> 
-	case happyOutTok happy_x_7 of { (TknInt happy_var_7) -> 
+	case happyOutTok happy_x_7 of { (Tkn _ (TknInt happy_var_7)) -> 
 	happyIn7
 		 (IFI happy_var_2 happy_var_3 happy_var_4 happy_var_7
 	) `HappyStk` happyRest}}}}
@@ -415,7 +416,7 @@
 	 = case happyOut9 happy_x_2 of { happy_var_2 -> 
 	case happyOut10 happy_x_3 of { happy_var_3 -> 
 	case happyOut9 happy_x_4 of { happy_var_4 -> 
-	case happyOutTok happy_x_7 of { (TknId happy_var_7) -> 
+	case happyOutTok happy_x_7 of { (Tkn _ (TknId happy_var_7)) -> 
 	happyIn7
 		 (IFS happy_var_2 happy_var_3 happy_var_4 happy_var_7
 	) `HappyStk` happyRest}}}}
@@ -446,8 +447,8 @@
 	happy_x_2 `HappyStk`
 	happy_x_1 `HappyStk`
 	happyRest)
-	 = case happyOutTok happy_x_2 of { (TknId happy_var_2) -> 
-	case happyOutTok happy_x_5 of { (TknInt happy_var_5) -> 
+	 = case happyOutTok happy_x_2 of { (Tkn _ (TknId happy_var_2)) -> 
+	case happyOutTok happy_x_5 of { (Tkn _ (TknInt happy_var_5)) -> 
 	case happyOut8 happy_x_7 of { happy_var_7 -> 
 	happyIn8
 		 ((happy_var_2,happy_var_5):happy_var_7
@@ -459,14 +460,14 @@
 	happy_x_2 `HappyStk`
 	happy_x_1 `HappyStk`
 	happyRest)
-	 = case happyOutTok happy_x_3 of { (TknInt happy_var_3) -> 
+	 = case happyOutTok happy_x_3 of { (Tkn _ (TknInt happy_var_3)) -> 
 	happyIn9
 		 (MRefI happy_var_3
 	) `HappyStk` happyRest}
 
 happyReduce_31 = happySpecReduce_1  5# happyReduction_31
 happyReduction_31 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TknId happy_var_1) -> 
+	 =  case happyOutTok happy_x_1 of { (Tkn _ (TknId happy_var_1)) -> 
 	happyIn9
 		 (MRefId happy_var_1
 	)}
@@ -511,40 +512,40 @@
 	= lexwrap(\tk -> 
 	let cont i = happyDoAction i tk action sts stk in
 	case tk of {
-	TknEOF -> happyDoAction 34# tk action sts stk;
-	TknInt happy_dollar_dollar -> cont 1#;
-	TknStr happy_dollar_dollar -> cont 2#;
-	TknId happy_dollar_dollar -> cont 3#;
-	TknAssgn -> cont 4#;
-	TknColon -> cont 5#;
-	TknLPar -> cont 6#;
-	TknRPar -> cont 7#;
-	TknLBrk -> cont 8#;
-	TknRBrk -> cont 9#;
-	TknComma -> cont 10#;
-	TknOper '+' -> cont 11#;
-	TknOper '-' -> cont 12#;
-	TknOper '*' -> cont 13#;
-	TknOper '/' -> cont 14#;
-	TknOper '%' -> cont 15#;
-	TknCond "<>" -> cont 16#;
-	TknCond "=" -> cont 17#;
-	TknCond "<" -> cont 18#;
-	TknCond "<=" -> cont 19#;
-	TknCond ">" -> cont 20#;
-	TknCond ">=" -> cont 21#;
-	TknResWrd "PC" -> cont 22#;
-	TknResWrd "M" -> cont 23#;
-	TknResWrd "readInt" -> cont 24#;
-	TknResWrd "writeInt" -> cont 25#;
-	TknResWrd "readStr" -> cont 26#;
-	TknResWrd "writeStr" -> cont 27#;
-	TknResWrd "goto" -> cont 28#;
-	TknResWrd "if" -> cont 29#;
-	TknResWrd "then" -> cont 30#;
-	TknResWrd "halt" -> cont 31#;
-	TknResWrd "break" -> cont 32#;
-	TknResWrd "equ" -> cont 33#;
+	Tkn _ TknEOF -> happyDoAction 34# tk action sts stk;
+	Tkn _ (TknInt happy_dollar_dollar) -> cont 1#;
+	Tkn _ (TknStr happy_dollar_dollar) -> cont 2#;
+	Tkn _ (TknId happy_dollar_dollar) -> cont 3#;
+	Tkn _ TknAssgn -> cont 4#;
+	Tkn _ TknColon -> cont 5#;
+	Tkn _ TknLPar -> cont 6#;
+	Tkn _ TknRPar -> cont 7#;
+	Tkn _ TknLBrk -> cont 8#;
+	Tkn _ TknRBrk -> cont 9#;
+	Tkn _ TknComma -> cont 10#;
+	Tkn _ (TknOper '+') -> cont 11#;
+	Tkn _ (TknOper '-') -> cont 12#;
+	Tkn _ (TknOper '*') -> cont 13#;
+	Tkn _ (TknOper '/') -> cont 14#;
+	Tkn _ (TknOper '%') -> cont 15#;
+	Tkn _ (TknCond "<>") -> cont 16#;
+	Tkn _ (TknCond "=") -> cont 17#;
+	Tkn _ (TknCond "<") -> cont 18#;
+	Tkn _ (TknCond "<=") -> cont 19#;
+	Tkn _ (TknCond ">") -> cont 20#;
+	Tkn _ (TknCond ">=") -> cont 21#;
+	Tkn _ (TknResWrd "PC") -> cont 22#;
+	Tkn _ (TknResWrd "M") -> cont 23#;
+	Tkn _ (TknResWrd "readInt") -> cont 24#;
+	Tkn _ (TknResWrd "writeInt") -> cont 25#;
+	Tkn _ (TknResWrd "readStr") -> cont 26#;
+	Tkn _ (TknResWrd "writeStr") -> cont 27#;
+	Tkn _ (TknResWrd "goto") -> cont 28#;
+	Tkn _ (TknResWrd "if") -> cont 29#;
+	Tkn _ (TknResWrd "then") -> cont 30#;
+	Tkn _ (TknResWrd "halt") -> cont 31#;
+	Tkn _ (TknResWrd "break") -> cont 32#;
+	Tkn _ (TknResWrd "equ") -> cont 33#;
 	_ -> happyError' tk
 	})
 
@@ -584,53 +585,52 @@
 pEWE s = runAlex s parse
 {-# LINE 1 "templates/GenericTemplate.hs" #-}
 {-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "<command-line>" #-}
-{-# LINE 8 "<command-line>" #-}
-# 1 "/usr/include/stdc-predef.h" 1 3 4
+{-# LINE 1 "<built-in>" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp 
 
-# 17 "/usr/include/stdc-predef.h" 3 4
 
+{-# LINE 13 "templates/GenericTemplate.hs" #-}
 
 
 
 
 
+-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.
+#if __GLASGOW_HASKELL__ > 706
+#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)
+#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)
+#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)
+#else
+#define LT(n,m) (n Happy_GHC_Exts.<# m)
+#define GTE(n,m) (n Happy_GHC_Exts.>=# m)
+#define EQ(n,m) (n Happy_GHC_Exts.==# m)
+#endif
 
+{-# LINE 46 "templates/GenericTemplate.hs" #-}
 
 
+data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList
 
 
 
 
 
 
+{-# LINE 67 "templates/GenericTemplate.hs" #-}
 
 
+{-# LINE 77 "templates/GenericTemplate.hs" #-}
 
 
 
 
 
 
-# 8 "<command-line>" 2
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp 
 
-{-# LINE 30 "templates/GenericTemplate.hs" #-}
 
 
-data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList
 
-
-
-
-
-{-# LINE 51 "templates/GenericTemplate.hs" #-}
-
-{-# LINE 61 "templates/GenericTemplate.hs" #-}
-
-{-# LINE 70 "templates/GenericTemplate.hs" #-}
-
 infixr 9 `HappyStk`
 data HappyStk a = HappyStk a (HappyStk a)
 
@@ -646,9 +646,9 @@
 -- parse (a %partial parser).  We must ignore the saved token on the top of
 -- the stack in this case.
 happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =
-	happyReturn1 ans
+        happyReturn1 ans
 happyAccept j tk st sts (HappyStk ans _) = 
-	(happyTcHack j (happyTcHack st)) (happyReturn1 ans)
+        (happyTcHack j (happyTcHack st)) (happyReturn1 ans)
 
 -----------------------------------------------------------------------------
 -- Arrays only: do the next action
@@ -656,37 +656,35 @@
 
 
 happyDoAction i tk st
-	= {- nothing -}
-
-
-	  case action of
-		0#		  -> {- nothing -}
-				     happyFail i tk st
-		-1# 	  -> {- nothing -}
-				     happyAccept i tk st
-		n | (n Happy_GHC_Exts.<# (0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}
-
-				     (happyReduceArr Happy_Data_Array.! rule) i tk st
-				     where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))
-		n		  -> {- nothing -}
+        = {- nothing -}
+          
 
+          case action of
+                0#           -> {- nothing -}
+                                     happyFail i tk st
+                -1#          -> {- nothing -}
+                                     happyAccept i tk st
+                n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}
+                                                   
+                                                   (happyReduceArr Happy_Data_Array.! rule) i tk st
+                                                   where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))
+                n                 -> {- nothing -}
+                                     
 
-				     happyShift new_state i tk st
-				     where (new_state) = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))
-   where (off)    = indexShortOffAddr happyActOffsets st
-         (off_i)  = (off Happy_GHC_Exts.+# i)
-	 check  = if (off_i Happy_GHC_Exts.>=# (0# :: Happy_GHC_Exts.Int#))
-			then (indexShortOffAddr happyCheck off_i Happy_GHC_Exts.==#  i)
-			else False
-         (action)
+                                     happyShift new_state i tk st
+                                     where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))
+   where off    = indexShortOffAddr happyActOffsets st
+         off_i  = (off Happy_GHC_Exts.+# i)
+         check  = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))
+                  then EQ(indexShortOffAddr happyCheck off_i, i)
+                  else False
+         action
           | check     = indexShortOffAddr happyTable off_i
           | otherwise = indexShortOffAddr happyDefActions st
 
-{-# LINE 130 "templates/GenericTemplate.hs" #-}
 
-
 indexShortOffAddr (HappyA# arr) off =
-	Happy_GHC_Exts.narrow16Int# i
+        Happy_GHC_Exts.narrow16Int# i
   where
         i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)
         high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))
@@ -705,13 +703,14 @@
 -----------------------------------------------------------------------------
 -- HappyState data type (not arrays)
 
-{-# LINE 163 "templates/GenericTemplate.hs" #-}
 
+{-# LINE 170 "templates/GenericTemplate.hs" #-}
+
 -----------------------------------------------------------------------------
 -- Shifting a token
 
 happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =
-     let (i) = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
+     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
 --     trace "shifting the error token" $
      happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)
 
@@ -747,30 +746,33 @@
      = happyFail 0# tk st sts stk
 happyReduce k nt fn j tk st sts stk
      = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of
-	 sts1@((HappyCons (st1@(action)) (_))) ->
-        	let r = fn stk in  -- it doesn't hurt to always seq here...
-       		happyDoSeq r (happyGoto nt j tk st1 sts1 r)
+         sts1@((HappyCons (st1@(action)) (_))) ->
+                let r = fn stk in  -- it doesn't hurt to always seq here...
+                happyDoSeq r (happyGoto nt j tk st1 sts1 r)
 
 happyMonadReduce k nt fn 0# tk st sts stk
      = happyFail 0# tk st sts stk
 happyMonadReduce k nt fn j tk st sts stk =
-        happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))
-       where (sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))
-             drop_stk = happyDropStk k stk
+      case happyDrop k (HappyCons (st) (sts)) of
+        sts1@((HappyCons (st1@(action)) (_))) ->
+          let drop_stk = happyDropStk k stk in
+          happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))
 
 happyMonad2Reduce k nt fn 0# tk st sts stk
      = happyFail 0# tk st sts stk
 happyMonad2Reduce k nt fn j tk st sts stk =
-       happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))
-       where (sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))
-             drop_stk = happyDropStk k stk
+      case happyDrop k (HappyCons (st) (sts)) of
+        sts1@((HappyCons (st1@(action)) (_))) ->
+         let drop_stk = happyDropStk k stk
 
-             (off) = indexShortOffAddr happyGotoOffsets st1
-             (off_i) = (off Happy_GHC_Exts.+# nt)
-             (new_state) = indexShortOffAddr happyTable off_i
+             off = indexShortOffAddr happyGotoOffsets st1
+             off_i = (off Happy_GHC_Exts.+# nt)
+             new_state = indexShortOffAddr happyTable off_i
 
 
 
+          in
+          happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))
 
 happyDrop 0# l = l
 happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t
@@ -785,9 +787,9 @@
 happyGoto nt j tk st = 
    {- nothing -}
    happyDoAction j tk new_state
-   where (off) = indexShortOffAddr happyGotoOffsets st
-         (off_i) = (off Happy_GHC_Exts.+# nt)
-         (new_state) = indexShortOffAddr happyTable off_i
+   where off = indexShortOffAddr happyGotoOffsets st
+         off_i = (off Happy_GHC_Exts.+# nt)
+         new_state = indexShortOffAddr happyTable off_i
 
 
 
@@ -797,8 +799,8 @@
 
 -- parse error if we are in recovery and we fail again
 happyFail 0# tk old_st _ stk@(x `HappyStk` _) =
-     let (i) = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
---	trace "failing" $ 
+     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
+--      trace "failing" $ 
         happyError_ i tk
 
 {-  We don't need state discarding for our restricted implementation of
@@ -807,16 +809,16 @@
 
 -- discard a state
 happyFail  0# tk old_st (HappyCons ((action)) (sts)) 
-						(saved_tok `HappyStk` _ `HappyStk` stk) =
---	trace ("discarding state, depth " ++ show (length stk))  $
-	happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))
+                                                (saved_tok `HappyStk` _ `HappyStk` stk) =
+--      trace ("discarding state, depth " ++ show (length stk))  $
+        happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))
 -}
 
 -- Enter error recovery: generate an error token,
 --                       save the old token and carry on.
 happyFail  i tk (action) sts stk =
 --      trace "entering error recovery" $
-	happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)
+        happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)
 
 -- Internal happy errors:
 
@@ -834,9 +836,9 @@
 
 -----------------------------------------------------------------------------
 -- Seq-ing.  If the --strict flag is given, then Happy emits 
---	happySeq = happyDoSeq
+--      happySeq = happyDoSeq
 -- otherwise it emits
--- 	happySeq = happyDontSeq
+--      happySeq = happyDontSeq
 
 happyDoSeq, happyDontSeq :: a -> b -> b
 happyDoSeq   a b = a `seq` b
@@ -866,3 +868,4 @@
 {-# NOINLINE happyFail #-}
 
 -- end of Happy Template.
+
diff --git a/dist/build/ewe/ewe-tmp/Language/EWE/Scanner.hs b/dist/build/ewe/ewe-tmp/Language/EWE/Scanner.hs
--- a/dist/build/ewe/ewe-tmp/Language/EWE/Scanner.hs
+++ b/dist/build/ewe/ewe-tmp/Language/EWE/Scanner.hs
@@ -10,7 +10,7 @@
                             getPosn
                            ) where
 
-import Language.EWE.Token(Tkns,Tkn(..))
+import Language.EWE.Token(Tkns,Tkn(..),Tkn_(..))
 
 #if __GLASGOW_HASKELL__ >= 603
 #include "ghcconfig.h"
@@ -32,40 +32,7 @@
 #endif
 {-# LINE 1 "templates/wrappers.hs" #-}
 {-# LINE 1 "templates/wrappers.hs" #-}
-{-# LINE 1 "<command-line>" #-}
-
-
-
-
-
-
-# 1 "/usr/include/stdc-predef.h" 1 3 4
-
-# 17 "/usr/include/stdc-predef.h" 3 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# 6 "<command-line>" 2
+{-# LINE 1 "<built-in>" #-}
 {-# LINE 1 "templates/wrappers.hs" #-}
 -- -----------------------------------------------------------------------------
 -- Alex wrapper code.
@@ -74,6 +41,7 @@
 -- it for any purpose whatsoever.
 
 import Data.Word (Word8)
+
 {-# LINE 22 "templates/wrappers.hs" #-}
 
 import qualified Data.Bits
@@ -126,12 +94,15 @@
                               in p' `seq`  Just (b, (p', c, bs, s))
 
 
-{-# LINE 89 "templates/wrappers.hs" #-}
 
-{-# LINE 103 "templates/wrappers.hs" #-}
+{-# LINE 92 "templates/wrappers.hs" #-}
 
-{-# LINE 118 "templates/wrappers.hs" #-}
 
+{-# LINE 106 "templates/wrappers.hs" #-}
+
+
+{-# LINE 121 "templates/wrappers.hs" #-}
+
 -- -----------------------------------------------------------------------------
 -- Token positions
 
@@ -211,12 +182,20 @@
 alexSetStartCode :: Int -> Alex ()
 alexSetStartCode sc = Alex $ \s -> Right (s{alex_scd=sc}, ())
 
+
+
+
+
+
+
+
+
 alexMonadScan = do
   inp <- alexGetInput
   sc <- alexGetStartCode
   case alexScan inp sc of
     AlexEOF -> alexEOF
-    AlexError inp' -> alexError "lexical error"
+    AlexError ((AlexPn _ line column),_,_,_) -> alexError $ "lexical error at line " ++ (show line) ++ ", column " ++ (show column)
     AlexSkip  inp' len -> do
         alexSetInput inp'
         alexMonadScan
@@ -249,42 +228,49 @@
 -- -----------------------------------------------------------------------------
 -- Monad (with ByteString input)
 
-{-# LINE 320 "templates/wrappers.hs" #-}
 
+{-# LINE 333 "templates/wrappers.hs" #-}
 
+
 -- -----------------------------------------------------------------------------
 -- Basic wrapper
 
-{-# LINE 347 "templates/wrappers.hs" #-}
 
+{-# LINE 360 "templates/wrappers.hs" #-}
 
+
 -- -----------------------------------------------------------------------------
 -- Basic wrapper, ByteString version
 
-{-# LINE 365 "templates/wrappers.hs" #-}
 
 {-# LINE 378 "templates/wrappers.hs" #-}
 
 
+{-# LINE 392 "templates/wrappers.hs" #-}
+
+
 -- -----------------------------------------------------------------------------
 -- Posn wrapper
 
 -- Adds text positions to the basic model.
 
-{-# LINE 395 "templates/wrappers.hs" #-}
 
+{-# LINE 409 "templates/wrappers.hs" #-}
 
+
 -- -----------------------------------------------------------------------------
 -- Posn wrapper, ByteString version
 
-{-# LINE 410 "templates/wrappers.hs" #-}
 
+{-# LINE 424 "templates/wrappers.hs" #-}
 
+
 -- -----------------------------------------------------------------------------
 -- GScan wrapper
 
 -- For compatibility with previous versions of Alex, and because we can.
 
+
 alex_base :: AlexAddr
 alex_base = AlexA# "\xf8\xff\xff\xff\xf3\xff\xff\xff\x73\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x25\x01\x00\x00\x00\x00\x00\x00\xa5\x01\x00\x00\x25\x02\x00\x00\x00\x00\x00\x00\x96\x02\x00\x00\x96\x03\x00\x00\x56\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x03\x00\x00\x8d\x04\x00\x00\x8d\x05\x00\x00\xf0\x03\x00\x00\x00\x00\x00\x00\xfe\xff\xff\xff\x03\x06\x00\x00\x00\x00\x00\x00\xc9\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\xff\xff\xff\xd0\xff\xff\xff\x00\x00\x00\x00\xde\x05\x00\x00\xd3\x06\x00\x00\x1e\x07\x00\x00\x69\x07\x00\x00\xb4\x07\x00\x00\xff\x07\x00\x00\x4a\x08\x00\x00\x95\x08\x00\x00\xe0\x08\x00\x00\x2b\x09\x00\x00\x76\x09\x00\x00\xc1\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x04\x00\x00\x0c\x0a\x00\x00\x57\x0a\x00\x00\xa2\x0a\x00\x00\xed\x0a\x00\x00\x38\x0b\x00\x00\x83\x0b\x00\x00\xce\x0b\x00\x00\x19\x0c\x00\x00\x64\x0c\x00\x00\xaf\x0c\x00\x00\xfa\x0c\x00\x00\x45\x0d\x00\x00\x90\x0d\x00\x00\xdb\x0d\x00\x00\x26\x0e\x00\x00\x71\x0e\x00\x00\xbc\x0e\x00\x00\x07\x0f\x00\x00\x52\x0f\x00\x00\x9d\x0f\x00\x00\xe8\x0f\x00\x00\x33\x10\x00\x00\x7e\x10\x00\x00\xc9\x10\x00\x00\x14\x11\x00\x00\x5f\x11\x00\x00\xaa\x11\x00\x00\xf5\x11\x00\x00\x40\x12\x00\x00\x8b\x12\x00\x00\xd6\x12\x00\x00\x21\x13\x00\x00\x6c\x13\x00\x00\xb7\x13\x00\x00\x02\x14\x00\x00"#
 
@@ -298,8 +284,12 @@
 alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\x0d\x00\x0d\x00\x04\x00\x04\x00\xff\xff\xff\xff\x0e\x00\x0e\x00\x10\x00\x10\x00\x10\x00\x13\x00\x13\x00\x10\x00\x15\x00\x15\x00\x15\x00\xff\xff\x15\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"#
 
 alex_accept = listArray (0::Int,82) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAccSkip,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_9),AlexAcc (alex_action_10),AlexAcc (alex_action_11),AlexAcc (alex_action_11),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_25),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26),AlexAcc (alex_action_26)]
-{-# LINE 55 "src/Language/EWE/Scanner.x" #-}
+{-# LINE 54 "src/Language/EWE/Scanner.x" #-}
 
+returnTkn :: Tkn_ -> AlexInput -> Int -> Alex Tkn
+returnTkn tkn _ _ = do pos <- getPosn 
+                       return $ Tkn pos tkn
+
 returnEOL :: AlexInput -> Int -> Alex Tkn
 returnEOL = returnTkn $ TknEOL
 
@@ -309,9 +299,6 @@
 returnColon :: AlexInput -> Int -> Alex Tkn
 returnColon = returnTkn $ TknColon
 
-returnTkn :: Tkn -> AlexInput -> Int -> Alex Tkn
-returnTkn tkn _ _ = return $ tkn
-
 returnLPar :: AlexInput -> Int -> Alex Tkn
 returnLPar = returnTkn $ TknLPar
 
@@ -339,28 +326,27 @@
 returnInt :: AlexInput -> Int -> Alex Tkn
 returnInt = returnFunction (TknInt . read)
 
--- returnLabel :: AlexInput -> Int -> Alex Tkn
--- returnLabel = returnFunction (TknLabel . init)
-
 returnId :: AlexInput -> Int -> Alex Tkn
 returnId = returnFunction TknId
 
 returnResWrd :: AlexInput -> Int -> Alex Tkn
 returnResWrd = returnFunction TknResWrd
 
-returnFunction :: (String -> Tkn) -> AlexInput -> Int -> Alex Tkn
-returnFunction f (_,_,_,s) i = return $ f (take i s)
+returnFunction :: (String -> Tkn_) -> AlexInput -> Int -> Alex Tkn
+returnFunction f (_,_,_,s) i = do pos <- getPosn
+                                  return $ (Tkn pos (f (take i s)))
 
 alexEOF :: Alex Tkn
-alexEOF = return $ TknEOF
+alexEOF = do pos <- getPosn
+             return $ Tkn pos TknEOF
 
 alexExec :: Alex Tkns
 alexExec = do
    t <- alexMonadScan
    case t of
-     TknEOF -> return $ [t]
-     _      -> do ts <- alexExec
-                  return (t:ts)
+     (Tkn pos TknEOF) -> return $ [t]
+     _                -> do ts <- alexExec
+                            return (t:ts)
 
 getPosn :: Alex (Int,Int)
 getPosn = do
@@ -394,41 +380,7 @@
 alex_action_26 =  returnId 
 {-# LINE 1 "templates/GenericTemplate.hs" #-}
 {-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "<command-line>" #-}
-
-
-
-
-
-
-
-# 1 "/usr/include/stdc-predef.h" 1 3 4
-
-# 17 "/usr/include/stdc-predef.h" 3 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# 7 "<command-line>" 2
+{-# LINE 1 "<built-in>" #-}
 {-# LINE 1 "templates/GenericTemplate.hs" #-}
 -- -----------------------------------------------------------------------------
 -- ALEX TEMPLATE
@@ -439,13 +391,27 @@
 -- -----------------------------------------------------------------------------
 -- INTERNALS and main scanner engine
 
-{-# LINE 35 "templates/GenericTemplate.hs" #-}
 
-{-# LINE 45 "templates/GenericTemplate.hs" #-}
+{-# LINE 21 "templates/GenericTemplate.hs" #-}
 
 
-data AlexAddr = AlexA# Addr#
 
+
+
+-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.
+#if __GLASGOW_HASKELL__ > 706
+#define GTE(n,m) (tagToEnum# (n >=# m))
+#define EQ(n,m) (tagToEnum# (n ==# m))
+#else
+#define GTE(n,m) (n >=# m)
+#define EQ(n,m) (n ==# m)
+#endif
+
+{-# LINE 51 "templates/GenericTemplate.hs" #-}
+
+
+data AlexAddr = AlexA# Addr#
+-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.
 #if __GLASGOW_HASKELL__ < 503
 uncheckedShiftL# = shiftL#
 #endif
@@ -488,6 +454,7 @@
 
 
 
+
 #if __GLASGOW_HASKELL__ < 503
 quickIndex arr i = arr ! i
 #else
@@ -560,7 +527,7 @@
                 offset = (base +# ord_c)
                 check  = alexIndexInt16OffAddr alex_check offset
 		
-                new_s = if (offset >=# 0#) && (check ==# ord_c)
+                new_s = if GTE(offset,0#) && EQ(check,ord_c)
 			  then alexIndexInt16OffAddr alex_table offset
 			  else alexIndexInt16OffAddr alex_deflt s
 	in
@@ -576,8 +543,9 @@
 	check_accs (AlexAccNone) = last_acc
 	check_accs (AlexAcc a  ) = AlexLastAcc a input (I# (len))
 	check_accs (AlexAccSkip) = AlexLastSkip  input (I# (len))
-{-# LINE 191 "templates/GenericTemplate.hs" #-}
 
+{-# LINE 198 "templates/GenericTemplate.hs" #-}
+
 data AlexLastAcc a
   = AlexNone
   | AlexLastAcc a !AlexInput !Int
@@ -592,7 +560,9 @@
   = AlexAccNone
   | AlexAcc a
   | AlexAccSkip
-{-# LINE 235 "templates/GenericTemplate.hs" #-}
 
+{-# LINE 242 "templates/GenericTemplate.hs" #-}
+
 -- used by wrappers
 iUnbox (I# (i)) = i
+
diff --git a/ewe.cabal b/ewe.cabal
--- a/ewe.cabal
+++ b/ewe.cabal
@@ -2,7 +2,7 @@
 -- see http://haskell.org/cabal/users-guide/
 
 name:                ewe
-version:             0.1.0.40
+version:             0.1.0.43
 synopsis:            An language using in Programming Languages teaching
 description:         Another implemention of the EWE programming language originally created and developed by Kent D. Lee. EWE is an extension of the RAM programming language. RAM was created by Sethi.
 homepage:            http://github.com/jfcmacro/ewe
@@ -22,13 +22,15 @@
                     transformers >=0.3,
                     mtl >= 2.1,
                     containers >= 0.4.2,
-                    array >= 0.4.0.0
+                    array >= 0.4.0.0,
+                    pretty >= 1.1
   hs-source-dirs:   src, src-ag
   build-tools:      alex, happy
   other-modules:    Language.EWE.AbsSyn,
                     Language.EWE.Utils,
                     Language.EWE.VM,
                     Language.EWE.Token,
+                    Language.EWE.TokenUtils,
                     Language.EWE.Scanner,
                     Language.EWE.CheckGrammar,
                     Language.EWE.Parser
@@ -37,4 +39,4 @@
 
 source-repository head
   type:	    git
-  location: git://github.com/jfcmacro/ewe.git
+  location: git://github.com:jfcmacro/ewe.git
diff --git a/src-ag/Language/EWE/AbsSyn.ag b/src-ag/Language/EWE/AbsSyn.ag
--- a/src-ag/Language/EWE/AbsSyn.ag
+++ b/src-ag/Language/EWE/AbsSyn.ag
@@ -48,8 +48,8 @@
            | IWS   oper :: MRef             -- Write a Str
            | IGI  Int                       -- Goto to line
            | IGS  String                    -- Goto sym
-           | IFI  bcond :: MRef Cond then :: MRef Int        -- If Cond then Int
-           | IFS  bcond :: MRef Cond then :: MRef String     --
+           | IFI  bcond :: MRef cond :: Cond then :: MRef Int        -- If Cond then Int
+           | IFS  bcond :: MRef cond :: Cond then :: MRef String     --
            | IH                             -- Halt
            | IB                             -- Break
            | INI
diff --git a/src-ag/Language/EWE/CheckGrammar.ag b/src-ag/Language/EWE/CheckGrammar.ag
--- a/src-ag/Language/EWE/CheckGrammar.ag
+++ b/src-ag/Language/EWE/CheckGrammar.ag
@@ -105,6 +105,7 @@
   | INI   lhs.res = { Right () }
 
 include "AbsSyn.ag"
+include "PPProg.ag"
 
 {
 isLabelDef :: String -> Set.Set String ->  Either String ()
diff --git a/src/Language/EWE/AbsSyn.hs b/src/Language/EWE/AbsSyn.hs
--- a/src/Language/EWE/AbsSyn.hs
+++ b/src/Language/EWE/AbsSyn.hs
@@ -1,6 +1,6 @@
 
 
--- UUAGC 0.9.50.2 (src-ag/Language/EWE/AbsSyn.ag)
+-- UUAGC 0.9.52.1 (src-ag/Language/EWE/AbsSyn.ag)
 module Language.EWE.AbsSyn where
 -- Cond --------------------------------------------------------
 {-
diff --git a/src/Language/EWE/CheckGrammar.hs b/src/Language/EWE/CheckGrammar.hs
--- a/src/Language/EWE/CheckGrammar.hs
+++ b/src/Language/EWE/CheckGrammar.hs
@@ -1,16 +1,27 @@
 
 
--- UUAGC 0.9.50.2 (src-ag/Language/EWE/CheckGrammar.ag)
+-- UUAGC 0.9.52.1 (src-ag/Language/EWE/CheckGrammar.ag)
 module Language.EWE.CheckGrammar where
+{-# LINE 2 "src-ag/Language/EWE/PPProg.ag" #-}
+
+import Text.PrettyPrint
+{-# LINE 9 "src/Language/EWE/CheckGrammar.hs" #-}
+
 {-# LINE 2 "src-ag/Language/EWE/CheckGrammar.ag" #-}
 
 import qualified Data.Set as Set
 import qualified Data.Map as Map
 import Language.EWE.AbsSyn
 import Language.EWE.Utils
-{-# LINE 12 "src/Language/EWE/CheckGrammar.hs" #-}
-{-# LINE 109 "src-ag/Language/EWE/CheckGrammar.ag" #-}
+{-# LINE 17 "src/Language/EWE/CheckGrammar.hs" #-}
+{-# LINE 124 "src-ag/Language/EWE/PPProg.ag" #-}
 
+(<==>) :: String -> Doc -> Doc
+s <==> doc = text s $$ doc
+{-# LINE 22 "src/Language/EWE/CheckGrammar.hs" #-}
+
+{-# LINE 110 "src-ag/Language/EWE/CheckGrammar.ag" #-}
+
 isLabelDef :: String -> Set.Set String ->  Either String ()
 isLabelDef str sets
     | str `Set.member` sets = Right ()
@@ -25,9 +36,12 @@
 isMemRefDef str map
     | str `Map.member` map = Right ()
     | otherwise            = Left $ "Mem Ref: " ++ str ++ " is not defined"
-{-# LINE 29 "src/Language/EWE/CheckGrammar.hs" #-}
+{-# LINE 40 "src/Language/EWE/CheckGrammar.hs" #-}
 -- Cond --------------------------------------------------------
 {-
+   visit 0:
+      synthesized attribute:
+         pp                   : Doc
    alternatives:
       alternative CLET:
       alternative CLT:
@@ -52,45 +66,82 @@
 sem_Cond (CNE) =
     (sem_Cond_CNE)
 -- semantic domain
-type T_Cond = ( )
+type T_Cond = ( Doc)
 data Inh_Cond = Inh_Cond {}
-data Syn_Cond = Syn_Cond {}
+data Syn_Cond = Syn_Cond {pp_Syn_Cond :: Doc}
 wrap_Cond :: T_Cond ->
              Inh_Cond ->
              Syn_Cond
 wrap_Cond sem (Inh_Cond) =
-    (let ( ) = sem
-     in  (Syn_Cond))
+    (let ( _lhsOpp) = sem
+     in  (Syn_Cond _lhsOpp))
 sem_Cond_CLET :: T_Cond
 sem_Cond_CLET =
-    (let
-     in  ( ))
+    (let _lhsOpp :: Doc
+         -- "src-ag/Language/EWE/PPProg.ag"(line 39, column 11)
+         _lhsOpp =
+             ({-# LINE 39 "src-ag/Language/EWE/PPProg.ag" #-}
+              text "<="
+              {-# LINE 86 "src/Language/EWE/CheckGrammar.hs" #-}
+              )
+     in  ( _lhsOpp))
 sem_Cond_CLT :: T_Cond
 sem_Cond_CLT =
-    (let
-     in  ( ))
+    (let _lhsOpp :: Doc
+         -- "src-ag/Language/EWE/PPProg.ag"(line 40, column 11)
+         _lhsOpp =
+             ({-# LINE 40 "src-ag/Language/EWE/PPProg.ag" #-}
+              char '<'
+              {-# LINE 96 "src/Language/EWE/CheckGrammar.hs" #-}
+              )
+     in  ( _lhsOpp))
 sem_Cond_CGET :: T_Cond
 sem_Cond_CGET =
-    (let
-     in  ( ))
+    (let _lhsOpp :: Doc
+         -- "src-ag/Language/EWE/PPProg.ag"(line 41, column 11)
+         _lhsOpp =
+             ({-# LINE 41 "src-ag/Language/EWE/PPProg.ag" #-}
+              text ">="
+              {-# LINE 106 "src/Language/EWE/CheckGrammar.hs" #-}
+              )
+     in  ( _lhsOpp))
 sem_Cond_CGT :: T_Cond
 sem_Cond_CGT =
-    (let
-     in  ( ))
+    (let _lhsOpp :: Doc
+         -- "src-ag/Language/EWE/PPProg.ag"(line 42, column 11)
+         _lhsOpp =
+             ({-# LINE 42 "src-ag/Language/EWE/PPProg.ag" #-}
+              char '>'
+              {-# LINE 116 "src/Language/EWE/CheckGrammar.hs" #-}
+              )
+     in  ( _lhsOpp))
 sem_Cond_CE :: T_Cond
 sem_Cond_CE =
-    (let
-     in  ( ))
+    (let _lhsOpp :: Doc
+         -- "src-ag/Language/EWE/PPProg.ag"(line 43, column 11)
+         _lhsOpp =
+             ({-# LINE 43 "src-ag/Language/EWE/PPProg.ag" #-}
+              char '='
+              {-# LINE 126 "src/Language/EWE/CheckGrammar.hs" #-}
+              )
+     in  ( _lhsOpp))
 sem_Cond_CNE :: T_Cond
 sem_Cond_CNE =
-    (let
-     in  ( ))
+    (let _lhsOpp :: Doc
+         -- "src-ag/Language/EWE/PPProg.ag"(line 44, column 11)
+         _lhsOpp =
+             ({-# LINE 44 "src-ag/Language/EWE/PPProg.ag" #-}
+              text "<>"
+              {-# LINE 136 "src/Language/EWE/CheckGrammar.hs" #-}
+              )
+     in  ( _lhsOpp))
 -- Equ ---------------------------------------------------------
 {-
    visit 0:
       chained attribute:
          idMemRef             : Map.Map String Int
-      synthesized attribute:
+      synthesized attributes:
+         pp                   : Doc
          res                  : Either String ()
    alternatives:
       alternative Tuple:
@@ -104,42 +155,52 @@
     (sem_Equ_Tuple x1 x2)
 -- semantic domain
 type T_Equ = (Map.Map String Int) ->
-             ( (Map.Map String Int),(Either String ()))
+             ( (Map.Map String Int),Doc,(Either String ()))
 data Inh_Equ = Inh_Equ {idMemRef_Inh_Equ :: (Map.Map String Int)}
-data Syn_Equ = Syn_Equ {idMemRef_Syn_Equ :: (Map.Map String Int),res_Syn_Equ :: (Either String ())}
+data Syn_Equ = Syn_Equ {idMemRef_Syn_Equ :: (Map.Map String Int),pp_Syn_Equ :: Doc,res_Syn_Equ :: (Either String ())}
 wrap_Equ :: T_Equ ->
             Inh_Equ ->
             Syn_Equ
 wrap_Equ sem (Inh_Equ _lhsIidMemRef) =
-    (let ( _lhsOidMemRef,_lhsOres) = sem _lhsIidMemRef
-     in  (Syn_Equ _lhsOidMemRef _lhsOres))
+    (let ( _lhsOidMemRef,_lhsOpp,_lhsOres) = sem _lhsIidMemRef
+     in  (Syn_Equ _lhsOidMemRef _lhsOpp _lhsOres))
 sem_Equ_Tuple :: String ->
                  Int ->
                  T_Equ
 sem_Equ_Tuple x1_ x2_ =
     (\ _lhsIidMemRef ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _lhsOidMemRef :: (Map.Map String Int)
+              -- "src-ag/Language/EWE/PPProg.ag"(line 47, column 11)
+              _lhsOpp =
+                  ({-# LINE 47 "src-ag/Language/EWE/PPProg.ag" #-}
+                   text "equ" <+> nest 5 (text x1_)
+                              <+> nest 10 (text "M" <> brackets (int x2_))
+                   {-# LINE 181 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 46, column 11)
               _lhsOres =
                   ({-# LINE 46 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    if x1_ `Map.member` _lhsIidMemRef
                    then Left $ x1_ ++ " was already defined "
                    else Right ()
-                   {-# LINE 130 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 189 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 46, column 11)
               _lhsOidMemRef =
                   ({-# LINE 50 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    Map.insert x1_ x2_ _lhsIidMemRef
-                   {-# LINE 136 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 195 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-          in  ( _lhsOidMemRef,_lhsOres)))
+          in  ( _lhsOidMemRef,_lhsOpp,_lhsOres)))
 -- Equates -----------------------------------------------------
 {-
    visit 0:
       chained attribute:
          idMemRef             : Map.Map String Int
+      synthesized attribute:
+         pp                   : Doc
    alternatives:
       alternative Cons:
          child hd             : Equ 
@@ -153,67 +214,84 @@
     (Prelude.foldr sem_Equates_Cons sem_Equates_Nil (Prelude.map sem_Equ list))
 -- semantic domain
 type T_Equates = (Map.Map String Int) ->
-                 ( (Map.Map String Int))
+                 ( (Map.Map String Int),Doc)
 data Inh_Equates = Inh_Equates {idMemRef_Inh_Equates :: (Map.Map String Int)}
-data Syn_Equates = Syn_Equates {idMemRef_Syn_Equates :: (Map.Map String Int)}
+data Syn_Equates = Syn_Equates {idMemRef_Syn_Equates :: (Map.Map String Int),pp_Syn_Equates :: Doc}
 wrap_Equates :: T_Equates ->
                 Inh_Equates ->
                 Syn_Equates
 wrap_Equates sem (Inh_Equates _lhsIidMemRef) =
-    (let ( _lhsOidMemRef) = sem _lhsIidMemRef
-     in  (Syn_Equates _lhsOidMemRef))
+    (let ( _lhsOidMemRef,_lhsOpp) = sem _lhsIidMemRef
+     in  (Syn_Equates _lhsOidMemRef _lhsOpp))
 sem_Equates_Cons :: T_Equ ->
                     T_Equates ->
                     T_Equates
 sem_Equates_Cons hd_ tl_ =
     (\ _lhsIidMemRef ->
-         (let _lhsOidMemRef :: (Map.Map String Int)
+         (let _lhsOpp :: Doc
+              _lhsOidMemRef :: (Map.Map String Int)
               _hdOidMemRef :: (Map.Map String Int)
               _tlOidMemRef :: (Map.Map String Int)
               _hdIidMemRef :: (Map.Map String Int)
+              _hdIpp :: Doc
               _hdIres :: (Either String ())
               _tlIidMemRef :: (Map.Map String Int)
+              _tlIpp :: Doc
+              -- use rule "src-ag/Language/EWE/PPProg.ag"(line 16, column 10)
+              _lhsOpp =
+                  ({-# LINE 16 "src-ag/Language/EWE/PPProg.ag" #-}
+                   _hdIpp $$ _tlIpp
+                   {-# LINE 245 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- copy rule (up)
               _lhsOidMemRef =
                   ({-# LINE 13 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _tlIidMemRef
-                   {-# LINE 181 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 251 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _hdOidMemRef =
                   ({-# LINE 16 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRef
-                   {-# LINE 187 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 257 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (chain)
               _tlOidMemRef =
                   ({-# LINE 13 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _hdIidMemRef
-                   {-# LINE 193 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 263 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _hdIidMemRef,_hdIres) =
+              ( _hdIidMemRef,_hdIpp,_hdIres) =
                   hd_ _hdOidMemRef
-              ( _tlIidMemRef) =
+              ( _tlIidMemRef,_tlIpp) =
                   tl_ _tlOidMemRef
-          in  ( _lhsOidMemRef)))
+          in  ( _lhsOidMemRef,_lhsOpp)))
 sem_Equates_Nil :: T_Equates
 sem_Equates_Nil =
     (\ _lhsIidMemRef ->
-         (let _lhsOidMemRef :: (Map.Map String Int)
+         (let _lhsOpp :: Doc
+              _lhsOidMemRef :: (Map.Map String Int)
+              -- use rule "src-ag/Language/EWE/PPProg.ag"(line 16, column 10)
+              _lhsOpp =
+                  ({-# LINE 16 "src-ag/Language/EWE/PPProg.ag" #-}
+                   empty
+                   {-# LINE 279 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- copy rule (chain)
               _lhsOidMemRef =
                   ({-# LINE 13 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRef
-                   {-# LINE 208 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 285 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-          in  ( _lhsOidMemRef)))
+          in  ( _lhsOidMemRef,_lhsOpp)))
 -- Instr -------------------------------------------------------
 {-
    visit 0:
       inherited attributes:
          idMemRefDef          : Map.Map String Int
          labelFound           : Set.Set String
-      synthesized attribute:
+      synthesized attributes:
+         pp                   : Doc
          res                  : Either String ()
    alternatives:
       alternative IMMI:
@@ -337,144 +415,191 @@
 -- semantic domain
 type T_Instr = (Map.Map String Int) ->
                (Set.Set String) ->
-               ( (Either String ()))
+               ( Doc,(Either String ()))
 data Inh_Instr = Inh_Instr {idMemRefDef_Inh_Instr :: (Map.Map String Int),labelFound_Inh_Instr :: (Set.Set String)}
-data Syn_Instr = Syn_Instr {res_Syn_Instr :: (Either String ())}
+data Syn_Instr = Syn_Instr {pp_Syn_Instr :: Doc,res_Syn_Instr :: (Either String ())}
 wrap_Instr :: T_Instr ->
               Inh_Instr ->
               Syn_Instr
 wrap_Instr sem (Inh_Instr _lhsIidMemRefDef _lhsIlabelFound) =
-    (let ( _lhsOres) = sem _lhsIidMemRefDef _lhsIlabelFound
-     in  (Syn_Instr _lhsOres))
+    (let ( _lhsOpp,_lhsOres) = sem _lhsIidMemRefDef _lhsIlabelFound
+     in  (Syn_Instr _lhsOpp _lhsOres))
 sem_Instr_IMMI :: T_MRef ->
                   Int ->
                   T_Instr
 sem_Instr_IMMI dest_ int_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _destOidMemRefDef :: ( Map.Map String Int )
+              _destIpp :: Doc
               _destIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 57, column 11)
+              _lhsOpp =
+                  ({-# LINE 57 "src-ag/Language/EWE/PPProg.ag" #-}
+                   _destIpp <+> nest 5 (text ":=") <+> nest 5 (int int_)
+                   {-# LINE 443 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 83, column 11)
               _lhsOres =
                   ({-# LINE 83 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _destIres
-                   {-# LINE 363 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 449 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _destOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 369 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 455 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _destIres) =
+              ( _destIpp,_destIres) =
                   dest_ _destOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IMMS :: T_MRef ->
                   String ->
                   T_Instr
 sem_Instr_IMMS dest_ string_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _destOidMemRefDef :: ( Map.Map String Int )
+              _destIpp :: Doc
               _destIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 58, column 11)
+              _lhsOpp =
+                  ({-# LINE 58 "src-ag/Language/EWE/PPProg.ag" #-}
+                   _destIpp <+> nest 5 (text ":=")
+                            <+> nest 5 (doubleQuotes (text string_))
+                   {-# LINE 476 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 84, column 11)
               _lhsOres =
                   ({-# LINE 84 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _destIres
-                   {-# LINE 387 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 482 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _destOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 393 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 488 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _destIres) =
+              ( _destIpp,_destIres) =
                   dest_ _destOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IMRPC :: T_MRef ->
                    Int ->
                    T_Instr
 sem_Instr_IMRPC dest_ int_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _destOidMemRefDef :: ( Map.Map String Int )
+              _destIpp :: Doc
               _destIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 60, column 11)
+              _lhsOpp =
+                  ({-# LINE 60 "src-ag/Language/EWE/PPProg.ag" #-}
+                   _destIpp <+> nest 5 (text ":=")
+                            <+> nest 5 (text "PC")
+                            <+> char '+'
+                            <+> int int_
+                   {-# LINE 511 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 85, column 11)
               _lhsOres =
                   ({-# LINE 85 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _destIres
-                   {-# LINE 411 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 517 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _destOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 417 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 523 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _destIres) =
+              ( _destIpp,_destIres) =
                   dest_ _destOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_SPC :: T_MRef ->
                  T_Instr
 sem_Instr_SPC oper_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _operOidMemRefDef :: ( Map.Map String Int )
+              _operIpp :: Doc
               _operIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 65, column 11)
+              _lhsOpp =
+                  ({-# LINE 65 "src-ag/Language/EWE/PPProg.ag" #-}
+                   text "PC" <+> nest 5 (text ":=")
+                             <+> nest 5 _operIpp
+                   {-# LINE 543 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 86, column 11)
               _lhsOres =
                   ({-# LINE 86 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _operIres
-                   {-# LINE 434 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 549 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _operOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 440 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 555 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _operIres) =
+              ( _operIpp,_operIres) =
                   oper_ _operOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IMMM :: T_MRef ->
                   T_MRef ->
                   T_Instr
 sem_Instr_IMMM dest_ oper_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _destOidMemRefDef :: ( Map.Map String Int )
               _operOidMemRefDef :: ( Map.Map String Int )
+              _destIpp :: Doc
               _destIres :: ( Either String () )
+              _operIpp :: Doc
               _operIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 68, column 11)
+              _lhsOpp =
+                  ({-# LINE 68 "src-ag/Language/EWE/PPProg.ag" #-}
+                   _destIpp <+> nest 5 (text ":=")
+                            <+> nest 5 _operIpp
+                   {-# LINE 579 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 87, column 11)
               _lhsOres =
                   ({-# LINE 87 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _destIres <--> _operIres
-                   {-# LINE 460 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 585 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _destOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 466 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 591 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _operOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 472 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 597 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _destIres) =
+              ( _destIpp,_destIres) =
                   dest_ _destOidMemRefDef
-              ( _operIres) =
+              ( _operIpp,_operIres) =
                   oper_ _operOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IAdd :: T_MRef ->
                   T_MRef ->
                   T_MRef ->
@@ -482,44 +607,57 @@
 sem_Instr_IAdd dest_ left_ right_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _destOidMemRefDef :: ( Map.Map String Int )
               _leftOidMemRefDef :: ( Map.Map String Int )
               _rightOidMemRefDef :: ( Map.Map String Int )
+              _destIpp :: Doc
               _destIres :: ( Either String () )
+              _leftIpp :: Doc
               _leftIres :: ( Either String () )
+              _rightIpp :: Doc
               _rightIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 71, column 11)
+              _lhsOpp =
+                  ({-# LINE 71 "src-ag/Language/EWE/PPProg.ag" #-}
+                   _destIpp <+> nest 5 (text ":=")
+                            <+> nest 5 _leftIpp
+                            <+> char '+'
+                            <+> _rightIpp
+                   {-# LINE 629 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 88, column 11)
               _lhsOres =
                   ({-# LINE 88 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _destIres <--> _leftIres <--> _rightIres
-                   {-# LINE 497 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 635 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _destOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 503 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 641 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _leftOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 509 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 647 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _rightOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 515 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 653 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _destIres) =
+              ( _destIpp,_destIres) =
                   dest_ _destOidMemRefDef
-              ( _leftIres) =
+              ( _leftIpp,_leftIres) =
                   left_ _leftOidMemRefDef
-              ( _rightIres) =
+              ( _rightIpp,_rightIres) =
                   right_ _rightOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_ISub :: T_MRef ->
                   T_MRef ->
                   T_MRef ->
@@ -527,44 +665,57 @@
 sem_Instr_ISub dest_ left_ right_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _destOidMemRefDef :: ( Map.Map String Int )
               _leftOidMemRefDef :: ( Map.Map String Int )
               _rightOidMemRefDef :: ( Map.Map String Int )
+              _destIpp :: Doc
               _destIres :: ( Either String () )
+              _leftIpp :: Doc
               _leftIres :: ( Either String () )
+              _rightIpp :: Doc
               _rightIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 76, column 11)
+              _lhsOpp =
+                  ({-# LINE 76 "src-ag/Language/EWE/PPProg.ag" #-}
+                   _destIpp <+> nest 5 (text ":=")
+                            <+> nest 5 _leftIpp
+                            <+> char '-'
+                            <+> _rightIpp
+                   {-# LINE 687 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 89, column 11)
               _lhsOres =
                   ({-# LINE 89 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _destIres <--> _leftIres <--> _rightIres
-                   {-# LINE 542 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 693 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _destOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 548 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 699 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _leftOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 554 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 705 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _rightOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 560 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 711 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _destIres) =
+              ( _destIpp,_destIres) =
                   dest_ _destOidMemRefDef
-              ( _leftIres) =
+              ( _leftIpp,_leftIres) =
                   left_ _leftOidMemRefDef
-              ( _rightIres) =
+              ( _rightIpp,_rightIres) =
                   right_ _rightOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IMul :: T_MRef ->
                   T_MRef ->
                   T_MRef ->
@@ -572,44 +723,57 @@
 sem_Instr_IMul dest_ left_ right_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _destOidMemRefDef :: ( Map.Map String Int )
               _leftOidMemRefDef :: ( Map.Map String Int )
               _rightOidMemRefDef :: ( Map.Map String Int )
+              _destIpp :: Doc
               _destIres :: ( Either String () )
+              _leftIpp :: Doc
               _leftIres :: ( Either String () )
+              _rightIpp :: Doc
               _rightIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 81, column 11)
+              _lhsOpp =
+                  ({-# LINE 81 "src-ag/Language/EWE/PPProg.ag" #-}
+                   _destIpp <+> nest 5 (text ":=")
+                            <+> nest 5 _leftIpp
+                            <+> char '*'
+                            <+> _rightIpp
+                   {-# LINE 745 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 90, column 11)
               _lhsOres =
                   ({-# LINE 90 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _destIres <--> _leftIres <--> _rightIres
-                   {-# LINE 587 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 751 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _destOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 593 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 757 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _leftOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 599 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 763 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _rightOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 605 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 769 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _destIres) =
+              ( _destIpp,_destIres) =
                   dest_ _destOidMemRefDef
-              ( _leftIres) =
+              ( _leftIpp,_leftIres) =
                   left_ _leftOidMemRefDef
-              ( _rightIres) =
+              ( _rightIpp,_rightIres) =
                   right_ _rightOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IDiv :: T_MRef ->
                   T_MRef ->
                   T_MRef ->
@@ -617,44 +781,57 @@
 sem_Instr_IDiv dest_ left_ right_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _destOidMemRefDef :: ( Map.Map String Int )
               _leftOidMemRefDef :: ( Map.Map String Int )
               _rightOidMemRefDef :: ( Map.Map String Int )
+              _destIpp :: Doc
               _destIres :: ( Either String () )
+              _leftIpp :: Doc
               _leftIres :: ( Either String () )
+              _rightIpp :: Doc
               _rightIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 86, column 11)
+              _lhsOpp =
+                  ({-# LINE 86 "src-ag/Language/EWE/PPProg.ag" #-}
+                   _destIpp <+> nest 5 (text ":=")
+                            <+> nest 5 _leftIpp
+                            <+> char '/'
+                            <+> _rightIpp
+                   {-# LINE 803 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 91, column 11)
               _lhsOres =
                   ({-# LINE 91 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _destIres <--> _leftIres <--> _rightIres
-                   {-# LINE 632 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 809 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _destOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 638 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 815 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _leftOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 644 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 821 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _rightOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 650 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 827 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _destIres) =
+              ( _destIpp,_destIres) =
                   dest_ _destOidMemRefDef
-              ( _leftIres) =
+              ( _leftIpp,_leftIres) =
                   left_ _leftOidMemRefDef
-              ( _rightIres) =
+              ( _rightIpp,_rightIres) =
                   right_ _rightOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IMod :: T_MRef ->
                   T_MRef ->
                   T_MRef ->
@@ -662,44 +839,57 @@
 sem_Instr_IMod dest_ left_ right_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _destOidMemRefDef :: ( Map.Map String Int )
               _leftOidMemRefDef :: ( Map.Map String Int )
               _rightOidMemRefDef :: ( Map.Map String Int )
+              _destIpp :: Doc
               _destIres :: ( Either String () )
+              _leftIpp :: Doc
               _leftIres :: ( Either String () )
+              _rightIpp :: Doc
               _rightIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 91, column 11)
+              _lhsOpp =
+                  ({-# LINE 91 "src-ag/Language/EWE/PPProg.ag" #-}
+                   _destIpp <+> nest 5 (text ":=")
+                            <+> nest 5 _leftIpp
+                            <+> char '%'
+                            <+> _rightIpp
+                   {-# LINE 861 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 92, column 11)
               _lhsOres =
                   ({-# LINE 92 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _destIres <--> _leftIres <--> _rightIres
-                   {-# LINE 677 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 867 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _destOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 683 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 873 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _leftOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 689 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 879 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _rightOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 695 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 885 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _destIres) =
+              ( _destIpp,_destIres) =
                   dest_ _destOidMemRefDef
-              ( _leftIres) =
+              ( _leftIpp,_leftIres) =
                   left_ _leftOidMemRefDef
-              ( _rightIres) =
+              ( _rightIpp,_rightIres) =
                   right_ _rightOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IMRI :: T_MRef ->
                   T_MRef ->
                   Int ->
@@ -707,34 +897,47 @@
 sem_Instr_IMRI dest_ oper_ int_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _destOidMemRefDef :: ( Map.Map String Int )
               _operOidMemRefDef :: ( Map.Map String Int )
+              _destIpp :: Doc
               _destIres :: ( Either String () )
+              _operIpp :: Doc
               _operIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 96, column 11)
+              _lhsOpp =
+                  ({-# LINE 96 "src-ag/Language/EWE/PPProg.ag" #-}
+                   _destIpp <+> nest 5 (text ":=")
+                            <+> nest 5 (char 'M')
+                            <> brackets (_operIpp
+                                <+> char '+'
+                                <+> int int_)
+                   {-# LINE 917 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 93, column 11)
               _lhsOres =
                   ({-# LINE 93 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _destIres <--> _operIres
-                   {-# LINE 720 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 923 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _destOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 726 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 929 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _operOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 732 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 935 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _destIres) =
+              ( _destIpp,_destIres) =
                   dest_ _destOidMemRefDef
-              ( _operIres) =
+              ( _operIpp,_operIres) =
                   oper_ _operOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IMMR :: T_MRef ->
                   Int ->
                   T_MRef ->
@@ -742,163 +945,224 @@
 sem_Instr_IMMR dest_ int_ oper_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _destOidMemRefDef :: ( Map.Map String Int )
               _operOidMemRefDef :: ( Map.Map String Int )
+              _destIpp :: Doc
               _destIres :: ( Either String () )
+              _operIpp :: Doc
               _operIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 102, column 11)
+              _lhsOpp =
+                  ({-# LINE 102 "src-ag/Language/EWE/PPProg.ag" #-}
+                   char 'M' <> brackets (_destIpp
+                                          <+> char '+'
+                                          <+> int int_)
+                            <+> nest 5 (text ":=")
+                            <+> nest 5 _operIpp
+                   {-# LINE 965 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 94, column 11)
               _lhsOres =
                   ({-# LINE 94 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _destIres <--> _operIres
-                   {-# LINE 755 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 971 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _destOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 761 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 977 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _operOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 767 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 983 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _destIres) =
+              ( _destIpp,_destIres) =
                   dest_ _destOidMemRefDef
-              ( _operIres) =
+              ( _operIpp,_operIres) =
                   oper_ _operOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IRI :: T_MRef ->
                  T_Instr
 sem_Instr_IRI oper_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _operOidMemRefDef :: ( Map.Map String Int )
+              _operIpp :: Doc
               _operIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 108, column 11)
+              _lhsOpp =
+                  ({-# LINE 108 "src-ag/Language/EWE/PPProg.ag" #-}
+                   text "readInt" <> parens _operIpp
+                   {-# LINE 1004 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 95, column 11)
               _lhsOres =
                   ({-# LINE 95 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _operIres
-                   {-# LINE 786 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1010 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _operOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 792 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1016 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _operIres) =
+              ( _operIpp,_operIres) =
                   oper_ _operOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IWI :: T_MRef ->
                  T_Instr
 sem_Instr_IWI oper_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _operOidMemRefDef :: ( Map.Map String Int )
+              _operIpp :: Doc
               _operIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 109, column 11)
+              _lhsOpp =
+                  ({-# LINE 109 "src-ag/Language/EWE/PPProg.ag" #-}
+                   text "writeInt" <> parens _operIpp
+                   {-# LINE 1035 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 96, column 11)
               _lhsOres =
                   ({-# LINE 96 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _operIres
-                   {-# LINE 809 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1041 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _operOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 815 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1047 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _operIres) =
+              ( _operIpp,_operIres) =
                   oper_ _operOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IRS :: T_MRef ->
                  T_MRef ->
                  T_Instr
 sem_Instr_IRS left_ right_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _leftOidMemRefDef :: ( Map.Map String Int )
               _rightOidMemRefDef :: ( Map.Map String Int )
+              _leftIpp :: Doc
               _leftIres :: ( Either String () )
+              _rightIpp :: Doc
               _rightIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 110, column 11)
+              _lhsOpp =
+                  ({-# LINE 110 "src-ag/Language/EWE/PPProg.ag" #-}
+                   text "readStr" <> parens (_leftIpp <> comma
+                                                      <+> _rightIpp)
+                   {-# LINE 1071 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 97, column 11)
               _lhsOres =
                   ({-# LINE 97 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _leftIres <--> _rightIres
-                   {-# LINE 835 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1077 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _leftOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 841 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1083 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _rightOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 847 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1089 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _leftIres) =
+              ( _leftIpp,_leftIres) =
                   left_ _leftOidMemRefDef
-              ( _rightIres) =
+              ( _rightIpp,_rightIres) =
                   right_ _rightOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IWS :: T_MRef ->
                  T_Instr
 sem_Instr_IWS oper_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _operOidMemRefDef :: ( Map.Map String Int )
+              _operIpp :: Doc
               _operIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 112, column 11)
+              _lhsOpp =
+                  ({-# LINE 112 "src-ag/Language/EWE/PPProg.ag" #-}
+                   text "writeStr" <> parens _operIpp
+                   {-# LINE 1110 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 98, column 11)
               _lhsOres =
                   ({-# LINE 98 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _operIres
-                   {-# LINE 866 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1116 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _operOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 872 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1122 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _operIres) =
+              ( _operIpp,_operIres) =
                   oper_ _operOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IGI :: Int ->
                  T_Instr
 sem_Instr_IGI int_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
+              -- "src-ag/Language/EWE/PPProg.ag"(line 113, column 11)
+              _lhsOpp =
+                  ({-# LINE 113 "src-ag/Language/EWE/PPProg.ag" #-}
+                   text "goto" <+> int int_
+                   {-# LINE 1138 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 99, column 11)
               _lhsOres =
                   ({-# LINE 99 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    Right ()
-                   {-# LINE 887 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1144 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IGS :: String ->
                  T_Instr
 sem_Instr_IGS string_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
+              -- "src-ag/Language/EWE/PPProg.ag"(line 114, column 11)
+              _lhsOpp =
+                  ({-# LINE 114 "src-ag/Language/EWE/PPProg.ag" #-}
+                   text "goto" <+> text string_
+                   {-# LINE 1158 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 100, column 11)
               _lhsOres =
                   ({-# LINE 100 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    isLabelDef string_ _lhsIlabelFound
-                   {-# LINE 900 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1164 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IFI :: T_MRef ->
                  T_Cond ->
                  T_MRef ->
@@ -907,34 +1171,47 @@
 sem_Instr_IFI bcond_ cond_ then_ int_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _bcondOidMemRefDef :: ( Map.Map String Int )
               _thenOidMemRefDef :: ( Map.Map String Int )
+              _bcondIpp :: Doc
               _bcondIres :: ( Either String () )
+              _condIpp :: Doc
+              _thenIpp :: Doc
               _thenIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 115, column 11)
+              _lhsOpp =
+                  ({-# LINE 115 "src-ag/Language/EWE/PPProg.ag" #-}
+                   text "if" <+> _bcondIpp <+> _condIpp <+> _thenIpp
+                             <+> text "then" <+> text "goto" <+> int int_
+                   {-# LINE 1189 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 101, column 11)
               _lhsOres =
                   ({-# LINE 101 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _bcondIres <--> _thenIres
-                   {-# LINE 920 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1195 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _bcondOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 926 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1201 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _thenOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 932 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1207 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _bcondIres) =
+              ( _bcondIpp,_bcondIres) =
                   bcond_ _bcondOidMemRefDef
-              ( _thenIres) =
+              ( _condIpp) =
+                  cond_
+              ( _thenIpp,_thenIres) =
                   then_ _thenOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IFS :: T_MRef ->
                  T_Cond ->
                  T_MRef ->
@@ -943,70 +1220,105 @@
 sem_Instr_IFS bcond_ cond_ then_ string_ =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _bcondOidMemRefDef :: ( Map.Map String Int )
               _thenOidMemRefDef :: ( Map.Map String Int )
+              _bcondIpp :: Doc
               _bcondIres :: ( Either String () )
+              _condIpp :: Doc
+              _thenIpp :: Doc
               _thenIres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 117, column 11)
+              _lhsOpp =
+                  ({-# LINE 117 "src-ag/Language/EWE/PPProg.ag" #-}
+                   text "if" <+> _bcondIpp <+> _condIpp <+> _thenIpp
+                             <+> text "then" <+> text "goto"
+                             <+> text string_
+                   {-# LINE 1239 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 102, column 11)
               _lhsOres =
                   ({-# LINE 102 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    isLabelDef string_ _lhsIlabelFound <--> _bcondIres <--> _thenIres
-                   {-# LINE 956 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1245 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _bcondOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 962 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1251 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _thenOidMemRefDef =
                   ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 968 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1257 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _bcondIres) =
+              ( _bcondIpp,_bcondIres) =
                   bcond_ _bcondOidMemRefDef
-              ( _thenIres) =
+              ( _condIpp) =
+                  cond_
+              ( _thenIpp,_thenIres) =
                   then_ _thenOidMemRefDef
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IH :: T_Instr
 sem_Instr_IH =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
+              -- "src-ag/Language/EWE/PPProg.ag"(line 120, column 11)
+              _lhsOpp =
+                  ({-# LINE 120 "src-ag/Language/EWE/PPProg.ag" #-}
+                   text "halt"
+                   {-# LINE 1276 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 103, column 11)
               _lhsOres =
                   ({-# LINE 103 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    Right ()
-                   {-# LINE 984 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1282 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_IB :: T_Instr
 sem_Instr_IB =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
+              -- "src-ag/Language/EWE/PPProg.ag"(line 121, column 11)
+              _lhsOpp =
+                  ({-# LINE 121 "src-ag/Language/EWE/PPProg.ag" #-}
+                   text "break"
+                   {-# LINE 1295 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 104, column 11)
               _lhsOres =
                   ({-# LINE 104 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    Right ()
-                   {-# LINE 996 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1301 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_Instr_INI :: T_Instr
 sem_Instr_INI =
     (\ _lhsIidMemRefDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
+              -- "src-ag/Language/EWE/PPProg.ag"(line 122, column 11)
+              _lhsOpp =
+                  ({-# LINE 122 "src-ag/Language/EWE/PPProg.ag" #-}
+                   empty
+                   {-# LINE 1314 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 105, column 11)
               _lhsOres =
                   ({-# LINE 105 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    Right ()
-                   {-# LINE 1008 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1320 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 -- Labels ------------------------------------------------------
 {-
    visit 0:
@@ -1014,6 +1326,7 @@
          labelDef             :  Set.Set String 
       synthesized attributes:
          copy                 : Labels 
+         pp                   : Doc
          res                  :  Either String () 
    alternatives:
       alternative Cons:
@@ -1032,15 +1345,15 @@
     (Prelude.foldr sem_Labels_Cons sem_Labels_Nil list)
 -- semantic domain
 type T_Labels = ( Set.Set String ) ->
-                ( Labels,( Set.Set String ),( Either String () ))
+                ( Labels,( Set.Set String ),Doc,( Either String () ))
 data Inh_Labels = Inh_Labels {labelDef_Inh_Labels :: ( Set.Set String )}
-data Syn_Labels = Syn_Labels {copy_Syn_Labels :: Labels,labelDef_Syn_Labels :: ( Set.Set String ),res_Syn_Labels :: ( Either String () )}
+data Syn_Labels = Syn_Labels {copy_Syn_Labels :: Labels,labelDef_Syn_Labels :: ( Set.Set String ),pp_Syn_Labels :: Doc,res_Syn_Labels :: ( Either String () )}
 wrap_Labels :: T_Labels ->
                Inh_Labels ->
                Syn_Labels
 wrap_Labels sem (Inh_Labels _lhsIlabelDef) =
-    (let ( _lhsOcopy,_lhsOlabelDef,_lhsOres) = sem _lhsIlabelDef
-     in  (Syn_Labels _lhsOcopy _lhsOlabelDef _lhsOres))
+    (let ( _lhsOcopy,_lhsOlabelDef,_lhsOpp,_lhsOres) = sem _lhsIlabelDef
+     in  (Syn_Labels _lhsOcopy _lhsOlabelDef _lhsOpp _lhsOres))
 sem_Labels_Cons :: String ->
                    T_Labels ->
                    T_Labels
@@ -1048,81 +1361,97 @@
     (\ _lhsIlabelDef ->
          (let _lhsOres :: ( Either String () )
               _lhsOlabelDef :: ( Set.Set String )
+              _lhsOpp :: Doc
               _lhsOcopy :: Labels
               _tlOlabelDef :: ( Set.Set String )
               _tlIcopy :: Labels
               _tlIlabelDef :: ( Set.Set String )
+              _tlIpp :: Doc
               _tlIres :: ( Either String () )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 53, column 11)
               _lhsOres =
                   ({-# LINE 53 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    isLabelNotDef hd_ _tlIlabelDef
-                   {-# LINE 1061 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1376 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 53, column 11)
               _lhsOlabelDef =
                   ({-# LINE 54 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    Set.insert hd_ _tlIlabelDef
-                   {-# LINE 1067 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1382 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
+              -- use rule "src-ag/Language/EWE/PPProg.ag"(line 19, column 10)
+              _lhsOpp =
+                  ({-# LINE 19 "src-ag/Language/EWE/PPProg.ag" #-}
+                   _tlIpp
+                   {-# LINE 1388 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- self rule
               _copy =
                   ({-# LINE 39 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    (:) hd_ _tlIcopy
-                   {-# LINE 1073 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1394 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- self rule
               _lhsOcopy =
                   ({-# LINE 39 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _copy
-                   {-# LINE 1079 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1400 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _tlOlabelDef =
                   ({-# LINE 38 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIlabelDef
-                   {-# LINE 1085 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1406 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _tlIcopy,_tlIlabelDef,_tlIres) =
+              ( _tlIcopy,_tlIlabelDef,_tlIpp,_tlIres) =
                   tl_ _tlOlabelDef
-          in  ( _lhsOcopy,_lhsOlabelDef,_lhsOres)))
+          in  ( _lhsOcopy,_lhsOlabelDef,_lhsOpp,_lhsOres)))
 sem_Labels_Nil :: T_Labels
 sem_Labels_Nil =
     (\ _lhsIlabelDef ->
          (let _lhsOres :: ( Either String () )
               _lhsOlabelDef :: ( Set.Set String )
+              _lhsOpp :: Doc
               _lhsOcopy :: Labels
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 55, column 11)
               _lhsOres =
                   ({-# LINE 55 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    Right ()
-                   {-# LINE 1100 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1422 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 55, column 11)
               _lhsOlabelDef =
                   ({-# LINE 56 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIlabelDef
-                   {-# LINE 1106 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1428 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
+              -- use rule "src-ag/Language/EWE/PPProg.ag"(line 19, column 10)
+              _lhsOpp =
+                  ({-# LINE 19 "src-ag/Language/EWE/PPProg.ag" #-}
+                   empty
+                   {-# LINE 1434 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- self rule
               _copy =
                   ({-# LINE 39 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    []
-                   {-# LINE 1112 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1440 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- self rule
               _lhsOcopy =
                   ({-# LINE 39 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _copy
-                   {-# LINE 1118 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1446 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-          in  ( _lhsOcopy,_lhsOlabelDef,_lhsOres)))
+          in  ( _lhsOcopy,_lhsOlabelDef,_lhsOpp,_lhsOres)))
 -- MRef --------------------------------------------------------
 {-
    visit 0:
       inherited attribute:
          idMemRefDef          :  Map.Map String Int 
-      synthesized attribute:
+      synthesized attributes:
+         pp                   : Doc
          res                  :  Either String () 
    alternatives:
       alternative MRefI:
@@ -1139,43 +1468,59 @@
     (sem_MRef_MRefId _string)
 -- semantic domain
 type T_MRef = ( Map.Map String Int ) ->
-              ( ( Either String () ))
+              ( Doc,( Either String () ))
 data Inh_MRef = Inh_MRef {idMemRefDef_Inh_MRef :: ( Map.Map String Int )}
-data Syn_MRef = Syn_MRef {res_Syn_MRef :: ( Either String () )}
+data Syn_MRef = Syn_MRef {pp_Syn_MRef :: Doc,res_Syn_MRef :: ( Either String () )}
 wrap_MRef :: T_MRef ->
              Inh_MRef ->
              Syn_MRef
 wrap_MRef sem (Inh_MRef _lhsIidMemRefDef) =
-    (let ( _lhsOres) = sem _lhsIidMemRefDef
-     in  (Syn_MRef _lhsOres))
+    (let ( _lhsOpp,_lhsOres) = sem _lhsIidMemRefDef
+     in  (Syn_MRef _lhsOpp _lhsOres))
 sem_MRef_MRefI :: Int ->
                   T_MRef
 sem_MRef_MRefI int_ =
     (\ _lhsIidMemRefDef ->
-         (let _lhsOres :: ( Either String () )
+         (let _lhsOpp :: Doc
+              _lhsOres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 34, column 12)
+              _lhsOpp =
+                  ({-# LINE 34 "src-ag/Language/EWE/PPProg.ag" #-}
+                   text "M" <> brackets ( int int_ )
+                   {-# LINE 1491 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 79, column 12)
               _lhsOres =
                   ({-# LINE 79 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    Right ()
-                   {-# LINE 1161 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1497 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 sem_MRef_MRefId :: String ->
                    T_MRef
 sem_MRef_MRefId string_ =
     (\ _lhsIidMemRefDef ->
-         (let _lhsOres :: ( Either String () )
+         (let _lhsOpp :: Doc
+              _lhsOres :: ( Either String () )
+              -- "src-ag/Language/EWE/PPProg.ag"(line 35, column 12)
+              _lhsOpp =
+                  ({-# LINE 35 "src-ag/Language/EWE/PPProg.ag" #-}
+                   text "M" <>
+                   brackets (text string_)
+                   {-# LINE 1511 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 80, column 12)
               _lhsOres =
                   ({-# LINE 80 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    isMemRefDef string_ _lhsIidMemRefDef
-                   {-# LINE 1173 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1517 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-          in  ( _lhsOres)))
+          in  ( _lhsOpp,_lhsOres)))
 -- Prog --------------------------------------------------------
 {-
    visit 0:
-      synthesized attribute:
+      synthesized attributes:
+         pp                   : Doc
          res                  : Either String ()
    alternatives:
       alternative Prg:
@@ -1188,62 +1533,71 @@
 sem_Prog (Prg _stms _equates) =
     (sem_Prog_Prg (sem_Stmts _stms) (sem_Equates _equates))
 -- semantic domain
-type T_Prog = ( (Either String ()))
+type T_Prog = ( Doc,(Either String ()))
 data Inh_Prog = Inh_Prog {}
-data Syn_Prog = Syn_Prog {res_Syn_Prog :: (Either String ())}
+data Syn_Prog = Syn_Prog {pp_Syn_Prog :: Doc,res_Syn_Prog :: (Either String ())}
 wrap_Prog :: T_Prog ->
              Inh_Prog ->
              Syn_Prog
 wrap_Prog sem (Inh_Prog) =
-    (let ( _lhsOres) = sem
-     in  (Syn_Prog _lhsOres))
+    (let ( _lhsOpp,_lhsOres) = sem
+     in  (Syn_Prog _lhsOpp _lhsOres))
 sem_Prog_Prg :: T_Stmts ->
                 T_Equates ->
                 T_Prog
 sem_Prog_Prg stms_ equates_ =
-    (let _stmsOlabelDef :: (Set.Set String)
+    (let _lhsOpp :: Doc
+         _stmsOlabelDef :: (Set.Set String)
          _stmsOlabelFound :: (Set.Set String)
          _stmsOidMemRefDef :: (Map.Map String Int)
          _equatesOidMemRef :: (Map.Map String Int)
          _lhsOres :: (Either String ())
          _stmsIlabelDef :: (Set.Set String)
+         _stmsIpp :: Doc
          _stmsIres :: (Either String ())
          _equatesIidMemRef :: (Map.Map String Int)
+         _equatesIpp :: Doc
+         -- "src-ag/Language/EWE/PPProg.ag"(line 54, column 9)
+         _lhsOpp =
+             ({-# LINE 54 "src-ag/Language/EWE/PPProg.ag" #-}
+              _stmsIpp $$ _equatesIpp
+              {-# LINE 1565 "src/Language/EWE/CheckGrammar.hs" #-}
+              )
          -- "src-ag/Language/EWE/CheckGrammar.ag"(line 59, column 9)
          _stmsOlabelDef =
              ({-# LINE 59 "src-ag/Language/EWE/CheckGrammar.ag" #-}
               Set.empty
-              {-# LINE 1217 "src/Language/EWE/CheckGrammar.hs" #-}
+              {-# LINE 1571 "src/Language/EWE/CheckGrammar.hs" #-}
               )
          -- "src-ag/Language/EWE/CheckGrammar.ag"(line 59, column 9)
          _stmsOlabelFound =
              ({-# LINE 60 "src-ag/Language/EWE/CheckGrammar.ag" #-}
               _stmsIlabelDef
-              {-# LINE 1223 "src/Language/EWE/CheckGrammar.hs" #-}
+              {-# LINE 1577 "src/Language/EWE/CheckGrammar.hs" #-}
               )
          -- "src-ag/Language/EWE/CheckGrammar.ag"(line 59, column 9)
          _stmsOidMemRefDef =
              ({-# LINE 61 "src-ag/Language/EWE/CheckGrammar.ag" #-}
               _equatesIidMemRef
-              {-# LINE 1229 "src/Language/EWE/CheckGrammar.hs" #-}
+              {-# LINE 1583 "src/Language/EWE/CheckGrammar.hs" #-}
               )
          -- "src-ag/Language/EWE/CheckGrammar.ag"(line 62, column 9)
          _equatesOidMemRef =
              ({-# LINE 62 "src-ag/Language/EWE/CheckGrammar.ag" #-}
               Map.empty
-              {-# LINE 1235 "src/Language/EWE/CheckGrammar.hs" #-}
+              {-# LINE 1589 "src/Language/EWE/CheckGrammar.hs" #-}
               )
          -- copy rule (up)
          _lhsOres =
              ({-# LINE 10 "src-ag/Language/EWE/CheckGrammar.ag" #-}
               _stmsIres
-              {-# LINE 1241 "src/Language/EWE/CheckGrammar.hs" #-}
+              {-# LINE 1595 "src/Language/EWE/CheckGrammar.hs" #-}
               )
-         ( _stmsIlabelDef,_stmsIres) =
+         ( _stmsIlabelDef,_stmsIpp,_stmsIres) =
              stms_ _stmsOidMemRefDef _stmsOlabelDef _stmsOlabelFound
-         ( _equatesIidMemRef) =
+         ( _equatesIidMemRef,_equatesIpp) =
              equates_ _equatesOidMemRef
-     in  ( _lhsOres))
+     in  ( _lhsOpp,_lhsOres))
 -- Stmt --------------------------------------------------------
 {-
    visit 0:
@@ -1252,7 +1606,8 @@
          labelFound           : Set.Set String
       chained attribute:
          labelDef             : Set.Set String
-      synthesized attribute:
+      synthesized attributes:
+         pp                   : Doc
          res                  : Either String ()
    alternatives:
       alternative Stmt:
@@ -1270,15 +1625,15 @@
 type T_Stmt = (Map.Map String Int) ->
               (Set.Set String) ->
               (Set.Set String) ->
-              ( (Set.Set String),(Either String ()))
+              ( (Set.Set String),Doc,(Either String ()))
 data Inh_Stmt = Inh_Stmt {idMemRefDef_Inh_Stmt :: (Map.Map String Int),labelDef_Inh_Stmt :: (Set.Set String),labelFound_Inh_Stmt :: (Set.Set String)}
-data Syn_Stmt = Syn_Stmt {labelDef_Syn_Stmt :: (Set.Set String),res_Syn_Stmt :: (Either String ())}
+data Syn_Stmt = Syn_Stmt {labelDef_Syn_Stmt :: (Set.Set String),pp_Syn_Stmt :: Doc,res_Syn_Stmt :: (Either String ())}
 wrap_Stmt :: T_Stmt ->
              Inh_Stmt ->
              Syn_Stmt
 wrap_Stmt sem (Inh_Stmt _lhsIidMemRefDef _lhsIlabelDef _lhsIlabelFound) =
-    (let ( _lhsOlabelDef,_lhsOres) = sem _lhsIidMemRefDef _lhsIlabelDef _lhsIlabelFound
-     in  (Syn_Stmt _lhsOlabelDef _lhsOres))
+    (let ( _lhsOlabelDef,_lhsOpp,_lhsOres) = sem _lhsIidMemRefDef _lhsIlabelDef _lhsIlabelFound
+     in  (Syn_Stmt _lhsOlabelDef _lhsOpp _lhsOres))
 sem_Stmt_Stmt :: T_Labels ->
                  T_Instr ->
                  T_Stmt
@@ -1286,15 +1641,24 @@
     (\ _lhsIidMemRefDef
        _lhsIlabelDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _lhsOlabelDef :: (Set.Set String)
               _labelsOlabelDef :: ( Set.Set String )
               _instrOidMemRefDef :: (Map.Map String Int)
               _instrOlabelFound :: (Set.Set String)
               _labelsIcopy :: Labels
               _labelsIlabelDef :: ( Set.Set String )
+              _labelsIpp :: Doc
               _labelsIres :: ( Either String () )
+              _instrIpp :: Doc
               _instrIres :: (Either String ())
+              -- "src-ag/Language/EWE/PPProg.ag"(line 51, column 10)
+              _lhsOpp =
+                  ({-# LINE 51 "src-ag/Language/EWE/PPProg.ag" #-}
+                   _labelsIpp $$ _instrIpp
+                   {-# LINE 1661 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 65, column 10)
               _res1 =
                   ({-# LINE 65 "src-ag/Language/EWE/CheckGrammar.ag" #-}
@@ -1307,43 +1671,43 @@
                    in if e'
                       then Left errs'
                       else Right ()
-                   {-# LINE 1311 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1675 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- "src-ag/Language/EWE/CheckGrammar.ag"(line 76, column 11)
               _lhsOres =
                   ({-# LINE 76 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _res1 <--> _instrIres
-                   {-# LINE 1317 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1681 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (up)
               _lhsOlabelDef =
                   ({-# LINE 26 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _labelsIlabelDef
-                   {-# LINE 1323 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1687 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _labelsOlabelDef =
                   ({-# LINE 38 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIlabelDef
-                   {-# LINE 1329 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1693 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _instrOidMemRefDef =
                   ({-# LINE 33 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 1335 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1699 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _instrOlabelFound =
                   ({-# LINE 32 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIlabelFound
-                   {-# LINE 1341 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1705 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _labelsIcopy,_labelsIlabelDef,_labelsIres) =
+              ( _labelsIcopy,_labelsIlabelDef,_labelsIpp,_labelsIres) =
                   labels_ _labelsOlabelDef
-              ( _instrIres) =
+              ( _instrIpp,_instrIres) =
                   instr_ _instrOidMemRefDef _instrOlabelFound
-          in  ( _lhsOlabelDef,_lhsOres)))
+          in  ( _lhsOlabelDef,_lhsOpp,_lhsOres)))
 -- Stmts -------------------------------------------------------
 {-
    visit 0:
@@ -1352,7 +1716,8 @@
          labelFound           : Set.Set String
       chained attribute:
          labelDef             : Set.Set String
-      synthesized attribute:
+      synthesized attributes:
+         pp                   : Doc
          res                  : Either String ()
    alternatives:
       alternative Cons:
@@ -1369,15 +1734,15 @@
 type T_Stmts = (Map.Map String Int) ->
                (Set.Set String) ->
                (Set.Set String) ->
-               ( (Set.Set String),(Either String ()))
+               ( (Set.Set String),Doc,(Either String ()))
 data Inh_Stmts = Inh_Stmts {idMemRefDef_Inh_Stmts :: (Map.Map String Int),labelDef_Inh_Stmts :: (Set.Set String),labelFound_Inh_Stmts :: (Set.Set String)}
-data Syn_Stmts = Syn_Stmts {labelDef_Syn_Stmts :: (Set.Set String),res_Syn_Stmts :: (Either String ())}
+data Syn_Stmts = Syn_Stmts {labelDef_Syn_Stmts :: (Set.Set String),pp_Syn_Stmts :: Doc,res_Syn_Stmts :: (Either String ())}
 wrap_Stmts :: T_Stmts ->
               Inh_Stmts ->
               Syn_Stmts
 wrap_Stmts sem (Inh_Stmts _lhsIidMemRefDef _lhsIlabelDef _lhsIlabelFound) =
-    (let ( _lhsOlabelDef,_lhsOres) = sem _lhsIidMemRefDef _lhsIlabelDef _lhsIlabelFound
-     in  (Syn_Stmts _lhsOlabelDef _lhsOres))
+    (let ( _lhsOlabelDef,_lhsOpp,_lhsOres) = sem _lhsIidMemRefDef _lhsIlabelDef _lhsIlabelFound
+     in  (Syn_Stmts _lhsOlabelDef _lhsOpp _lhsOres))
 sem_Stmts_Cons :: T_Stmt ->
                   T_Stmts ->
                   T_Stmts
@@ -1385,7 +1750,8 @@
     (\ _lhsIidMemRefDef
        _lhsIlabelDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _lhsOlabelDef :: (Set.Set String)
               _hdOidMemRefDef :: (Map.Map String Int)
               _hdOlabelDef :: (Set.Set String)
@@ -1394,79 +1760,94 @@
               _tlOlabelDef :: (Set.Set String)
               _tlOlabelFound :: (Set.Set String)
               _hdIlabelDef :: (Set.Set String)
+              _hdIpp :: Doc
               _hdIres :: (Either String ())
               _tlIlabelDef :: (Set.Set String)
+              _tlIpp :: Doc
               _tlIres :: (Either String ())
+              -- use rule "src-ag/Language/EWE/PPProg.ag"(line 25, column 10)
+              _lhsOpp =
+                  ({-# LINE 25 "src-ag/Language/EWE/PPProg.ag" #-}
+                   (($$) _hdIpp _tlIpp)
+                   {-# LINE 1773 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- use rule "src-ag/Language/EWE/CheckGrammar.ag"(line 23, column 12)
               _lhsOres =
                   ({-# LINE 23 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    ((<-->) _hdIres _tlIres)
-                   {-# LINE 1405 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1779 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (up)
               _lhsOlabelDef =
                   ({-# LINE 20 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _tlIlabelDef
-                   {-# LINE 1411 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1785 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _hdOidMemRefDef =
                   ({-# LINE 28 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 1417 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1791 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _hdOlabelDef =
                   ({-# LINE 26 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIlabelDef
-                   {-# LINE 1423 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1797 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _hdOlabelFound =
                   ({-# LINE 27 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIlabelFound
-                   {-# LINE 1429 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1803 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _tlOidMemRefDef =
                   ({-# LINE 22 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIidMemRefDef
-                   {-# LINE 1435 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1809 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (chain)
               _tlOlabelDef =
                   ({-# LINE 20 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _hdIlabelDef
-                   {-# LINE 1441 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1815 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (down)
               _tlOlabelFound =
                   ({-# LINE 21 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIlabelFound
-                   {-# LINE 1447 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1821 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-              ( _hdIlabelDef,_hdIres) =
+              ( _hdIlabelDef,_hdIpp,_hdIres) =
                   hd_ _hdOidMemRefDef _hdOlabelDef _hdOlabelFound
-              ( _tlIlabelDef,_tlIres) =
+              ( _tlIlabelDef,_tlIpp,_tlIres) =
                   tl_ _tlOidMemRefDef _tlOlabelDef _tlOlabelFound
-          in  ( _lhsOlabelDef,_lhsOres)))
+          in  ( _lhsOlabelDef,_lhsOpp,_lhsOres)))
 sem_Stmts_Nil :: T_Stmts
 sem_Stmts_Nil =
     (\ _lhsIidMemRefDef
        _lhsIlabelDef
        _lhsIlabelFound ->
-         (let _lhsOres :: (Either String ())
+         (let _lhsOpp :: Doc
+              _lhsOres :: (Either String ())
               _lhsOlabelDef :: (Set.Set String)
+              -- use rule "src-ag/Language/EWE/PPProg.ag"(line 25, column 10)
+              _lhsOpp =
+                  ({-# LINE 25 "src-ag/Language/EWE/PPProg.ag" #-}
+                   empty
+                   {-# LINE 1840 "src/Language/EWE/CheckGrammar.hs" #-}
+                   )
               -- use rule "src-ag/Language/EWE/CheckGrammar.ag"(line 23, column 12)
               _lhsOres =
                   ({-# LINE 23 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    Right ()
-                   {-# LINE 1465 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1846 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
               -- copy rule (chain)
               _lhsOlabelDef =
                   ({-# LINE 20 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                    _lhsIlabelDef
-                   {-# LINE 1471 "src/Language/EWE/CheckGrammar.hs" #-}
+                   {-# LINE 1852 "src/Language/EWE/CheckGrammar.hs" #-}
                    )
-          in  ( _lhsOlabelDef,_lhsOres)))
+          in  ( _lhsOlabelDef,_lhsOpp,_lhsOres)))
diff --git a/src/Language/EWE/Parser.y b/src/Language/EWE/Parser.y
--- a/src/Language/EWE/Parser.y
+++ b/src/Language/EWE/Parser.y
@@ -2,7 +2,7 @@
 {-# OPTIONS -w #-}
 module Language.EWE.Parser(pEWE) where
 
-import Language.EWE.Token(Tkns,Tkn(..))
+import Language.EWE.Token(Tkns,Tkn(..), Tkn_(..))
 import Language.EWE.Scanner
 import Language.EWE.AbsSyn
 }
@@ -10,43 +10,42 @@
 %name parse
 %tokentype { Tkn }
 %error     { parseError }
-%monad { Alex } 
-%lexer { lexwrap } { TknEOF }
+%monad { Alex }
+%lexer { lexwrap } { Tkn _ TknEOF }
 
-%token int        { TknInt $$ }
-       str        { TknStr $$ }  
---       label      { TknLabel $$ }
-       id         { TknId $$ }
-       ':='       { TknAssgn }
-       ':'        { TknColon }
-       '('        { TknLPar  }
-       ')'        { TknRPar  }
-       '['        { TknLBrk  }
-       ']'        { TknRBrk  }
-       ','        { TknComma }
-       '+'        { TknOper '+' }
-       '-'        { TknOper '-' }
-       '*'        { TknOper '*' }
-       '/'        { TknOper '/' }
-       '%'        { TknOper '%' }
-       '<>'       { TknCond "<>" }
-       '='        { TknCond "=" }
-       '<'        { TknCond "<" }
-       '<='       { TknCond "<=" }
-       '>'        { TknCond ">" }
-       '>='       { TknCond ">=" }
-       'PC'       { TknResWrd "PC" }
-       'M'        { TknResWrd "M" }
-       'readInt'  { TknResWrd "readInt" }
-       'writeInt' { TknResWrd "writeInt" }
-       'readStr'  { TknResWrd "readStr" }
-       'writeStr' { TknResWrd "writeStr" }
-       'goto'     { TknResWrd "goto" }
-       'if'        { TknResWrd "if" }
-       'then'     { TknResWrd "then" }
-       'halt'     { TknResWrd "halt" }
-       'break'    { TknResWrd "break" }
-       'equ'      { TknResWrd "equ" }
+%token int        { Tkn _ (TknInt $$) }
+       str        { Tkn _ (TknStr $$) }
+       id         { Tkn _ (TknId $$) }
+       ':='       { Tkn _ TknAssgn }
+       ':'        { Tkn _ TknColon }
+       '('        { Tkn _ TknLPar  }
+       ')'        { Tkn _ TknRPar  }
+       '['        { Tkn _ TknLBrk  }
+       ']'        { Tkn _ TknRBrk  }
+       ','        { Tkn _ TknComma }
+       '+'        { Tkn _ (TknOper '+') }
+       '-'        { Tkn _ (TknOper '-') }
+       '*'        { Tkn _ (TknOper '*') }
+       '/'        { Tkn _ (TknOper '/') }
+       '%'        { Tkn _ (TknOper '%') }
+       '<>'       { Tkn _ (TknCond "<>") }
+       '='        { Tkn _ (TknCond "=") }
+       '<'        { Tkn _ (TknCond "<") }
+       '<='       { Tkn _ (TknCond "<=") }
+       '>'        { Tkn _ (TknCond ">") }
+       '>='       { Tkn _ (TknCond ">=") }
+       'PC'       { Tkn _ (TknResWrd "PC") }
+       'M'        { Tkn _ (TknResWrd "M") }
+       'readInt'  { Tkn _ (TknResWrd "readInt") }
+       'writeInt' { Tkn _ (TknResWrd "writeInt") }
+       'readStr'  { Tkn _ (TknResWrd "readStr") }
+       'writeStr' { Tkn _ (TknResWrd "writeStr") }
+       'goto'     { Tkn _ (TknResWrd "goto") }
+       'if'       { Tkn _ (TknResWrd "if") }
+       'then'     { Tkn _ (TknResWrd "then") }
+       'halt'     { Tkn _ (TknResWrd "halt") }
+       'break'    { Tkn _ (TknResWrd "break") }
+       'equ'      { Tkn _ (TknResWrd "equ") }
 %%
 
 EweProg : Executable Equates { Prg $1 $2 }
@@ -71,7 +70,7 @@
       | 'M' '[' MemRef '+' int ']' ':=' MemRef    { IMMR $3 $5 $8 }
       | 'readInt' '(' MemRef ')'                  { IRI $3 }
       | 'writeInt' '(' MemRef ')'                 { IWI $3 }
-      | 'readStr' '(' MemRef ',' MemRef ')'       { IRS $3 $5 }  
+      | 'readStr' '(' MemRef ',' MemRef ')'       { IRS $3 $5 }
       | 'writeStr' '(' MemRef ')'                 { IWS $3 }
       | 'goto' int                                { IGI $2 }
       | 'goto' id                                 { IGS $2 }
@@ -111,4 +110,3 @@
 pEWE :: String -> Either String Prog
 pEWE s = runAlex s parse
 }
-
diff --git a/src/Language/EWE/Scanner.x b/src/Language/EWE/Scanner.x
--- a/src/Language/EWE/Scanner.x
+++ b/src/Language/EWE/Scanner.x
@@ -8,7 +8,7 @@
                             getPosn
                            ) where
 
-import Language.EWE.Token(Tkns,Tkn(..))
+import Language.EWE.Token(Tkns,Tkn(..),Tkn_(..))
 }
 
 %wrapper "monad"
@@ -49,10 +49,13 @@
        "equ"                        { returnResWrd }
        \" [^\"]* \"                 { returnStr }
        (($nozerodigit $digit*)| 0)  { returnInt }
---       $alpha [$alpha $digit]*\:    { returnLabel }
-       $alpha [$alpha $digit]*       { returnId }
+       $alpha [$alpha $digit]*      { returnId }
 
 {
+returnTkn :: Tkn_ -> AlexInput -> Int -> Alex Tkn
+returnTkn tkn _ _ = do pos <- getPosn 
+                       return $ Tkn pos tkn
+
 returnEOL :: AlexInput -> Int -> Alex Tkn
 returnEOL = returnTkn $ TknEOL
 
@@ -62,9 +65,6 @@
 returnColon :: AlexInput -> Int -> Alex Tkn
 returnColon = returnTkn $ TknColon
 
-returnTkn :: Tkn -> AlexInput -> Int -> Alex Tkn
-returnTkn tkn _ _ = return $ tkn
-
 returnLPar :: AlexInput -> Int -> Alex Tkn
 returnLPar = returnTkn $ TknLPar
 
@@ -92,28 +92,27 @@
 returnInt :: AlexInput -> Int -> Alex Tkn
 returnInt = returnFunction (TknInt . read)
 
--- returnLabel :: AlexInput -> Int -> Alex Tkn
--- returnLabel = returnFunction (TknLabel . init)
-
 returnId :: AlexInput -> Int -> Alex Tkn
 returnId = returnFunction TknId
 
 returnResWrd :: AlexInput -> Int -> Alex Tkn
 returnResWrd = returnFunction TknResWrd
 
-returnFunction :: (String -> Tkn) -> AlexInput -> Int -> Alex Tkn
-returnFunction f (_,_,_,s) i = return $ f (take i s)
+returnFunction :: (String -> Tkn_) -> AlexInput -> Int -> Alex Tkn
+returnFunction f (_,_,_,s) i = do pos <- getPosn
+                                  return $ (Tkn pos (f (take i s)))
 
 alexEOF :: Alex Tkn
-alexEOF = return $ TknEOF
+alexEOF = do pos <- getPosn
+             return $ Tkn pos TknEOF
 
 alexExec :: Alex Tkns
 alexExec = do
    t <- alexMonadScan
    case t of
-     TknEOF -> return $ [t]
-     _      -> do ts <- alexExec
-                  return (t:ts)
+     (Tkn pos TknEOF) -> return $ [t]
+     _                -> do ts <- alexExec
+                            return (t:ts)
 
 getPosn :: Alex (Int,Int)
 getPosn = do
diff --git a/src/Language/EWE/Token.hs b/src/Language/EWE/Token.hs
--- a/src/Language/EWE/Token.hs
+++ b/src/Language/EWE/Token.hs
@@ -1,21 +1,24 @@
-module Language.EWE.Token(Tkns,Tkn(..)) where
+module Language.EWE.Token(Tkns,Tkn(..),Tkn_(..)) where
 
 type Tkns = [Tkn]
 
-data Tkn = TknInt   Int
-         | TknStr   String
---         | TknLabel String
-         | TknId    String
-         | TknAssgn
-         | TknColon
-         | TknComma
-         | TknLPar
-         | TknRPar
-         | TknLBrk
-         | TknRBrk
-         | TknOper   Char
-         | TknCond   String
-         | TknResWrd String
-         | TknEOL
-         | TknEOF
+type TknPos = (Int,Int)
+
+data Tkn  = Tkn TknPos Tkn_ deriving (Show, Eq)
+
+data Tkn_ = TknInt   Int
+          | TknStr   String
+          | TknId    String
+          | TknAssgn
+          | TknColon
+          | TknComma
+          | TknLPar
+          | TknRPar
+          | TknLBrk
+          | TknRBrk
+          | TknOper   Char
+          | TknCond   String
+          | TknResWrd String
+          | TknEOL
+          | TknEOF
              deriving (Show, Eq)
diff --git a/src/Language/EWE/TokenUtils.hs b/src/Language/EWE/TokenUtils.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/EWE/TokenUtils.hs
@@ -0,0 +1,31 @@
+module Language.EWE.TokenUtils(ppTokens) where
+
+import Text.PrettyPrint
+import Language.EWE.Token(Tkns,Tkn(..),Tkn_(..))
+
+ppTokens :: Tkns -> String
+ppTokens tkns = render $ ppTkns tkns
+
+ppTkns :: Tkns -> Doc
+ppTkns = vcat.(map ppTkn)
+
+ppTkn :: Tkn -> Doc
+ppTkn (Tkn pos tkn) = ppTkn_ tkn <+> ppPos pos
+    where ppPos (l,c) = text "at" <+> text "line:" <+> int l <+>
+                        text "col:" <+> int c
+
+ppTkn_ :: Tkn_ -> Doc
+ppTkn_ (TknInt i)  = text "Int:"        <+> int i
+ppTkn_ (TknStr s)  = text "String:"     <+> text s
+ppTkn_ (TknId  s)  = text "Id:"         <+> text s
+ppTkn_ (TknAssgn)  = text "Operator:"   <+> text ":="
+ppTkn_ (TknColon)  = text "Operator:"   <+> text ":"
+ppTkn_ (TknLPar)   = text "Separator:"  <+> text "("
+ppTkn_ (TknRPar)   = text "Separator:"  <+> text ")"
+ppTkn_ (TknLBrk)   = text "Separator:"  <+> text "["
+ppTkn_ (TknRBrk)   = text "Separator:"  <+> text "]"
+ppTkn_ (TknOper c) = text "Operator:"   <+> char c
+ppTkn_ (TknCond s) = text "Coditional:" <+> text s
+ppTkn_ (TknResWrd s) = text "Reserved Word:" <+> text s
+ppTkn_ (TknEOL)    = text "<EOL>"
+ppTkn_ (TknEOF)    = text "<EOF>"
diff --git a/src/Language/EWE/VM.hs b/src/Language/EWE/VM.hs
--- a/src/Language/EWE/VM.hs
+++ b/src/Language/EWE/VM.hs
@@ -5,17 +5,22 @@
 import Language.EWE.Utils(emptyProg, equates, stms)
 import qualified Data.List as L
 import qualified Data.Maybe as M
+import qualified Data.Map.Strict as Map
 import Control.Monad.Trans.State.Lazy
 import Control.Monad.Trans.Class(lift)
 import Data.Char (ord,chr)
 import System.IO(hFlush, stdout,hPutStrLn,hPutStr)
 import System.Exit(exitWith,ExitCode(..))
 
-type Memory = [(Int,Int)]
+-- type Memory = [(Int,Int)]
+type Memory = Map.Map Int Int
 
 emptyMemory :: Memory
-emptyMemory = []
+emptyMemory = Map.empty
 
+-- emptyMemory :: Memory
+-- emptyMemory = []
+
 type PC = Int
 
 initPC :: PC
@@ -51,11 +56,17 @@
 mRef (MRefI i) _  = i
 mRef (MRefId s) m = M.fromMaybe (error $ "Internal error: memory reference " ++ s ++ " not found ") $ L.lookup s m
 
+-- outMem :: Int -> Memory -> (Memory,Int)
+-- outMem r m = M.maybe ((r,0):m, 0) ((,) m) (L.lookup r m)
+
 outMem :: Int -> Memory -> (Memory,Int)
-outMem r m = M.maybe ((r,0):m, 0) (\i -> (m,i)) (L.lookup r m)
+outMem r m = M.maybe (Map.insert r 0 m, 0) ((,) m) (Map.lookup r m)
 
+-- inMem :: Int -> Int -> Memory -> Memory
+-- inMem i v m = (i,v):m
+
 inMem :: Int -> Int -> Memory -> Memory
-inMem i v m = (i,v):m
+inMem = Map.insert
 
 incrPC :: StateVM -> Int
 incrPC state = (pc state) + 1
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -8,9 +8,11 @@
 import Data.Version(Version(..), showVersion)
 import System.Exit(exitSuccess)
 import System.Console.GetOpt
+import Text.PrettyPrint(Doc(..),render,empty)
 import Data.Maybe(fromMaybe)
 import Control.Monad(when)
 import Language.EWE.Token
+import Language.EWE.TokenUtils
 import Language.EWE.Scanner
 import Language.EWE.Parser
 import Language.EWE.AbsSyn
@@ -67,17 +69,17 @@
 showScannerOutput scanout =
    case scanout of
       Left err   -> hPutStrLn stderr $ "Scanner error: " ++ show err
-      Right tkns -> hPutStrLn stdout $ show tkns
+      Right tkns -> hPutStrLn stdout $ ppTokens tkns
 
-showParserOutput :: Either String Prog -> IO ()
-showParserOutput parseout =
-    case parseout of
-       Left  msg  ->  hPutStrLn stderr $ show msg
-       Right prog ->  hPutStrLn stdout $ show prog
+showParserOutput :: (Bool,(String,Doc)) -> IO ()
+showParserOutput (False,(msg,_))   =
+ do hPutStrLn stderr $ show msg
+showParserOutput (True,(_,doc))  =
+ do hPutStrLn stdout $ render doc
 
 showHelp :: IO ()
 showHelp = do
-  mapM_ (hPutStrLn stderr) (lines $ usageInfo header options) 
+  mapM_ (hPutStrLn stderr) (lines $ usageInfo header options)
   exitSuccess
   where header = "Usage: ewe [OPTION...] files..."
 
@@ -96,10 +98,10 @@
   s    <- hGetContents fh
   let  scanout = runAlex s alexExec
        pRes   = pEWE s
-       errorParser           = either (\_ -> True)  (\_ -> False) pRes
-       (passGrammar,errGram) = either (\_ -> (False,[])) checkGrammar  pRes
+       errorParser                 = either (\_ -> True)  (\_ -> False) pRes
+       ckg@(passGrammar,(errGram,doc)) = either (\_ -> (False,([],empty))) checkGrammar pRes
   when (optScanOut opts)               (showScannerOutput scanout)
-  when (optParserOut opts)             (showParserOutput pRes)
+  when (optParserOut opts)             (showParserOutput ckg)
   when (not passGrammar)               (showErrorGrammar errGram)
   when (optNoExec opts && passGrammar) (execProg opts errorParser pRes)
   hClose fh
@@ -108,18 +110,18 @@
 showErrorGrammar msg = do
    hPutStrLn stderr $ show msg
 
-checkGrammar :: Prog -> (Bool,String)
+checkGrammar :: Prog -> (Bool,(String,Doc))
 checkGrammar prog = let inh = Inh_Prog
                         syn = wrap_Prog (sem_Prog prog) inh
                     in case (res_Syn_Prog syn) of
-                         Left msg -> (False, msg)
-                         Right () -> (True, [])
+                         Left msg -> (False, (msg, empty))
+                         Right () -> (True, ([], pp_Syn_Prog syn))
 
 processStaticOptions :: Options -> IO ()
 processStaticOptions opts =
   if optShowVersion opts
   then do hPutStrLn stdout $ "ewe version: " ++ (showVersion version)
-          exitSuccess          
+          exitSuccess
   else if optShowHelp opts
        then showHelp
        else return ()
