X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=parse.icl;h=bea680b7db4015e8868a20377aed652e49bbebe4;hb=3e6f3b020114be9550bb5893874fdb40b86fa2de;hp=46a92e3612f39402a186f34f6f2f5f42e6330cd8;hpb=6758e36a62b15fea8b7505f58b829ff4ff0ba94e;p=cc1516.git diff --git a/parse.icl b/parse.icl index 46a92e3..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 @@ -134,24 +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)->parseFieldSelectors >>= \fs-> + (parseFunCall >>= \(ident, args, fs)-> pure $ FunExpr pos ident args fs) <|> (VarExpr pos <$> parseVarDef) -parseFunCall :: Parser Token (String, [Expr]) -parseFunCall = liftM2 tuple +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