Add support for 'extend' statement

This commit is contained in:
Bartłomiej Pluta
2019-07-12 00:28:33 +02:00
parent f459873574
commit ee91dbec8a
3 changed files with 72 additions and 71 deletions

View File

@@ -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
# )
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)

View File

@@ -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)

View File

@@ -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)