From: Mart Lubbers Date: Sat, 27 Feb 2016 19:27:57 +0000 (+0100) Subject: update bindingssterkte X-Git-Url: https://git.martlubbers.net/?a=commitdiff_plain;h=83c1b3ef201e51264439958e1121e8b24d6b3fea;p=cc1516.git update bindingssterkte --- diff --git a/src/grammar.txt b/src/grammar.txt index ca25bb0..697cca2 100644 --- a/src/grammar.txt +++ b/src/grammar.txt @@ -1,14 +1,25 @@ - ::= ['hd'|'tl'|'fst'|'snd] - | - | - | - | 'False' - | 'True' - | '(' ')' - | '(' [] ')' - | '[]' - | '(' ',' ')' - ::= | e + ::= + + + ::= '+' + + ::= ['%' ] + + ::= [('+' | '-') ] + + ::= ['*' | '/' | '%'] ] + + ::= ['hd'|'tl'|'fst'|'snd] + | + | + | + | 'False' + | 'True' + | '(' ')' + | '(' [] ')' + | '[]' + | '(' ',' ')' + ::= '+' | '-' | '*' | '/' | '%' | '==' | '<' | '>' | '<=' | '>=' | '!=' | '&&' | '||' | ':' diff --git a/src/parse.icl b/src/parse.icl index 620e39a..355ed6a 100644 --- a/src/parse.icl +++ b/src/parse.icl @@ -45,45 +45,101 @@ parseType = empty parseExpr :: Parser Token Expr -parseExpr = - (satTok BraceOpenToken *> parseExpr <* satTok BraceCloseToken) <|> - (satTok BraceOpenToken *> parseExpr <* satTok CommaToken - >>= \e1->parseExpr <* satTok BraceCloseToken - >>= \e2->pure $ TupleExpr e1 e2) <|> - trans1 EmptyListToken EmptyListExpr <|> - trans2 TrueToken (const $ BoolExpr True) <|> - trans2 FalseToken (const $ BoolExpr True) <|> - trans2 (NumberToken zero) (\(NumberToken i)->IntExpr i) <|> - trans2 (CharToken zero) (\(CharToken c)->CharExpr c) <|> - (parseOp1 >>= \o->parseExpr >>= \e.pure $ Op1Expr o e) <|> - (parseIdent <* satTok BraceOpenToken - >>= \i->parseActArgs <* satTok BraceCloseToken - >>= \es->pure $ FunExpr i es) <|> - (parseIdent >>= \i. parseFieldSelector >>= \f.pure $ VarExpr i f) - //TODO Parse Binary operators +parseExpr = parseOps (trans1 ColonToken BiCons) parseBinOrExpr + 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) + ) >>= \moe-> pure case moe of + 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) <|> + (satTok BraceOpenToken *> parseExpr <* satTok CommaToken + >>= \e1->parseExpr <* satTok BraceCloseToken + >>= \e2->pure $ TupleExpr e1 e2) <|> + trans1 EmptyListToken EmptyListExpr <|> + trans2 TrueToken (const $ BoolExpr True) <|> + trans2 FalseToken (const $ BoolExpr True) <|> + trans2 (NumberToken zero) (\(NumberToken i)->IntExpr i) <|> + trans2 (CharToken zero) (\(CharToken c)->CharExpr c) <|> + (parseOp1 >>= \o->parseExpr >>= \e.pure $ Op1Expr o e) <|> + (parseIdent <* satTok BraceOpenToken + >>= \i->parseActArgs <* satTok BraceCloseToken + >>= \es->pure $ FunExpr i es) <|> + (parseIdent >>= \i. parseFieldSelector >>= \f.pure $ VarExpr i f) parseActArgs :: Parser Token [Expr] parseActArgs = - //One argument - (some (parseExpr <* satTok CommaToken) >>= \es->parseExpr >>= \e.pure [e:es]) <|> - //Two or more arguments + (some (parseExpr <* satTok CommaToken) >>= \es->parseExpr + >>= \e.pure [e:es]) <|> (parseExpr >>= \e->pure [e]) <|> - //Zero arguments, dit moet nog mooier kunnen empty parseOp1 :: Parser Token Op1 parseOp1 = trans1 DashToken UnMinus <|> trans1 ExclamationToken UnNegation -parseOp2 :: Parser Token Op2 -parseOp2 = trans1 StarToken BiTimes <|> trans1 SlashToken BiDivide <|> - trans1 PercentToken BiMod <|> trans1 EqualsToken BiEquals <|> - trans1 LesserToken BiLesser <|> trans1 BiggerToken BiGreater <|> - trans1 LesserEqToken BiLesserEq <|> trans1 PlusToken BiPlus <|> - trans1 GreaterEqToken BiGreaterEq <|> trans1 DashToken BiMinus <|> - trans1 NotEqualToken BiUnEqual <|> trans1 AmpersandsToken BiAnd <|> - trans1 PipesToken BiOr <|> trans1 ColonToken BiCons - parseFieldSelector :: Parser Token (Maybe FieldSelector) parseFieldSelector = optional (satTok DotToken *> ( (parseIdent >>= (\i.if (i == "hd") (pure FieldHd) empty)) <|>