Create new type: map (dictionary) with all support for it
This commit is contained in:
@@ -55,11 +55,13 @@ class ExpressionNode(Node):
|
||||
from smnp.ast.node.note import NoteLiteralNode
|
||||
from smnp.ast.node.identifier import IdentifierNode
|
||||
from smnp.ast.node.list import ListNode
|
||||
from smnp.ast.node.map import MapNode
|
||||
|
||||
return Parser.oneOf(
|
||||
IntegerLiteralNode.parse,
|
||||
StringLiteralNode.parse,
|
||||
NoteLiteralNode.parse,
|
||||
IdentifierNode.parse,
|
||||
MapNode.parse,
|
||||
ListNode.parse
|
||||
)
|
||||
59
smnp/ast/node/map.py
Normal file
59
smnp/ast/node/map.py
Normal file
@@ -0,0 +1,59 @@
|
||||
from smnp.ast.node.access import AccessNode
|
||||
from smnp.ast.node.expression import ExpressionNode
|
||||
from smnp.ast.node.integer import IntegerLiteralNode
|
||||
from smnp.ast.node.iterable import abstractIterableParser
|
||||
from smnp.ast.node.none import NoneNode
|
||||
from smnp.ast.node.note import NoteLiteralNode
|
||||
from smnp.ast.node.string import StringLiteralNode
|
||||
from smnp.ast.parser import Parser
|
||||
from smnp.token.type import TokenType
|
||||
|
||||
class MapEntry(ExpressionNode):
|
||||
def __init__(self, pos):
|
||||
super().__init__(pos)
|
||||
self.children = [NoneNode(), NoneNode()]
|
||||
|
||||
@property
|
||||
def key(self):
|
||||
return self[0]
|
||||
|
||||
@key.setter
|
||||
def key(self, value):
|
||||
self[0] = value
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
return self[1]
|
||||
|
||||
@value.setter
|
||||
def value(self, value):
|
||||
self[1] = value
|
||||
|
||||
class MapNode(AccessNode):
|
||||
|
||||
@classmethod
|
||||
def _literalParser(cls):
|
||||
return abstractIterableParser(MapNode, TokenType.OPEN_CURLY, TokenType.CLOSE_CURLY, cls._entryParser())
|
||||
|
||||
@classmethod
|
||||
def _entryParser(cls):
|
||||
def createNode(key, arrow, value):
|
||||
node = MapEntry(key.pos)
|
||||
node.key = key
|
||||
node.value = value
|
||||
return node
|
||||
|
||||
return Parser.allOf(
|
||||
cls._keyParser(),
|
||||
Parser.terminalParser(TokenType.ARROW),
|
||||
ExpressionNode.parse,
|
||||
createNode=createNode
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def _keyParser(cls):
|
||||
return Parser.oneOf(
|
||||
IntegerLiteralNode._literalParser(),
|
||||
StringLiteralNode._literalParser(),
|
||||
NoteLiteralNode._literalParser(),
|
||||
)
|
||||
Reference in New Issue
Block a user