X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=src%2Fparse.icl;h=75eed4194d01a25df0b532a8405f440896668ee0;hb=e9aeda311db78b06a23aa398e18f687cccd67d0d;hp=355ed6a002df0657b8e1628017574490bfd7d7c6;hpb=83c1b3ef201e51264439958e1121e8b24d6b3fea;p=cc1516.git diff --git a/src/parse.icl b/src/parse.icl index 355ed6a..75eed41 100644 --- a/src/parse.icl +++ b/src/parse.icl @@ -22,7 +22,11 @@ parser (Right r) = case runParser parseProgram r of (Left e, _) = Left $ toString e parseProgram :: Parser Token AST -parseProgram = parseVarDecl >>= \t.pure $ AST [t] [] +parseProgram = some parseVarDecl + >>= \vd->some parseFunDecl >>= \fd->pure $ AST vd fd + +parseFunDecl :: Parser Token FunDecl +parseFunDecl = empty parseVarDecl :: Parser Token VarDecl parseVarDecl = @@ -45,13 +49,23 @@ parseType = empty parseExpr :: Parser Token Expr -parseExpr = parseOps (trans1 ColonToken BiCons) parseBinOrExpr +parseExpr = + parseOps (trans1 ColonToken BiCons) $ + parseOps (trans1 PipesToken BiOr) $ + parseOps (trans1 AmpersandsToken BiAnd) $ + parseOps (trans1 EqualsToken BiEquals <|> + trans1 LesserToken BiLesser <|> + trans1 BiggerToken BiGreater <|> + trans1 LesserEqToken BiLesserEq <|> + trans1 GreaterEqToken BiGreaterEq <|> + trans1 NotEqualToken BiUnEqual) $ + parseOps (trans1 PlusToken BiPlus <|> + trans1 DashToken BiMinus) $ + parseOps (trans1 StarToken BiTimes <|> + trans1 SlashToken BiDivide <|> + trans1 PercentToken BiMod) $ + parseBasicExpr where - //Dit generaliseert het onderstaande, ik moet het nog even in elkaar - //sleutelen. Dan werkt bindingssterkte, associativiteit moet nog - // Wat je hier boven ziet wordt dan een cascade van operators met op - // het einde de parseBasicExpr. In volgorde van bindingssterkte, de - // zwaktste eerst... parseOps :: (Parser Token Op2) (Parser Token Expr) -> Parser Token Expr parseOps ops prev = prev >>= \e1->optional ( ops >>= \op->parseOps ops prev >>= \e->pure (op, e) @@ -59,59 +73,6 @@ parseExpr = parseOps (trans1 ColonToken BiCons) parseBinOrExpr Nothing = e1 (Just (op, e2)) = Op2Expr e1 op e2 - parseBinOrExpr :: Parser Token Expr - parseBinOrExpr = - parseBinAndExpr >>= \e1-> optional ( - trans1 PipesToken BiOr - >>= \op->parseBinOrExpr >>= \e->pure (op, e)) - >>= \moe->pure case moe of - Nothing = e1 - (Just (op, e2)) = Op2Expr e1 op e2 - - parseBinAndExpr :: Parser Token Expr - parseBinAndExpr = - parseCompareExpr >>= \e1-> optional ( - trans1 AmpersandsToken BiAnd - >>= \op->parseBinAndExpr >>= \e->pure (op, e)) - >>= \moe->pure case moe of - Nothing = e1 - (Just (op, e2)) = Op2Expr e1 op e2 - - parseCompareExpr :: Parser Token Expr - parseCompareExpr = - parsePlusMinusExpr >>= \e1-> optional ( - ( trans1 EqualsToken BiEquals <|> - trans1 LesserToken BiLesser <|> - trans1 BiggerToken BiGreater <|> - trans1 LesserEqToken BiLesserEq <|> - trans1 GreaterEqToken BiGreaterEq <|> - trans1 NotEqualToken BiUnEqual - ) >>= \op->parseCompareExpr >>= \e->pure (op, e)) - >>= \moe->pure case moe of - Nothing = e1 - (Just (op, e2)) = Op2Expr e1 op e2 - - parsePlusMinusExpr :: Parser Token Expr - parsePlusMinusExpr = - parseTimesDivExpr >>= \e1-> optional ( - ( trans1 PlusToken BiPlus <|> - trans1 DashToken BiMinus - ) >>= \op->parsePlusMinusExpr >>= \e->pure (op, e)) - >>= \moe->pure case moe of - Nothing = e1 - (Just (op, e2)) = Op2Expr e1 op e2 - - parseTimesDivExpr :: Parser Token Expr - parseTimesDivExpr = - parseBasicExpr >>= \e1->optional ( - ( trans1 StarToken BiTimes <|> - trans1 SlashToken BiDivide <|> - trans1 PercentToken BiMod - ) >>= \op->parseTimesDivExpr >>= \e->pure (op, e)) - >>= \moe-> pure case moe of - Nothing = e1 - (Just (op, e2)) = Op2Expr e1 op e2 - parseBasicExpr :: Parser Token Expr parseBasicExpr = (satTok BraceOpenToken *> parseExpr <* satTok BraceCloseToken) <|>