From fd638c3c6fe7db6098db382ee4d7daefbb7ab07b Mon Sep 17 00:00:00 2001 From: ik1g19 <ik1g19@soton.ac.uk> Date: Sun, 3 Jan 2021 22:38:24 +0000 Subject: [PATCH] progress on challenge 4 --- cw/src/Challenges.hs | 63 +++++++++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/cw/src/Challenges.hs b/cw/src/Challenges.hs index cca5fb0..b53ad3a 100644 --- a/cw/src/Challenges.hs +++ b/cw/src/Challenges.hs @@ -278,8 +278,8 @@ prettyPrint (LamDef ms e) = exprBrackets e --applies brackets to expr if needed exprBrackets :: LamExpr -> String -exprBrackets e | expr str == e = str --omit brackets - | otherwise = "(" + str ++ ")" --include brackets +exprBrackets e | fst (head (parse expr str)) == e = str --omit brackets + | otherwise = "(" ++ str ++ ")" --include brackets where str = exprToStr e @@ -318,36 +318,63 @@ ex3'4 = LamDef [ ("F", LamAbs 1 (LamVar 1) ) ] (LamAbs 2 (LamApp (LamAbs 1 (LamV parseLamMacro :: String -> Maybe LamMacroExpr -parseLamMacro _ = Nothing +parseLamMacro str | parsed == [] = Nothing + | otherwise = Just parsed + where + parsed = fst (head (parse (macroExpr []) str)) --HEAD WILL NOT WORK + + +macroExpr :: [ (String,LamExpr) ] -> Parser LamMacroExpr +macroExpr ms = do string "def" + name <- token macroName + symbol "=" + e <- token expr + token $ string "in" + macros <- macroExpr $ ms ++ [(name,e)] + return $ macros + <|> do e <- token expr + return $ LamDef ms e -macroExpr :: Parse LamMacroExpr -macroExpr = do string "def" - name <- token macroName - symbol "=" - e <- token expr - string "in" - macro <- many macroExpr - return $ LamDef [(name,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 {x <- var; return $ LamVar x} - do {name <- macroName;return $ LamMacro name} <|> + <|> do {name <- macroName;return $ LamMacro name} - do e1 <- expr + <|> do e1 <- expr space e2 <- expr - return $ LamApp e1 e2 <|> + return $ LamApp e1 e2 - do char '\' + <|> do char '\\' x <- var symbol "->" e <- expr - return $ LamAbs x e <|> + return $ LamAbs x e - do char '(' + <|> do char '(' e <- token expr char ')' return e -- GitLab