add boolean comparison and equality operators

This commit is contained in:
darkf 2013-10-23 15:05:47 -07:00
parent 767e3eedab
commit 0800608479
3 changed files with 24 additions and 1 deletions

4
ast.hs
View File

@ -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

View File

@ -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

View File

@ -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