58 lines
1.4 KiB
Python
58 lines
1.4 KiB
Python
from smnp.ast.node.model import Node
|
|
from smnp.ast.parser import Parser
|
|
from smnp.token.type import TokenType
|
|
|
|
|
|
class Atom(Node):
|
|
def __init__(self, pos):
|
|
super().__init__(pos)
|
|
self.children = [None]
|
|
|
|
@property
|
|
def value(self):
|
|
return self[0]
|
|
|
|
@value.setter
|
|
def value(self, value):
|
|
self[0] = value
|
|
|
|
@classmethod
|
|
def withValue(cls, value, pos):
|
|
node = cls(pos)
|
|
node.value = value
|
|
return node
|
|
|
|
|
|
class IntegerLiteral(Atom):
|
|
pass
|
|
|
|
|
|
class StringLiteral(Atom):
|
|
pass
|
|
|
|
|
|
class NoteLiteral(Atom):
|
|
pass
|
|
|
|
|
|
class BoolLiteral(Atom):
|
|
pass
|
|
|
|
integerParser = Parser.oneOf(
|
|
Parser.terminalParser(TokenType.INTEGER, lambda val, pos: IntegerLiteral.withValue(int(val), pos)),
|
|
Parser.allOf(
|
|
Parser.terminalParser(TokenType.MINUS),
|
|
Parser.terminalParser(TokenType.INTEGER, lambda val, pos: IntegerLiteral.withValue(int(val), pos)),
|
|
createNode=lambda minus, integer: IntegerLiteral.withValue(-integer.value, minus.pos)
|
|
)
|
|
)
|
|
|
|
parser = Parser.oneOf(
|
|
integerParser,
|
|
Parser.terminalParser(TokenType.STRING, lambda val, pos: StringLiteral.withValue(val, pos)),
|
|
Parser.terminalParser(TokenType.NOTE, lambda val, pos: NoteLiteral.withValue(val, pos)),
|
|
Parser.terminalParser(TokenType.BOOL, lambda val, pos: BoolLiteral.withValue(val, pos)),
|
|
)
|
|
|
|
AtomParser = Parser(parser, "atom", parser)
|