Refactor ArgumentDefinitionNode parser

This commit is contained in:
Bartłomiej Pluta
2019-07-10 00:45:17 +02:00
parent 39eaa2b4d5
commit c66d138782

View File

@@ -5,7 +5,7 @@ from smnp.ast.node.iterable import abstractIterableParser
from smnp.ast.node.model import Node from smnp.ast.node.model import Node
from smnp.ast.node.none import NoneNode from smnp.ast.node.none import NoneNode
from smnp.ast.node.statement import StatementNode from smnp.ast.node.statement import StatementNode
from smnp.ast.node.type import TypeNode from smnp.ast.node.type import TypeNode, TypeSpecifier
from smnp.ast.parser import Parser from smnp.ast.parser import Parser
from smnp.token.type import TokenType from smnp.token.type import TokenType
@@ -17,6 +17,10 @@ class ArgumentsDeclarationNode(Node):
raise RuntimeError("This class is not supposed to be automatically called") raise RuntimeError("This class is not supposed to be automatically called")
class VarargNode(Node):
pass
class ArgumentDefinitionNode(ExpressionNode): class ArgumentDefinitionNode(ExpressionNode):
def __init__(self, pos): def __init__(self, pos):
super().__init__(pos) super().__init__(pos)
@@ -46,40 +50,23 @@ class ArgumentDefinitionNode(ExpressionNode):
def vararg(self, value): def vararg(self, value):
self[2] = value self[2] = value
@classmethod
def parser(cls):
return Parser.oneOf(
cls._varargParser(),
cls._normalParser()
)
@classmethod @classmethod
def _varargParser(cls): def parser(cls):
def createNode(type, variable, dots): def createNode(type, variable, dots):
node = ArgumentDefinitionNode(type.pos) node = ArgumentDefinitionNode(type.pos)
node.type = type node.type = type
node.variable = variable node.variable = variable
node.vararg = True node.vararg = isinstance(dots, VarargNode)
return node return node
return Parser.allOf( return Parser.allOf(
TypeNode.parse, Parser.oneOf(
Parser.doAssert(IdentifierNode.identifierParser(), "variable name"), TypeNode.parse,
Parser.terminalParser(TokenType.DOTS), TypeSpecifier.parse
createNode=createNode ),
)
@classmethod
def _normalParser(cls):
def createNode(type, variable):
node = ArgumentDefinitionNode(type.pos)
node.type = type
node.variable = variable
return node
return Parser.allOf(
TypeNode.parse,
Parser.doAssert(IdentifierNode.identifierParser(), "variable name"), Parser.doAssert(IdentifierNode.identifierParser(), "variable name"),
Parser.optional(Parser.terminalParser(TokenType.DOTS, lambda val, pos: VarargNode(pos))),
createNode=createNode createNode=createNode
) )