Fix EQ and NE not parsing
parent
f436c6bc71
commit
20c20b58b7
|
@ -2,4 +2,7 @@ printInt(5*(3-2)+-4-4);
|
||||||
printBool(true);
|
printBool(true);
|
||||||
printBool(false);
|
printBool(false);
|
||||||
printBool(5 * 3 >= 5 + 9);
|
printBool(5 * 3 >= 5 + 9);
|
||||||
printBool(5*(3-2)+-4-4 < -3);
|
printBool(5*(3-2)+-4-4 < -3);
|
||||||
|
printBool(5 == 5);
|
||||||
|
printBool(5 == 6);
|
||||||
|
printBool(5 != 5);
|
|
@ -16,7 +16,7 @@ import Data.String.Conversions
|
||||||
import Data.Text
|
import Data.Text
|
||||||
import LLVM (moduleLLVMAssembly, withModuleFromAST)
|
import LLVM (moduleLLVMAssembly, withModuleFromAST)
|
||||||
import LLVM.AST hiding (function)
|
import LLVM.AST hiding (function)
|
||||||
import LLVM.AST.IntegerPredicate (IntegerPredicate (SGE, SGT, SLE, SLT))
|
import LLVM.AST.IntegerPredicate
|
||||||
import LLVM.AST.Type
|
import LLVM.AST.Type
|
||||||
import LLVM.AST.Type qualified as AST
|
import LLVM.AST.Type qualified as AST
|
||||||
import LLVM.Context
|
import LLVM.Context
|
||||||
|
@ -147,6 +147,14 @@ boolExprToLLVM (T.IntOrdCmp T.LTE a b) = mdo
|
||||||
lhs <- intExprToLLVM a
|
lhs <- intExprToLLVM a
|
||||||
rhs <- intExprToLLVM b
|
rhs <- intExprToLLVM b
|
||||||
icmp SLE lhs rhs
|
icmp SLE lhs rhs
|
||||||
|
boolExprToLLVM (T.IntEq T.EQ a b) = mdo
|
||||||
|
lhs <- intExprToLLVM a
|
||||||
|
rhs <- intExprToLLVM b
|
||||||
|
icmp LLVM.AST.IntegerPredicate.EQ lhs rhs
|
||||||
|
boolExprToLLVM (T.IntEq T.NE a b) = mdo
|
||||||
|
lhs <- intExprToLLVM a
|
||||||
|
rhs <- intExprToLLVM b
|
||||||
|
icmp LLVM.AST.IntegerPredicate.NE lhs rhs
|
||||||
|
|
||||||
llvmGen :: [T.Statement] -> IO ByteString
|
llvmGen :: [T.Statement] -> IO ByteString
|
||||||
llvmGen expr = do
|
llvmGen expr = do
|
||||||
|
|
|
@ -62,40 +62,35 @@ intOrdCmpExpr = do
|
||||||
[ M.GTE <$ string ">=" <* C.space,
|
[ M.GTE <$ string ">=" <* C.space,
|
||||||
M.LTE <$ string "<=" <* C.space,
|
M.LTE <$ string "<=" <* C.space,
|
||||||
M.GT <$ string ">" <* C.space,
|
M.GT <$ string ">" <* C.space,
|
||||||
-- M.Eq <$ string "==",
|
|
||||||
-- M.Neq <$ string "!=",
|
|
||||||
M.LT <$ string "<" <* C.space
|
M.LT <$ string "<" <* C.space
|
||||||
]
|
]
|
||||||
c <- intExpr
|
c <- intExpr
|
||||||
return (a, b, c)
|
return (a, b, c)
|
||||||
|
|
||||||
|
intEqExpr :: ParsecT Void Text Data.Functor.Identity.Identity (M.EqOp, M.Int, M.Int)
|
||||||
|
intEqExpr = do
|
||||||
|
b <- intExpr
|
||||||
|
a <-
|
||||||
|
choice
|
||||||
|
[ M.EQ <$ string "==" <* C.space,
|
||||||
|
M.NE <$ string "!=" <* C.space
|
||||||
|
]
|
||||||
|
c <- intExpr
|
||||||
|
return (a, b, c)
|
||||||
|
|
||||||
uncurry3 :: (a -> b -> c -> d) -> (a, b, c) -> d
|
uncurry3 :: (a -> b -> c -> d) -> (a, b, c) -> d
|
||||||
uncurry3 f (x, y, z) = f x y z
|
uncurry3 f (x, y, z) = f x y z
|
||||||
|
|
||||||
boolExprTerm :: ParsecT Void Text Data.Functor.Identity.Identity M.Bool
|
boolExprTerm :: ParsecT Void Text Data.Functor.Identity.Identity M.Bool
|
||||||
boolExprTerm =
|
boolExprTerm =
|
||||||
choice
|
choice
|
||||||
[ uncurry3 M.IntOrdCmp <$> intOrdCmpExpr,
|
[ try (uncurry3 M.IntOrdCmp <$> intOrdCmpExpr),
|
||||||
|
uncurry3 M.IntEq <$> intEqExpr,
|
||||||
M.Bool True <$ string "true",
|
M.Bool True <$ string "true",
|
||||||
M.Bool False <$ string "false",
|
M.Bool False <$ string "false",
|
||||||
parens boolExprTerm
|
parens boolExprTerm
|
||||||
]
|
]
|
||||||
|
|
||||||
-- boolExprTable :: [[Operator Parser M.Bool]]
|
|
||||||
-- 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
|
binaryOp name f = InfixL $ f <$ symbol name
|
||||||
|
|
||||||
statement :: Parser M.Statement
|
statement :: Parser M.Statement
|
||||||
|
|
|
@ -13,7 +13,7 @@ import qualified Prelude as P
|
||||||
|
|
||||||
data ArithOp = Add | Sub | Mul | Div deriving (P.Show)
|
data ArithOp = Add | Sub | Mul | Div deriving (P.Show)
|
||||||
|
|
||||||
data EqOp = Eq | Neq deriving (P.Show)
|
data EqOp = EQ | NE deriving (P.Show)
|
||||||
|
|
||||||
data OrdCmpOp = GT | GTE | LT | LTE deriving (P.Show)
|
data OrdCmpOp = GT | GTE | LT | LTE deriving (P.Show)
|
||||||
|
|
||||||
|
|
Reference in New Issue