Refactor LeftAssociativeOperatorNode

This commit is contained in:
Bartłomiej Pluta
2019-07-10 17:02:18 +02:00
parent 214eec0e7a
commit 76eabbff0e
9 changed files with 35 additions and 18 deletions

View File

@@ -10,4 +10,8 @@ class BoolLiteralNode(LiteralNode, LeftAssociativeOperatorNode):
@classmethod @classmethod
def _getTokenType(cls): def _getTokenType(cls):
return TokenType.BOOL return TokenType.BOOL
@classmethod
def _lhsParser(cls):
return cls.literalParser()

View File

@@ -12,7 +12,7 @@ class IdentifierNode(LeftAssociativeOperatorNode):
self.children = [None] self.children = [None]
@classmethod @classmethod
def _literalParser(cls): def _lhsParser(cls):
return Parser.oneOf( return Parser.oneOf(
IdentifierNode._functionCallParser(), IdentifierNode._functionCallParser(),
IdentifierNode._assignmentParser(), IdentifierNode._assignmentParser(),

View File

@@ -9,7 +9,11 @@ class IntegerLiteralNode(LeftAssociativeOperatorNode):
self.children = [None] self.children = [None]
@classmethod @classmethod
def _literalParser(cls): def _lhsParser(cls):
return cls.literalParser()
@classmethod
def literalParser(cls):
return Parser.oneOf( return Parser.oneOf(
cls._negativeIntegerParser(), cls._negativeIntegerParser(),
cls._positiveIntegerParser() cls._positiveIntegerParser()

View File

@@ -8,6 +8,6 @@ from smnp.token.type import TokenType
class ListNode(LeftAssociativeOperatorNode): class ListNode(LeftAssociativeOperatorNode):
@classmethod @classmethod
def _literalParser(cls): def _lhsParser(cls):
return abstractIterableParser(ListNode, TokenType.OPEN_SQUARE, TokenType.CLOSE_SQUARE, return abstractIterableParser(ListNode, TokenType.OPEN_SQUARE, TokenType.CLOSE_SQUARE,
Parser.doAssert(ExpressionNode.parse, "expression")) Parser.doAssert(ExpressionNode.parse, "expression"))

View File

@@ -13,6 +13,6 @@ class LiteralNode(ExpressionNode):
return value return value
@classmethod @classmethod
def _literalParser(cls): def literalParser(cls):
createNode = lambda val, pos: cls.withValue(cls._processValue(val), pos) createNode = lambda val, pos: cls.withValue(cls._processValue(val), pos)
return Parser.terminalParser(cls._getTokenType(), createNode) return Parser.terminalParser(cls._getTokenType(), createNode)

View File

@@ -35,7 +35,7 @@ class MapEntry(ExpressionNode):
class MapNode(LeftAssociativeOperatorNode): class MapNode(LeftAssociativeOperatorNode):
@classmethod @classmethod
def _literalParser(cls): def _lhsParser(cls):
return abstractIterableParser(MapNode, TokenType.OPEN_CURLY, TokenType.CLOSE_CURLY, cls._entryParser()) return abstractIterableParser(MapNode, TokenType.OPEN_CURLY, TokenType.CLOSE_CURLY, cls._entryParser())
@classmethod @classmethod
@@ -56,9 +56,9 @@ class MapNode(LeftAssociativeOperatorNode):
@classmethod @classmethod
def _keyParser(cls): def _keyParser(cls):
return Parser.oneOf( return Parser.oneOf(
IntegerLiteralNode._literalParser(), IntegerLiteralNode.literalParser(),
StringLiteralNode._literalParser(), StringLiteralNode.literalParser(),
NoteLiteralNode._literalParser(), NoteLiteralNode.literalParser(),
BoolLiteralNode._literalParser(), BoolLiteralNode.literalParser(),
TypeNode.parse TypeNode.parse
) )

View File

@@ -10,4 +10,8 @@ class NoteLiteralNode(LiteralNode, LeftAssociativeOperatorNode):
@classmethod @classmethod
def _getTokenType(cls): def _getTokenType(cls):
return TokenType.NOTE return TokenType.NOTE
@classmethod
def _lhsParser(cls):
return cls.literalParser()

View File

@@ -45,22 +45,23 @@ class LeftAssociativeOperatorNode(ExpressionNode):
return node return node
return Parser.leftAssociativeOperatorParser( return Parser.leftAssociativeOperatorParser(
cls._literalParser(), cls._lhsParser(),
TokenType.DOT, TokenType.DOT,
cls._parseAccessingProperty(), cls._rhsParser(),
createNode=createNode createNode=createNode
)(input) )(input)
@classmethod @classmethod
def _literalParser(cls): def _lhsParser(cls):
pass raise RuntimeError(f"LHS parser is not implemented in {cls.__name__}")
@staticmethod @staticmethod
def _parseAccessingProperty(): def _rhsParser():
from smnp.ast.node.identifier import IdentifierNode from smnp.ast.node.identifier import IdentifierNode
return Parser.oneOf( return Parser.oneOf(
IdentifierNode._literalParser(), # TODO!!!
IdentifierNode._lhsParser(),
IdentifierNode._functionCallParser(), IdentifierNode._functionCallParser(),
exception=lambda input: SyntaxException(f"Expected property name or method call, found '{input.current().rawValue}'", input.currentPos()) exception=lambda input: SyntaxException(f"Expected property name or method call, found '{input.current().rawValue}'", input.currentPos())
) )

View File

@@ -10,4 +10,8 @@ class StringLiteralNode(LiteralNode, LeftAssociativeOperatorNode):
@classmethod @classmethod
def _getTokenType(cls): def _getTokenType(cls):
return TokenType.STRING return TokenType.STRING
@classmethod
def _lhsParser(cls):
return cls.literalParser()