X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=parse.icl;h=bea680b7db4015e8868a20377aed652e49bbebe4;hb=978dc486bf8c83cf9cad0925e3128574639656e0;hp=004c1f4d071187e3a8c816681ea010b0f161c049;hpb=29d164f53e029e8133e05b599241eb6c14d7fe47;p=cc1516.git diff --git a/parse.icl b/parse.icl index 004c1f4..bea680b 100644 --- a/parse.icl +++ b/parse.icl @@ -41,7 +41,8 @@ parseFunDecl = liftM6 FunDecl parseStmt :: Parser Token Stmt parseStmt = parseIfStmt <|> parseWhileStmt <|> parseSColon parseAssStmt <|> parseSColon parseReturnStmt <|> - (parseSColon parseFunCall >>= \(ident, args)->pure $ FunStmt ident args) + (parseSColon parseFunCall + >>= \(ident, args, fs)->pure $ FunStmt ident args fs) where parseSColon :: (Parser Token a) -> Parser Token a parseSColon p = p <* satTok SColonToken @@ -127,8 +128,6 @@ parseExpr = //Operators in order of binding strength parseBasicExpr :: Parser Token Expr parseBasicExpr = peekPos >>= \pos -> (TupleExpr pos <$> (parseTuple parseExpr)) <|> - (parseFunCall >>= \(ident, args)->parseFieldSelectors >>= \fs-> - pure $ FunExpr pos ident args fs) <|> parseBBraces parseExpr <|> trans1 EmptyListToken (EmptyListExpr pos) <|> trans1 TrueToken (BoolExpr pos True) <|> @@ -136,21 +135,27 @@ parseExpr = //Operators in order of binding strength trans2 (NumberToken zero) (\(NumberToken i)->IntExpr pos i) <|> trans2 (CharToken zero) (\(CharToken c)->CharExpr pos c) <|> (Op1Expr pos <$> parseOp1 <*> parseExpr) <|> + (parseFunCall >>= \(ident, args, fs)-> + pure $ FunExpr pos ident args fs) <|> (VarExpr pos <$> parseVarDef) -parseFunCall :: Parser Token (String, [Expr]) -parseFunCall = tuple <$> parseIdent <*> ( - (parseBBraces $ parseSepList CommaToken parseExpr) <|> pure []) +parseFunCall :: Parser Token (String, [Expr], [FieldSelector]) +parseFunCall = liftM3 (\x y z->(x, y, z)) + parseIdent + (parseBBraces $ parseSepList CommaToken parseExpr) + parseFieldSelectors parseVarDef :: Parser Token VarDef parseVarDef = liftM2 VarDef parseIdent parseFieldSelectors parseFieldSelectors :: Parser Token [FieldSelector] -parseFieldSelectors = many (satTok DotToken *> ( - (parseIdent >>= \i.if (i == "hd") (pure FieldHd) empty) <|> - (parseIdent >>= \i.if (i == "tl") (pure FieldTl) empty) <|> - (parseIdent >>= \i.if (i == "fst") (pure FieldFst) empty) <|> - (parseIdent >>= \i.if (i == "snd") (pure FieldSnd) empty))) +parseFieldSelectors = many (satTok DotToken *> + parseIdent >>= \i->case i of + "hd" = pure FieldHd + "tl" = pure FieldTl + "fst" = pure FieldFst + "snd" = pure FieldSnd + _ = empty) parseOp1 :: Parser Token Op1 parseOp1 = trans1 DashToken UnMinus <|> trans1 ExclamationToken UnNegation