Refactor LeftAssociativeOperatorNode
This commit is contained in:
@@ -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()
|
||||
@@ -12,7 +12,7 @@ class IdentifierNode(LeftAssociativeOperatorNode):
|
||||
self.children = [None]
|
||||
|
||||
@classmethod
|
||||
def _literalParser(cls):
|
||||
def _lhsParser(cls):
|
||||
return Parser.oneOf(
|
||||
IdentifierNode._functionCallParser(),
|
||||
IdentifierNode._assignmentParser(),
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
@@ -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()
|
||||
@@ -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())
|
||||
)
|
||||
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user