Minor improvements

This commit is contained in:
Ivy 2021-01-29 00:47:53 +01:00
parent 24ed67ae71
commit fd39ca4129
2 changed files with 15 additions and 11 deletions

View File

@ -8,17 +8,18 @@ type Proc = String
type Args = [Expr]
eval :: Expr -> Expr
eval (IntE x) = IntE x
eval (VarE v) = VarE v
eval (DefinitionE v exp) = NilE
eval (ProcedureE p args) = apply p args
eval NilE = NilE
eval (IntE x) = IntE x
eval (VarE v) = VarE v
eval (DefinitionE v exp) = NilE
eval (ProcedureE p args) = apply p args
eval NilE = NilE
apply :: Proc -> Args -> Expr
apply p args
| p == "+" = builtinPlus $ map eval args
-- TODO: create a separated file for builtinProcs
-- TODO: create a BuiltinProc or something like that in data Expr, and make + a builtin proc
-- TODO: create enviroments
builtinPlus :: [Expr] -> Expr
builtinPlus [IntE x, IntE y] = IntE $ x + y

View File

@ -9,11 +9,14 @@ import ExprType
parseExpression :: String -> Either ParseError Expr
parseExpression s = do
tokns <- parse parseTokens "lexical error" s
expr <- parse parseExpressionFromTokens "parsing error" tokns
expr <- parse expressionFromTokens "parsing error" tokns
return expr
parseExpressionFromTokens :: GenParser Token st Expr
parseExpressionFromTokens = intE <|> try defineE <|> try nilE <|> varE <|> procedureE
expressionFromTokens :: GenParser Token st Expr
expressionFromTokens = do
expr <- intE <|> try defineE <|> try nilE <|> varE <|> procedureE
_ <- eof
return expr
intE :: GenParser Token st Expr
intE = do
@ -24,7 +27,7 @@ procedureE :: GenParser Token st Expr
procedureE = do
_ <- parseLeftParenT
(VarT p) <- parseVarT
args <- many parseExpressionFromTokens
args <- many expressionFromTokens
_ <- parseRightParenT
return $ ProcedureE p args
@ -43,7 +46,7 @@ defineE = do
_ <- parseLeftParenT
_ <- parseDefineT
(VarT var) <- parseVarT
expr <- parseExpressionFromTokens
expr <- expressionFromTokens
_ <- parseRightParenT
return $ DefinitionE var expr