diff --git a/cw/src/Challenges.hs b/cw/src/Challenges.hs
index b53ad3aae8f6de443ca5f8b3d502b689e589c80c..295d931b80e83c88be211c5d25769bb366eeadef 100644
--- a/cw/src/Challenges.hs
+++ b/cw/src/Challenges.hs
@@ -278,10 +278,11 @@ prettyPrint (LamDef ms e) = exprBrackets e
 
 --applies brackets to expr if needed
 exprBrackets :: LamExpr -> String
-exprBrackets e | fst (head (parse expr str)) == e = str                                                                 --omit brackets
-               | otherwise                        = "(" ++ str ++ ")"                                                    --include brackets
+exprBrackets e | foldl1 (||) $ map (e==) parsed   = str                                                         --omit brackets
+               | otherwise                        = "(" ++ str ++ ")"                                           --include brackets
     where
       str = exprToStr e
+      parsed = map fst (parse expr str)                                                                         --possible parsings of str
 
 
 --converts expr to string
@@ -317,11 +318,25 @@ ex3'4 = LamDef [ ("F", LamAbs 1 (LamVar 1) ) ] (LamAbs 2 (LamApp (LamAbs 1 (LamV
 --Digit ::= “0” | “1” | “2” | “3” | “4” | “5” | “6” | “7” | “8” | “9”
 
 
+--MacroExpr ::= "def" MacroName "=" Expr "in" MacroExpr | Expr
+--Expr ::=  Var | MacroName | Applicative | Function | Expression
+--MacroName ::= UChar | UChar MacroName
+--UChar ::= "A" | "B" | ... | "Z"
+--Var ::= “x” Digits
+--Digits ::= Digit | Digit Digits
+--Digit ::= “0” | “1” | “2” | “3” | “4” | “5” | “6” | “7” | “8” | “9”
+
+--Applicative ::= Expr Expr
+--Function ::= “\” Var “->” Expr
+--Expression ::= “(“ Expr “)”
+
+
 parseLamMacro :: String -> Maybe LamMacroExpr
 parseLamMacro str | parsed == [] = Nothing
-                  | otherwise    = Just parsed
+                  | otherwise    = Just $ fstHead parsed
     where
-      parsed = fst (head (parse (macroExpr []) str))                                                      --HEAD WILL NOT WORK
+      parsed = parse (macroExpr []) str
+      fstHead = fst . head
 
 
 macroExpr :: [ (String,LamExpr) ] -> Parser LamMacroExpr
@@ -337,36 +352,16 @@ macroExpr ms = do string "def"
                   return $ LamDef ms e
 
 
-
--- macroExpr :: Parse LamMacroExpr
--- macroExpr = do string "def"
---                name  <- token macroName
---                symbol "="
---                e     <- token expr
---                token $ string "in"
---                macros <- macroLoop
---                return $ LamDef macros
---     where
---       macroLoop :: Parse [(String,LamExpr)]
---       macroLoop = do string "def"
---                      name  <- token macroName
---                      symbol "="
---                      e     <- token expr
---                      token $ string "in"
---                      ms <- many macroExpr
---                      return ((name,e):ms)            <|>
---                   do {e <- token expr;return []}
-
-
 expr :: Parser LamExpr
-expr = do {x    <- var;      return $ LamVar x}
+expr = do terms <- some (token term)
+          return $ foldl1 LamApp terms
 
-   <|> do {name <- macroName;return $ LamMacro name}
 
-   <|> do e1    <- expr
-          space
-          e2    <- expr
-          return $ LamApp e1 e2
+term :: Parser LamExpr
+term = do char '('
+          e     <- token expr
+          char ')'
+          return e
 
    <|> do char '\\'
           x     <- var
@@ -374,10 +369,30 @@ expr = do {x    <- var;      return $ LamVar x}
           e     <- expr
           return $ LamAbs x e
 
-   <|> do char '('
-          e     <- token expr
-          char ')'
-          return e
+   <|> do {x    <- var;      return $ LamVar x}
+
+   <|> do {name <- macroName;return $ LamMacro name}
+
+-- expr :: Parser LamExpr
+-- expr = do e1    <- expr
+--           space
+--           e2    <- expr
+--           return $ LamApp e1 e2
+
+--    <|> do {x    <- var;      return $ LamVar x}
+
+--    <|> do {name <- macroName;return $ LamMacro name}
+
+--    <|> do char '\\'
+--           x     <- var
+--           symbol "->"
+--           e     <- expr
+--           return $ LamAbs x e
+
+--    <|> do char '('
+--           e     <- token expr
+--           char ')'
+--           return e
 
 
 macroName :: Parser String