From ab2cba643dfb22a0f0e6f1d548cbf997a81c7a97 Mon Sep 17 00:00:00 2001 From: bunny Date: Sun, 7 Sep 2025 15:26:42 +0100 Subject: [PATCH] added while looping construct --- app/Compiler.hs | 20 ++++++++++++++++++++ app/Parser.hs | 11 +++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/app/Compiler.hs b/app/Compiler.hs index 7855c4e..cacf8ff 100644 --- a/app/Compiler.hs +++ b/app/Compiler.hs @@ -154,6 +154,26 @@ handleSymbol h (ZorthASTIfElse (ifBranch,elseBranch)) = do put $ Environment l'' state liftIO $ hPutStr h $ ".L"<>l2<>":\n" +handleSymbol h (ZorthASTWhile (condition,body)) = do + (Environment l state) <- get + let bodyl = show $ l+1 + let conditionl = show $ l+2 + let restl = show $ l+3 + put $ Environment (l+3) state + liftIO $ hPutStrLn h $ " jmp .L"<>conditionl + liftIO $ hPutStrLn h $ ".L"<>bodyl<>":" + compileZorthASTState h body + (Environment l' _) <- get + put $ Environment l' state + liftIO $ hPutStrLn h $ "\n.L"<>conditionl<>":" + compileZorthASTState h condition + (Environment l'' _) <- get + put $ Environment l'' state + liftIO $ hPutStrLn h $ " pop rax" + liftIO $ hPutStrLn h $ " cmp rax,0" + liftIO $ hPutStrLn h $ " jg .L"<>bodyl + liftIO $ hPutStrLn h $ ".L"<>restl<>":" + truthOperator :: Handle -> String -> IO () truthOperator h s = hPutStr h $ diff --git a/app/Parser.hs b/app/Parser.hs index 6cedafb..33fc461 100644 --- a/app/Parser.hs +++ b/app/Parser.hs @@ -11,6 +11,7 @@ data ZorthExpr = ZorthASTInteger Int | ZorthASTWord String | ZorthASTWordDecl (String,ZorthAST) | ZorthASTIfElse (ZorthAST,ZorthAST) + | ZorthASTWhile (ZorthAST,ZorthAST) deriving Show word1 :: Parser String @@ -41,7 +42,6 @@ pZorthInteger :: Parser ZorthExpr pZorthInteger = do skipNonsenseSymbols i <- pZorthSignedInteger <|> pZorthUnsignedInteger - eof <|> void nonsenseSymbol return i pZorthWord :: Parser ZorthExpr @@ -64,8 +64,15 @@ pZorthIfElse = do elseBranch <- manyTill pZorthExpr (do { ZorthASTWord "fi" <- pZorthWord; return () }) return $ ZorthASTIfElse (ifBranch,elseBranch) +pZorthWhile :: Parser ZorthExpr +pZorthWhile = do + ZorthASTWord "begin" <- pZorthWord + condition <- manyTill pZorthExpr (do { ZorthASTWord "while" <- pZorthWord; return () }) + body <- manyTill pZorthExpr (do { ZorthASTWord "repeat" <- pZorthWord; return () }) + return $ ZorthASTWhile (condition,body) + pZorthExpr :: Parser ZorthExpr -pZorthExpr = pZorthIfElse <|> pZorthWordDecl <++ pZorthInteger <++ pZorthWord +pZorthExpr = pZorthWhile <|> pZorthIfElse <|> pZorthWordDecl <++ pZorthInteger <++ pZorthWord pZorth :: Parser ZorthAST pZorth = some pZorthExpr