From 35b17357b5b55e73c6bbc59e7dae094412b7b02a Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Sat, 2 Sep 2017 10:18:40 +0200 Subject: Fully support structs --- ProgramParser.hs | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) (limited to 'ProgramParser.hs') 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 -- cgit v1.2.3-54-g00ecf