Refactor ExpressionParser

This commit is contained in:
Bartłomiej Pluta
2019-07-11 19:43:18 +02:00
parent b80710798b
commit 5a1d568e8e
7 changed files with 31 additions and 38 deletions

View File

@@ -1,4 +1,4 @@
from smnp.ast.node.expression import MaxPrecedenceExpressionParser
from smnp.ast.node.expression import ExpressionParser
from smnp.ast.node.model import Node
from smnp.ast.node.none import NoneNode
from smnp.ast.node.statement import StatementParser
@@ -48,7 +48,7 @@ def IfElseStatementParser(input):
ifStatementParser = Parser.allOf(
Parser.terminalParser(TokenType.IF),
Parser.terminalParser(TokenType.OPEN_PAREN),
MaxPrecedenceExpressionParser,
ExpressionParser,
Parser.terminalParser(TokenType.CLOSE_PAREN),
StatementParser,
createNode=lambda _, __, condition, ___, ifStatement: IfElse.createNode(ifStatement, condition),
@@ -58,7 +58,7 @@ def IfElseStatementParser(input):
ifElseStatementParser = Parser.allOf(
Parser.terminalParser(TokenType.IF),
Parser.terminalParser(TokenType.OPEN_PAREN),
MaxPrecedenceExpressionParser,
ExpressionParser,
Parser.terminalParser(TokenType.CLOSE_PAREN),
StatementParser,
Parser.terminalParser(TokenType.ELSE),

View File

@@ -10,54 +10,47 @@ class Expression(Valuable):
def ExpressionParser(input):
return Parser.leftAssociativeOperatorParser(
expr1 = Parser.leftAssociativeOperatorParser(
TermParser,
[TokenType.PLUS, TokenType.MINUS],
TermParser,
lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))
)(input)
)
def Expression2Parser(input):
return Parser.leftAssociativeOperatorParser(
ExpressionParser,
expr2 = Parser.leftAssociativeOperatorParser(
expr1,
[TokenType.RELATION],
ExpressionParser,
expr1,
lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))
)(input)
)
def Expression3Parser(input):
return Parser.leftAssociativeOperatorParser(
Expression2Parser,
expr3 = Parser.leftAssociativeOperatorParser(
expr2,
[TokenType.AND],
Expression2Parser,
expr2,
lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))
)(input)
)
def Expression4Parser(input):
from smnp.ast.node.condition import IfElse
exprParser = Parser.leftAssociativeOperatorParser(
Expression3Parser,
expr4 = Parser.leftAssociativeOperatorParser(
expr3,
[TokenType.OR],
Expression3Parser,
expr3,
lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))
)
ifElseExpression = Parser.allOf(
exprParser,
expr4,
Parser.terminalParser(TokenType.IF),
Expression4Parser,
expr4,
Parser.terminalParser(TokenType.ELSE),
Expression4Parser,
expr4,
createNode=lambda ifNode, _, condition, __, elseNode: IfElse.createNode(ifNode, condition, elseNode)
)
return Parser.oneOf(
ifElseExpression,
exprParser,
expr4,
)(input)
MaxPrecedenceExpressionParser = Expression4Parser

View File

@@ -17,7 +17,7 @@ class Loop(BinaryOperator):
def FactorParser(input):
from smnp.ast.node.expression import MaxPrecedenceExpressionParser
from smnp.ast.node.expression import ExpressionParser
from smnp.ast.node.statement import StatementParser
powerFactor = Parser.leftAssociativeOperatorParser(
@@ -30,7 +30,7 @@ def FactorParser(input):
exprFactor = Parser.allOf(
Parser.terminalParser(TokenType.OPEN_PAREN),
MaxPrecedenceExpressionParser,
ExpressionParser,
Parser.terminalParser(TokenType.CLOSE_PAREN),
createNode=lambda open, expr, close: expr,
name="grouping parentheses"

View File

@@ -1,5 +1,5 @@
from smnp.ast.node.atom import Atom
from smnp.ast.node.expression import MaxPrecedenceExpressionParser
from smnp.ast.node.expression import ExpressionParser
from smnp.ast.node.iterable import abstractIterableParser
from smnp.ast.node.model import Node
from smnp.ast.node.none import NoneNode
@@ -54,14 +54,14 @@ def IdentifierParser(input):
functionCallParser = Parser.allOf(
identifierLiteralParser,
abstractIterableParser(ArgumentsList, TokenType.OPEN_PAREN, TokenType.CLOSE_PAREN, MaxPrecedenceExpressionParser),
abstractIterableParser(ArgumentsList, TokenType.OPEN_PAREN, TokenType.CLOSE_PAREN, ExpressionParser),
createNode=lambda name, arguments: FunctionCall.withChildren(name, arguments)
)
assignmentParser = Parser.allOf(
identifierLiteralParser,
Parser.terminalParser(TokenType.ASSIGN, createNode=Operator.withValue),
MaxPrecedenceExpressionParser,
ExpressionParser,
createNode=lambda identifier, assign, expr: Assignment.withValues(identifier, assign, expr)
)

View File

@@ -8,6 +8,6 @@ class List(Node):
def ListParser(input):
from smnp.ast.node.expression import MaxPrecedenceExpressionParser
from smnp.ast.node.expression import ExpressionParser
return abstractIterableParser(List, TokenType.OPEN_SQUARE, TokenType.CLOSE_SQUARE,
MaxPrecedenceExpressionParser)(input)
ExpressionParser)(input)

View File

@@ -30,9 +30,9 @@ class Map(Node):
def MapParser(input):
from smnp.ast.node.expression import MaxPrecedenceExpressionParser
from smnp.ast.node.expression import ExpressionParser
keyParser = LiteralParser
valueParser = MaxPrecedenceExpressionParser
valueParser = ExpressionParser
mapEntryParser = Parser.allOf(
keyParser,

View File

@@ -1,4 +1,3 @@
from smnp.ast.node.expression import MaxPrecedenceExpressionParser
from smnp.ast.node.model import Node
from smnp.ast.parser import Parser
@@ -10,11 +9,12 @@ class Statement(Node):
def StatementParser(input):
from smnp.ast.node.block import BlockParser
from smnp.ast.node.condition import IfElseStatementParser
from smnp.ast.node.expression import ExpressionParser
parser = Parser.oneOf(
IfElseStatementParser,
BlockParser,
MaxPrecedenceExpressionParser
ExpressionParser
)
return Parser(parser, "statement", parser)(input)