From ee91dbec8a55fb6c00ff0226d98b2c3a14caa043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Fri, 12 Jul 2019 00:28:33 +0200 Subject: [PATCH] Add support for 'extend' statement --- smnp/ast/node/extend.py | 138 +++++++++++++++++++------------------- smnp/ast/node/function.py | 3 +- smnp/ast/node/program.py | 2 + 3 files changed, 72 insertions(+), 71 deletions(-) diff --git a/smnp/ast/node/extend.py b/smnp/ast/node/extend.py index 8bdd382..270ec7b 100644 --- a/smnp/ast/node/extend.py +++ b/smnp/ast/node/extend.py @@ -1,70 +1,68 @@ -# from smnp.ast.node.block import BlockNode -# from smnp.ast.node.function import FunctionDefinitionNode -# from smnp.ast.node.identifier import IdentifierNode -# from smnp.ast.node.none import NoneNode -# from smnp.ast.node.statement import StatementNode -# from smnp.ast.node.type import TypeNode -# from smnp.ast.parser import Parser -# from smnp.token.type import TokenType -# -# -# class ExtendNode(StatementNode): -# def __init__(self, pos): -# super().__init__(pos) -# self.children = [NoneNode(), NoneNode(), NoneNode()] -# -# @property -# def type(self): -# return self[0] -# -# @type.setter -# def type(self, value): -# self[0] = value -# -# @property -# def variable(self): -# return self[1] -# -# @variable.setter -# def variable(self, value): -# self[1] = value -# -# @property -# def methods(self): -# return self[2] -# -# @methods.setter -# def methods(self, value): -# self[2] = value -# -# @classmethod -# def _parse(cls, input): -# def createNode(extend, type, asKeyword, variable, methods): -# node = ExtendNode(extend.pos) -# node.type = type -# node.variable = variable -# node.methods = methods -# return node -# -# return Parser.allOf( -# Parser.terminalParser(TokenType.EXTEND), -# Parser.doAssert(TypeNode.parse, "type being extended"), -# Parser.terminalParser(TokenType.AS, doAssert=True), -# Parser.doAssert(IdentifierNode.identifierParser(), "variable name"), -# Parser.doAssert(cls._methodsDeclarationsParser(), "methods declarations"), -# createNode=createNode -# )(input) -# -# @classmethod -# def _methodsDeclarationsParser(cls): -# def createNode(openBracket, items, closeBracket): -# node = BlockNode(openBracket.pos) -# node.children = items -# return node -# -# return Parser.loop( -# Parser.terminalParser(TokenType.OPEN_CURLY), -# Parser.doAssert(FunctionDefinitionNode.parse, f"method declaration or '{TokenType.CLOSE_CURLY.key}'"), -# Parser.terminalParser(TokenType.CLOSE_CURLY), -# createNode=createNode -# ) \ No newline at end of file +from smnp.ast.node.block import Block +from smnp.ast.node.function import FunctionDefinitionParser +from smnp.ast.node.identifier import IdentifierLiteralParser +from smnp.ast.node.model import Node +from smnp.ast.node.none import NoneNode +from smnp.ast.node.type import TypeParser +from smnp.ast.parser import Parser +from smnp.token.type import TokenType + + +class Extend(Node): + def __init__(self, pos): + super().__init__(pos) + self.children = [NoneNode(), NoneNode(), NoneNode()] + + @property + def type(self): + return self[0] + + @type.setter + def type(self, value): + self[0] = value + + @property + def variable(self): + return self[1] + + @variable.setter + def variable(self, value): + self[1] = value + + @property + def methods(self): + return self[2] + + @methods.setter + def methods(self, value): + self[2] = value + + @classmethod + def withValues(cls, pos, type, variable, methods): + node = cls(pos) + node.type = type + node.variable = variable + node.methods = methods + return node + +def ExtendParser(input): + return Parser.allOf( + Parser.terminal(TokenType.EXTEND), + TypeParser, + Parser.terminal(TokenType.AS), + IdentifierLiteralParser, + MethodsDeclarationParser, + createNode=lambda extend, type, _, variable, methods: Extend.withValues(extend.pos, type, variable, methods), + name="extend" + )(input) + + +def MethodsDeclarationParser(input): + return Parser.loop( + Parser.terminal(TokenType.OPEN_CURLY), + FunctionDefinitionParser, + Parser.terminal(TokenType.CLOSE_CURLY), + createNode=lambda open, methods, close: Block.withChildren(methods, open.pos), + name="methods block" + )(input) + diff --git a/smnp/ast/node/function.py b/smnp/ast/node/function.py index 2fe0edd..046f637 100644 --- a/smnp/ast/node/function.py +++ b/smnp/ast/node/function.py @@ -123,5 +123,6 @@ def FunctionDefinitionParser(input): IdentifierLiteralParser, ArgumentsDeclarationParser, BlockParser, - createNode=lambda _, name, args, body: FunctionDefinition.withValues(name, args, body) + createNode=lambda _, name, args, body: FunctionDefinition.withValues(name, args, body), + name="function definition" )(input) diff --git a/smnp/ast/node/program.py b/smnp/ast/node/program.py index 82d88cc..4aa344e 100644 --- a/smnp/ast/node/program.py +++ b/smnp/ast/node/program.py @@ -1,3 +1,4 @@ +from smnp.ast.node.extend import ExtendParser from smnp.ast.node.function import FunctionDefinitionParser from smnp.ast.node.imports import ImportParser from smnp.ast.node.model import Node, ParseResult @@ -17,6 +18,7 @@ def ProgramParser(input): # Start Symbol ImportParser, FunctionDefinitionParser, + ExtendParser, StatementParser, exception=RuntimeError("Nie znam tego wyrazenia") )(input)