68 lines
1.8 KiB
Python
68 lines
1.8 KiB
Python
from smnp.ast.node.expression import ExpressionNode
|
|
from smnp.ast.node.none import NoneNode
|
|
from smnp.ast.parser import Parser
|
|
from smnp.token.type import TokenType
|
|
|
|
|
|
class RelationOperatorNode(ExpressionNode):
|
|
def __init__(self, pos):
|
|
super().__init__(pos)
|
|
self.children = [ NoneNode(), NoneNode(), NoneNode()]
|
|
|
|
@property
|
|
def left(self):
|
|
return self[0]
|
|
|
|
@left.setter
|
|
def left(self, value):
|
|
self[0] = value
|
|
|
|
@property
|
|
def operator(self):
|
|
return self[1]
|
|
|
|
@operator.setter
|
|
def operator(self, value):
|
|
self[1] = value
|
|
|
|
@property
|
|
def right(self):
|
|
return self[2]
|
|
|
|
@right.setter
|
|
def right(self, value):
|
|
self[2] = value
|
|
|
|
@classmethod
|
|
def relationParser(cls):
|
|
def createNode(left, operator, right):
|
|
node = RelationOperatorNode(right.pos)
|
|
node.left = left
|
|
node.operator = operator
|
|
node.right = right
|
|
return node
|
|
|
|
return Parser.leftAssociativeOperatorParser(
|
|
cls._relationLhs(),
|
|
TokenType.EQUAL,
|
|
cls._relationRhs(),
|
|
createNode=createNode
|
|
)
|
|
|
|
@classmethod
|
|
def _relationLhs(cls):
|
|
raise RuntimeError(f"_relationLhs() is not implemented in {cls.__name__} class")
|
|
|
|
@staticmethod
|
|
def _relationRhs():
|
|
from smnp.ast.node.bool import BoolLiteralNode
|
|
from smnp.ast.node.identifier import IdentifierNode
|
|
|
|
from smnp.ast.node.string import StringLiteralNode
|
|
return Parser.doAssert(Parser.oneOf(
|
|
BoolLiteralNode.accessParser(),
|
|
BoolLiteralNode.literalParser(),
|
|
IdentifierNode.parse,
|
|
StringLiteralNode.accessParser(),
|
|
StringLiteralNode.literalParser()
|
|
), "expression") |