diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Eval.hs | 6 | ||||
-rw-r--r-- | src/Helper.hs | 5 | ||||
-rw-r--r-- | src/Parser.hs | 24 |
3 files changed, 26 insertions, 9 deletions
diff --git a/src/Eval.hs b/src/Eval.hs index 6b165b2..445e41d 100644 --- a/src/Eval.hs +++ b/src/Eval.hs @@ -67,7 +67,10 @@ evalApp f g sub = ) evalInfix :: Expression -> String -> Expression -> Environment -> Program (Failable Expression) -evalInfix le i re = evalExp $ Application (Application (Variable i) le) re +evalInfix le i re = evalExp $ Application (Application (Variable $ "(" ++ i ++ ")") le) re + +evalPrefix :: String -> Expression -> Environment -> Program (Failable Expression) +evalPrefix p e = evalExp $ Application (Variable $ p ++ "(") e evalExp :: Expression -> Environment -> Program (Failable Expression) evalExp idx@(Bruijn _ ) = const $ pure $ Right idx @@ -75,6 +78,7 @@ evalExp ( Variable var) = evalVar var evalExp ( Abstraction e) = evalAbs e evalExp ( Application f g) = evalApp f g evalExp (Infix le i re) = evalInfix le i re +evalExp (Prefix p e) = evalPrefix p e evalDefine :: String -> Expression -> Environment -> Program (Failable Expression) diff --git a/src/Helper.hs b/src/Helper.hs index 66fe265..eb41673 100644 --- a/src/Helper.hs +++ b/src/Helper.hs @@ -89,7 +89,7 @@ printBundle ParseErrorBundle {..} = <> pointer <> "\n" -data Expression = Bruijn Int | Variable String | Abstraction Expression | Application Expression Expression | Infix Expression String Expression +data Expression = Bruijn Int | Variable String | Abstraction Expression | Application Expression Expression | Infix Expression String Expression | Prefix String Expression deriving (Ord, Eq) data Instruction = Define String Expression [Instruction] | Evaluate Expression | Comment | Import String String | Test Expression Expression | ContextualInstruction Instruction String deriving (Show) @@ -100,7 +100,8 @@ instance Show Expression where show (Application exp1 exp2) = "\ESC[33m(\ESC[0m" <> show exp1 <> " " <> show exp2 <> "\ESC[33m)\ESC[0m" show (Infix le i re) = - show le <> "\ESC[95m(" <> i <> ")" <> "\ESC[0m" <> show re + show le <> " \ESC[95m(" <> i <> ")" <> "\ESC[0m " <> show re + show (Prefix p e) = "\ESC[95m" <> p <> show e <> "\ESC[0m" type EnvDef = (String, Expression) -- TODO: Add EvalConf to EnvState? diff --git a/src/Parser.hs b/src/Parser.hs index ddf09fb..44bae87 100644 --- a/src/Parser.hs +++ b/src/Parser.hs @@ -18,13 +18,18 @@ sc :: Parser () sc = void $ char ' ' infixOperator :: Parser String -infixOperator = some $ oneOf "!?*@+$%^&<>/|=" +infixOperator = some $ oneOf "!?*@:+-#$%^&<>/|~=" + +prefixOperator :: Parser String +prefixOperator = some $ oneOf "!?*@:+-#$%^&<>/|~=" -- def identifier disallows the import prefix dots defIdentifier :: Parser String defIdentifier = ((:) <$> (letterChar <|> char '_') <*> many (alphaNumChar <|> oneOf "?!'_-")) - <|> parens infixOperator + <|> ((\l i r -> [l] ++ i ++ [r]) <$> char '(' <*> infixOperator <*> char ')' + ) + <|> ((\p i -> p ++ [i]) <$> prefixOperator <*> char '(') <?> "defining identifier" -- TODO: write as extension to defIdentifier @@ -53,7 +58,7 @@ parseAbstraction = do -- one or more singletons wrapped in coupled application parseApplication :: Parser Expression parseApplication = do - s <- sepEndBy1 parseSingleton sc + s <- sepEndBy1 (try parsePrefix <|> parseSingleton) sc pure $ foldl1 Application s parseBruijn :: Parser Expression @@ -63,7 +68,7 @@ parseBruijn = do parseNumeral :: Parser Expression parseNumeral = do - num <- number <?> "signed number" + num <- parens number <?> "signed number" pure $ decimalToTernary num where sign :: Parser (Integer -> Integer) @@ -104,6 +109,12 @@ parseInfix = do e2 <- parseSingleton pure $ Infix e1 i e2 +parsePrefix :: Parser Expression +parsePrefix = do + p <- prefixOperator + e <- parseSingleton + pure $ Prefix p e + parseSingleton :: Parser Expression parseSingleton = parseBruijn @@ -114,10 +125,11 @@ parseSingleton = <|> try (parens parseInfix <?> "enclosed infix expr") <|> (parens parseApplication <?> "enclosed application") <|> parseVariable + <|> parsePrefix parseExpression :: Parser Expression parseExpression = do - e <- try parseInfix <|> parseApplication + e <- try parseInfix <|> try parseApplication <|> parsePrefix pure e <?> "expression" parseEvaluate :: Parser Instruction @@ -199,6 +211,6 @@ parseBlock lvl = try parseCommentBlock <|> parseDefBlock lvl parseReplLine :: Parser Instruction parseReplLine = try parseReplDefine - <|> try parseEvaluate <|> try parseImport <|> try parseTest + <|> try parseEvaluate |