aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Eval.hs6
-rw-r--r--src/Helper.hs5
-rw-r--r--src/Parser.hs24
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