aboutsummaryrefslogtreecommitdiff
path: root/ProgramParser.hs
diff options
context:
space:
mode:
Diffstat (limited to 'ProgramParser.hs')
-rw-r--r--ProgramParser.hs39
1 files changed, 24 insertions, 15 deletions
diff --git a/ProgramParser.hs b/ProgramParser.hs
index 411e063..a25de6e 100644
--- a/ProgramParser.hs
+++ b/ProgramParser.hs
@@ -190,28 +190,37 @@ pExpression = E.buildExpressionParser optable litparser <?> "expression"
preops <- many pPrefixOp
e <- pParenExpr <|> pENew <|> (mkELit <$> pLiteral)
postops <- many pPostfixOp
- let e' = foldl (\ex op -> case op of
- Left sub -> ESubscript ex sub Nothing
- Right n -> EGet ex n Nothing)
- e postops
- e'' = foldl (\ex pop -> EUn pop ex Nothing) e' preops
- return e''
+ return $ foldl (flip ($)) e (postops ++ preops)
pAsExpression :: Parser AsExpression
pAsExpression = do
n <- pName
- subs <- many $ between (symbol "[") (symbol "]") pExpression
- return $ foldl (\ae expr -> AESubscript ae expr Nothing) (AEVar n Nothing) subs
+ postops <- many pPostfixAsOp
+ return $ foldl (flip ($)) (AEVar n Nothing) postops
-pPrefixOp :: Parser UnaryOp
-pPrefixOp = (symbol "!" >> return UONot) <|>
- (symbol "-" >> return UONeg)
+pPrefixOp :: Parser (Expression -> Expression)
+pPrefixOp = (symbol "!" >> return (\e -> EUn UONot e Nothing)) <|>
+ (symbol "-" >> return (\e -> EUn UONeg e Nothing))
--- Left: subscript; Right: dot-index
-pPostfixOp :: Parser (Either Expression Name)
+pPostfixOp :: Parser (Expression -> Expression)
pPostfixOp =
- (Left <$> between (symbol "[") (symbol "]") pExpression) <|>
- (Right <$> (symbol "." >> pName))
+ (do
+ expr <- between (symbol "[") (symbol "]") pExpression
+ return $ \e -> ESubscript e expr Nothing) <|>
+ (do
+ symbol "."
+ n <- pName
+ return $ \e -> EGet e n Nothing)
+
+pPostfixAsOp :: Parser (AsExpression -> AsExpression)
+pPostfixAsOp =
+ (do
+ expr <- between (symbol "[") (symbol "]") pExpression
+ return $ \ae -> AESubscript ae expr Nothing) <|>
+ (do
+ symbol "."
+ n <- pName
+ return $ \ae -> AEGet ae n Nothing)
pParenExpr :: Parser Expression
pParenExpr = do