From ace0e2b31fc5e8c5495c48c9f5d3654de5f42a8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Sat, 6 Jul 2019 22:53:03 +0200 Subject: [PATCH] Enable support for specifying types by angle braces --- smnp/ast/node/type.py | 67 +++++++++++++++++++++++++++++++++++---- smnp/ast/node/variable.py | 4 +-- 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/smnp/ast/node/type.py b/smnp/ast/node/type.py index 98ffc4a..d2a07d1 100644 --- a/smnp/ast/node/type.py +++ b/smnp/ast/node/type.py @@ -1,13 +1,66 @@ from smnp.ast.node.access import AccessNode -from smnp.ast.node.literal import LiteralNode +from smnp.ast.node.iterable import abstractIterableParser +from smnp.ast.node.model import Node +from smnp.ast.parser import Parser from smnp.token.type import TokenType -class TypeNode(LiteralNode, AccessNode): - def __init__(self, pos): - super().__init__(pos) - del self.children[1] +class TypeSpecifier(Node): @classmethod - def _getTokenType(cls): - return TokenType.TYPE \ No newline at end of file + def _parse(cls, input): + return abstractIterableParser(TypeSpecifier, TokenType.OPEN_ANGLE, TokenType.CLOSE_ANGLE, + Parser.doAssert(cls._specifierItem(), "type"))(input) + + @classmethod + def _specifierItem(cls): + return Parser.oneOf( + TypeNode.parse, + cls.parse + ) + + +class TypeNode(AccessNode): + def __init__(self, pos): + super().__init__(pos) + + @property + def type(self): + return self[0] + + @type.setter + def type(self, value): + self[0] = value + + @property + def specifier(self): + return self[1] + + @specifier.setter + def specifier(self, value): + self[1] = value + + @classmethod + def _parse(cls, input): + return Parser.oneOf( + cls._specifiedTypeParser(), + cls._rawTypeParser() + )(input) + + @classmethod + def _specifiedTypeParser(cls): + def createNode(type, specifier): + node = TypeNode(type.pos) + node.type = type.value + node.specifier = specifier + return node + + return Parser.allOf( + cls._rawTypeParser(), + TypeSpecifier.parse, + createNode=createNode + ) + + @classmethod + def _rawTypeParser(cls): + return Parser.terminalParser(TokenType.TYPE, lambda val, pos: TypeNode.withValue(val, pos)) \ No newline at end of file diff --git a/smnp/ast/node/variable.py b/smnp/ast/node/variable.py index 8fc5ef6..68b830f 100644 --- a/smnp/ast/node/variable.py +++ b/smnp/ast/node/variable.py @@ -3,7 +3,7 @@ from smnp.ast.node.identifier import IdentifierNode from smnp.ast.node.none import NoneNode from smnp.ast.node.type import TypeNode from smnp.ast.parser import Parser -from smnp.token.type import TokenType + class TypedVariableNode(ExpressionNode): def __init__(self, pos): @@ -35,7 +35,7 @@ class TypedVariableNode(ExpressionNode): return node return Parser.allOf( - Parser.terminalParser(TokenType.TYPE, lambda val, pos: TypeNode.withValue(val, pos)), + TypeNode.parse, Parser.doAssert(IdentifierNode.identifierParser(), "variable name"), createNode=createNode )