Refactor LeftAssociativeOperatorNode
This commit is contained in:
@@ -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()
|
||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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"))
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
)
|
)
|
||||||
@@ -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()
|
||||||
@@ -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())
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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()
|
||||||
Reference in New Issue
Block a user