Create term precendence level

This commit is contained in:
Bartłomiej Pluta
2019-07-10 22:05:45 +02:00
parent 29820fb2ee
commit 1d573c8c80
7 changed files with 24 additions and 11 deletions

View File

@@ -13,5 +13,6 @@ itemParser = Parser.oneOf(
AtomParser,
)
ChainParser = Parser.leftAssociativeOperatorParser(itemParser, [TokenType.DOT], itemParser, lambda left, op, right: Chain.withValues(left, op, right))
ChainParser = Parser.leftAssociativeOperatorParser(itemParser, [TokenType.DOT], itemParser,
lambda left, op, right: Chain.withValues(left, op, right))

View File

@@ -55,7 +55,7 @@ class ExpressionNode(Node):
from smnp.ast.node.note import NoteLiteralNode
from smnp.ast.node.bool import BoolLiteralNode
from smnp.ast.node.identifier import IdentifierNode
from smnp.ast.node.list import ListNode
from smnp.ast.node.list import List
from smnp.ast.node.map import MapNode
from smnp.ast.node.type import TypeNode
@@ -66,6 +66,6 @@ class ExpressionNode(Node):
BoolLiteralNode.parse,
IdentifierNode.parse,
MapNode.parse,
ListNode.parse,
List.parse,
TypeNode.parse,
)

View File

@@ -8,4 +8,5 @@ class Factor(BinaryOperator):
pass
FactorParser = Parser.leftAssociativeOperatorParser(ChainParser, [TokenType.DOUBLE_ASTERISK], ChainParser, lambda left, op, right: Factor.withValues(left, op, right))
FactorParser = Parser.leftAssociativeOperatorParser(ChainParser, [TokenType.DOUBLE_ASTERISK], ChainParser,
lambda left, op, right: Factor.withValues(left, op, right))

View File

@@ -4,9 +4,9 @@ from smnp.ast.node.model import Node
from smnp.token.type import TokenType
class ListNode(Node):
class List(Node):
pass
ListParser = abstractIterableParser(ListNode, TokenType.OPEN_SQUARE, TokenType.CLOSE_SQUARE,
AtomParser) #TODO -> zamienić na expr czy coś
ListParser = abstractIterableParser(List, TokenType.OPEN_SQUARE, TokenType.CLOSE_SQUARE,
AtomParser) #TODO -> zamienić na expr czy coś

View File

@@ -1,5 +1,5 @@
from smnp.ast.node.factor import FactorParser
from smnp.ast.node.model import Node, ParseResult
from smnp.ast.node.term import TermParser
from smnp.ast.parser import Parser
@@ -15,7 +15,7 @@ def parse(input):
#TODO -> temporary (to remove):
FactorParser
TermParser
)(input)
if result.result:

11
smnp/ast/node/term.py Normal file
View File

@@ -0,0 +1,11 @@
from smnp.ast.node.factor import FactorParser
from smnp.ast.node.operator import BinaryOperator
from smnp.ast.parser import Parser
from smnp.token.type import TokenType
class Term(BinaryOperator):
pass
TermParser = Parser.leftAssociativeOperatorParser(FactorParser, [TokenType.ASTERISK, TokenType.SLASH], FactorParser,
lambda left, op, right: Term.withValues(left, op, right))

View File

@@ -4,7 +4,7 @@ from smnp.ast.node.bool import BoolLiteralNode
from smnp.ast.node.identifier import IdentifierNode
from smnp.ast.node.integer import IntegerLiteralNode
from smnp.ast.node.invocation import FunctionCallNode
from smnp.ast.node.list import ListNode
from smnp.ast.node.list import List
from smnp.ast.node.map import MapNode
from smnp.ast.node.note import NoteLiteralNode
from smnp.ast.node.operator import LeftAssociativeOperatorNode
@@ -38,7 +38,7 @@ def expressionEvaluator(doAssert=False):
Evaluator.forNodes(BoolEvaluator.evaluate, BoolLiteralNode),
Evaluator.forNodes(TypeEvaluator.evaluate, TypeNode),
Evaluator.forNodes(IdentifierEvaluator.evaluate, IdentifierNode),
Evaluator.forNodes(ListEvaluator.evaluate, ListNode),
Evaluator.forNodes(ListEvaluator.evaluate, List),
Evaluator.forNodes(AccessEvaluator.evaluate, LeftAssociativeOperatorNode),
Evaluator.forNodes(AssignmentEvaluator.evaluate, AssignmentNode),
Evaluator.forNodes(AsteriskEvaluator.evaluate, AsteriskNode),