X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=parse.icl;h=766f1ce92b6d072bcb2fa5e0e2045cb09eb62c5e;hb=b8aaa94f98ffb9bb18d6b1f2ba91ee81f0fdc0b9;hp=a507ab3ae662f53dc51067f7e97caabcfc74b480;hpb=8c4ec1c3287d6c6ddefd22ef608a4d97693e7e85;p=cc1516.git diff --git a/parse.icl b/parse.icl index a507ab3..766f1ce 100644 --- a/parse.icl +++ b/parse.icl @@ -7,9 +7,11 @@ from StdFunc import const, o import Data.Either import Data.Maybe import Data.Functor +import Data.Tuple import Control.Monad import Control.Applicative import Data.Func +import StdMisc from Data.List import intercalate, replicate, instance Functor [] from Text import class Text(concat), instance Text String import GenPrint @@ -25,7 +27,7 @@ parser ts = case runParser parseProgram ts of x = fst x parseProgram :: Parser Token AST -parseProgram = AST <$> (many parseVarDecl) <*> (some parseFunDecl) +parseProgram = AST <$> some parseFunDecl parseFunDecl :: Parser Token FunDecl parseFunDecl = liftM6 FunDecl @@ -39,7 +41,7 @@ parseFunDecl = liftM6 FunDecl parseStmt :: Parser Token Stmt parseStmt = parseIfStmt <|> parseWhileStmt <|> parseSColon parseAssStmt <|> parseSColon parseReturnStmt <|> - (FunStmt <$> parseSColon parseFunCall) + (parseSColon parseFunCall >>= \(ident, args)->pure $ FunStmt ident args) where parseSColon :: (Parser Token a) -> Parser Token a parseSColon p = p <* satTok SColonToken @@ -73,12 +75,14 @@ parseFunType :: Parser Token Type parseFunType = satTok DoubleColonToken *> parseFT where parseFT :: Parser Token Type - parseFT = ((->>) <$> parseType <* satTok ArrowToken <*> parseFT) <|> parseType + parseFT = (liftM2 (->>) + ((parseBBraces parseFT <|> parseType) <* satTok ArrowToken) + parseFT) <|> parseType parseVarDecl :: Parser Token VarDecl parseVarDecl = liftM4 VarDecl peekPos - (parseType <|> trans1 VarToken VarType ) + ((parseType >>= \t->pure $ Just t)<|> trans1 VarToken Nothing) (parseIdent <* satTok AssignmentToken) (parseExpr <* satTok SColonToken) @@ -122,7 +126,8 @@ parseExpr = //Operators in order of binding strength parseBasicExpr :: Parser Token Expr parseBasicExpr = peekPos >>= \pos -> (TupleExpr pos <$> (parseTuple parseExpr)) <|> - (FunExpr pos <$> parseFunCall) <|> + (parseFunCall >>= \(ident, args)->parseFieldSelectors >>= \fs-> + pure $ FunExpr pos ident args fs) <|> parseBBraces parseExpr <|> trans1 EmptyListToken (EmptyListExpr pos) <|> trans1 TrueToken (BoolExpr pos True) <|> @@ -132,18 +137,19 @@ parseExpr = //Operators in order of binding strength (Op1Expr pos <$> parseOp1 <*> parseExpr) <|> (VarExpr pos <$> parseVarDef) -parseFunCall :: Parser Token FunCall -parseFunCall = FunCall <$> parseIdent <*> - (parseBBraces $ parseSepList CommaToken parseExpr) +parseFunCall :: Parser Token (String, [Expr]) +parseFunCall = tuple <$> parseIdent <*> ( + (parseBBraces $ parseSepList CommaToken parseExpr) <|> pure []) parseVarDef :: Parser Token VarDef -parseVarDef = liftM2 VarDef - parseIdent - (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)))) +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))) parseOp1 :: Parser Token Op1 parseOp1 = trans1 DashToken UnMinus <|> trans1 ExclamationToken UnNegation @@ -159,7 +165,7 @@ parseBSqBraces p = satTok SquareOpenToken *> p <* satTok SquareCloseToken parseTuple :: (Parser Token a) -> Parser Token (a, a) parseTuple p = satTok BraceOpenToken *> - (liftM2 (\a->(\b->(a,b))) (p <* satTok CommaToken) p) + (liftM2 tuple (p <* satTok CommaToken) p) <* satTok BraceCloseToken trans :: TokenValue (TokenValue -> a) -> Parser Token (Pos, a)