From d64ad9aedac4314ef1df016f3883b1bac70cc494 Mon Sep 17 00:00:00 2001 From: sudoer777 Date: Sun, 8 Oct 2023 00:23:13 -0500 Subject: [PATCH] Parse printInt instead of print --- example/1.hear | 2 +- src/Main/LLVMGen.hs | 2 +- src/Main/Parser/Megaparsec.hs | 31 +++++++++++++++++++++++++++++-- src/Main/Types.hs | 3 ++- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/example/1.hear b/example/1.hear index 62b1f81..a948a80 100644 --- a/example/1.hear +++ b/example/1.hear @@ -1 +1 @@ -print(5*(3-2)+-4-4); \ No newline at end of file +printInt(5*(3-2)+-4-4); \ No newline at end of file diff --git a/src/Main/LLVMGen.hs b/src/Main/LLVMGen.hs index 57b8ed8..65306f2 100644 --- a/src/Main/LLVMGen.hs +++ b/src/Main/LLVMGen.hs @@ -81,7 +81,7 @@ statementToLLVM :: ) => T.Statement -> m Operand -statementToLLVM (T.Print e) = mdo +statementToLLVM (T.PrintInt e) = mdo val <- intExprToLLVM e printf <- getOperand "printf" formatStr <- getString "%d\n" diff --git a/src/Main/Parser/Megaparsec.hs b/src/Main/Parser/Megaparsec.hs index ec90c9f..dc49b3d 100644 --- a/src/Main/Parser/Megaparsec.hs +++ b/src/Main/Parser/Megaparsec.hs @@ -54,11 +54,38 @@ intExprTable = intExpr :: Parser M.Int intExpr = makeExprParser intExprTerm intExprTable -binaryOp :: Text -> (a -> a -> a) -> Operator (ParsecT Void Text Data.Functor.Identity.Identity) a +-- boolExprTerm :: ParsecT Void Text Data.Functor.Identity.Identity M.Bool +-- boolExprTerm = +-- choice +-- [ M.Bool True <$ string "true", +-- M.Bool False <$ string "false", +-- parens boolExpr +-- ] + +-- boolExprTable :: [[Operator Parser (Either M.Bool M.Int)]] +-- boolExprTable = +-- [ [ binaryOp "<" (M.IntOrdCmp M.LT), +-- binaryOp "<=" (M.IntOrdCmp M.LTE), +-- binaryOp ">" (M.IntOrdCmp M.GT), +-- binaryOp ">=" (M.IntOrdCmp M.GTE) +-- ], +-- [ binaryOp "==" (M.IntOrdCmp M.Eq), +-- binaryOp "!=" (M.IntOrdCmp M.Neq) +-- ] +-- ] + +-- boolExpr :: Parser M.Bool +-- boolExpr = makeExprParser boolExprTerm boolExprTable + binaryOp name f = InfixL $ f <$ symbol name statement :: Parser M.Statement -statement = string "print" *> (M.Print <$> parens intExpr) <* symbol ";" +statement = + choice + [ string "printInt" *> (M.PrintInt <$> parens intExpr) + -- ,string "printBool" *> (M.PrintBool <$> parens boolExpr) + ] + <* symbol ";" parseStatements :: Text -> Either (ParseErrorBundle Text Void) [M.Statement] parseStatements = MP.parse (C.space *> many statement <* eof) "" diff --git a/src/Main/Types.hs b/src/Main/Types.hs index 81a33d4..182b0db 100644 --- a/src/Main/Types.hs +++ b/src/Main/Types.hs @@ -30,4 +30,5 @@ data Bool | BoolEq EqOp Bool Bool -- (BinExpr EqOp Bool Bool) data Statement - = Print Int \ No newline at end of file + = PrintInt Int + | PrintBool Bool \ No newline at end of file