X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=parse.icl;h=46a92e3612f39402a186f34f6f2f5f42e6330cd8;hb=f081c2c5e248331eb6e2f090f4afe818fd8259eb;hp=ab575b64db2c00781b9ad6ef339695e9731b36f0;hpb=e34b5f088ff9a86da61afbbe91c2c88f895673c7;p=cc1516.git diff --git a/parse.icl b/parse.icl index ab575b6..46a92e3 100644 --- a/parse.icl +++ b/parse.icl @@ -75,7 +75,10 @@ parseFunType :: Parser Token Type parseFunType = satTok DoubleColonToken *> parseFT where parseFT :: Parser Token Type - parseFT = ((->>) <$> parseType <* satTok ArrowToken <*> parseFT) <|> parseType + parseFT = (liftM2 (->>) (parseSF <* satTok ArrowToken) (parseFT)) <|> + parseSF + parseSF :: Parser Token Type + parseSF = parseBBraces parseFT <|> parseType parseVarDecl :: Parser Token VarDecl parseVarDecl = liftM4 VarDecl @@ -124,8 +127,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) <|> @@ -133,21 +134,24 @@ 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-> + pure $ FunExpr pos ident args fs) <|> (VarExpr pos <$> parseVarDef) parseFunCall :: Parser Token (String, [Expr]) -parseFunCall = tuple <$> parseIdent <*> ( - (parseBBraces $ parseSepList CommaToken parseExpr) <|> pure []) +parseFunCall = liftM2 tuple + parseIdent + (parseBBraces $ parseSepList CommaToken parseExpr) 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))) + (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 @@ -163,7 +167,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)