add boolean comparison and equality operators
This commit is contained in:
parent
767e3eedab
commit
0800608479
4
ast.hs
4
ast.hs
|
@ -8,6 +8,10 @@ data AST = Add AST AST
|
|||
| Sub AST AST
|
||||
| Mul AST AST
|
||||
| Div AST AST
|
||||
| Equals AST AST
|
||||
| NotEquals AST AST
|
||||
| LessThan AST AST
|
||||
| GreaterThan AST AST
|
||||
| Block [AST]
|
||||
| FunDef String (Pattern, AST)
|
||||
| Defun String AST
|
||||
|
|
14
interp.hs
14
interp.hs
|
@ -70,6 +70,15 @@ l *$ r = error $ "cannot * " ++ show l ++ " and " ++ show r
|
|||
(IntV l) /$ (IntV r) = IntV (l `div` r)
|
||||
l /$ r = error $ "cannot / " ++ show l ++ " and " ++ show r
|
||||
|
||||
(IntV l) <$ (IntV r) = BoolV (l < r)
|
||||
l <$ r = error $ "cannot < " ++ show l ++ " and " ++ show r
|
||||
|
||||
(IntV l) >$ (IntV r) = BoolV (l > r)
|
||||
l >$ r = error $ "cannot > " ++ show l ++ " and " ++ show r
|
||||
|
||||
l ==$ r = BoolV (l == r)
|
||||
l !=$ r = BoolV (l /= r)
|
||||
|
||||
_putstr (StrV str) = do
|
||||
(handles,_) <- get
|
||||
let stdout_s = head handles
|
||||
|
@ -159,6 +168,11 @@ eval (Sub l r) = do { l <- eval l; r <- eval r; return $ l -$ r }
|
|||
eval (Mul l r) = do { l <- eval l; r <- eval r; return $ l *$ r }
|
||||
eval (Div l r) = do { l <- eval l; r <- eval r; return $ l /$ r }
|
||||
|
||||
eval (Equals l r) = do { l <- eval l; r <- eval r; return $ l ==$ r }
|
||||
eval (NotEquals l r) = do { l <- eval l; r <- eval r; return $ l !=$ r }
|
||||
eval (LessThan l r) = do { l <- eval l; r <- eval r; return $ l <$ r }
|
||||
eval (GreaterThan l r) = do { l <- eval l; r <- eval r; return $ l >$ r }
|
||||
|
||||
eval (Call name arg) = get >>= \(h,env) ->
|
||||
case lookup env name of
|
||||
Just fn@(FnV cls _) -> do
|
||||
|
|
|
@ -18,7 +18,7 @@ languageDef = emptyDef {T.commentStart="{-",
|
|||
T.identStart = letter <|> char '_',
|
||||
T.identLetter = alphaNum <|> char '_',
|
||||
T.reservedNames = ["do", "end"],
|
||||
T.reservedOpNames = ["+", "-", "*", "/"]}
|
||||
T.reservedOpNames = ["+", "-", "*", "/", "==", "!=", "<", ">"]}
|
||||
|
||||
lexer = T.makeTokenParser languageDef
|
||||
exprparser = buildExpressionParser ops term <?> "expression"
|
||||
|
@ -26,6 +26,11 @@ ops = [ [Infix (reservedOp "*" >> return Mul) AssocLeft]
|
|||
, [Infix (reservedOp "/" >> return Div) AssocLeft]
|
||||
, [Infix (reservedOp "+" >> return Add) AssocLeft]
|
||||
, [Infix (reservedOp "-" >> return Sub) AssocLeft]
|
||||
|
||||
, [Infix (reservedOp "==" >> return Equals) AssocLeft]
|
||||
, [Infix (reservedOp "!=" >> return NotEquals) AssocLeft]
|
||||
, [Infix (reservedOp "<" >> return LessThan) AssocLeft]
|
||||
, [Infix (reservedOp ">" >> return GreaterThan) AssocLeft]
|
||||
]
|
||||
|
||||
identifier = T.identifier lexer
|
||||
|
|
Loading…
Reference in New Issue