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
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]
@classmethod
def _literalParser(cls):
def _lhsParser(cls):
return Parser.oneOf(
IdentifierNode._functionCallParser(),
IdentifierNode._assignmentParser(),

View File

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

View File

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

View File

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

View File

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

View File

@@ -10,4 +10,8 @@ class NoteLiteralNode(LiteralNode, LeftAssociativeOperatorNode):
@classmethod
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 Parser.leftAssociativeOperatorParser(
cls._literalParser(),
cls._lhsParser(),
TokenType.DOT,
cls._parseAccessingProperty(),
cls._rhsParser(),
createNode=createNode
)(input)
@classmethod
def _literalParser(cls):
pass
def _lhsParser(cls):
raise RuntimeError(f"LHS parser is not implemented in {cls.__name__}")
@staticmethod
def _parseAccessingProperty():
def _rhsParser():
from smnp.ast.node.identifier import IdentifierNode
return Parser.oneOf(
IdentifierNode._literalParser(),
# TODO!!!
IdentifierNode._lhsParser(),
IdentifierNode._functionCallParser(),
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
def _getTokenType(cls):
return TokenType.STRING
return TokenType.STRING
@classmethod
def _lhsParser(cls):
return cls.literalParser()