Rename TypedVariable to ArgumentDefinitionNode

This commit is contained in:
Bartłomiej Pluta
2019-07-10 00:05:24 +02:00
parent e58282878a
commit 360b686a8f
4 changed files with 49 additions and 47 deletions

View File

@@ -33,6 +33,8 @@ PITCH_MODIFIER = 'b' | '#'
<argdeflist> ::= '(' ')' | '(' <typedVariable> <argdeflist> <argdeflist> ::= '(' ')' | '(' <typedVariable> <argdeflist>
<argdeflist> ::= <typedVariable> ', ' <argdeflist> | ')' <argdeflist> ::= <typedVariable> ', ' <argdeflist> | ')'
<argdef> = <type> <typeSpecifier>? <identifier> '...'? | <typeSpecifier> <identifier> '...'?
<typedVariable> ::= <type> <typeSpecifier>? <identifier> <typedVariable> ::= <type> <typeSpecifier>? <identifier>
<map> ::= '{' '}' | '{' <mapEntry> <mapTail> <map> ::= '{' '}' | '{' <mapEntry> <mapTail>

View File

@@ -1,10 +1,11 @@
from smnp.ast.node.block import BlockNode from smnp.ast.node.block import BlockNode
from smnp.ast.node.expression import ExpressionNode
from smnp.ast.node.identifier import IdentifierNode from smnp.ast.node.identifier import IdentifierNode
from smnp.ast.node.iterable import abstractIterableParser 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.variable import TypedVariableNode from smnp.ast.node.type import TypeNode
from smnp.ast.parser import Parser from smnp.ast.parser import Parser
from smnp.token.type import TokenType from smnp.token.type import TokenType
@@ -16,6 +17,48 @@ 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 ArgumentDefinitionNode(ExpressionNode):
def __init__(self, pos):
super().__init__(pos)
self.children.append(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
@classmethod
def parser(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"),
createNode=createNode
)
@classmethod
def _parse(cls, input):
#TODO
raise RuntimeError("Not implemented yet. There is still required work to correctly build AST related to IdentifierNode")
class FunctionDefinitionNode(StatementNode): class FunctionDefinitionNode(StatementNode):
def __init__(self, pos): def __init__(self, pos):
super().__init__(pos) super().__init__(pos)
@@ -64,4 +107,4 @@ class FunctionDefinitionNode(StatementNode):
@staticmethod @staticmethod
def _argumentsDeclarationParser(): def _argumentsDeclarationParser():
return abstractIterableParser(ArgumentsDeclarationNode, TokenType.OPEN_PAREN, TokenType.CLOSE_PAREN, TypedVariableNode.parser()) return abstractIterableParser(ArgumentsDeclarationNode, TokenType.OPEN_PAREN, TokenType.CLOSE_PAREN, ArgumentDefinitionNode.parser())

View File

@@ -1,46 +1,3 @@
from smnp.ast.node.expression import ExpressionNode
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
class TypedVariableNode(ExpressionNode):
def __init__(self, pos):
super().__init__(pos)
self.children.append(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
@classmethod
def parser(cls):
def createNode(type, variable):
node = TypedVariableNode(type.pos)
node.type = type
node.variable = variable
return node
return Parser.allOf(
TypeNode.parse,
Parser.doAssert(IdentifierNode.identifierParser(), "variable name"),
createNode=createNode
)
@classmethod
def _parse(cls, input):
#TODO
raise RuntimeError("Not implemented yet. There is still required work to correctly build AST related to IdentifierNode")

View File

@@ -1,6 +1,6 @@
from smnp.ast.node.function import ArgumentDefinitionNode
from smnp.ast.node.none import NoneNode from smnp.ast.node.none import NoneNode
from smnp.ast.node.ret import ReturnNode from smnp.ast.node.ret import ReturnNode
from smnp.ast.node.variable import TypedVariableNode
from smnp.error.runtime import RuntimeException from smnp.error.runtime import RuntimeException
from smnp.function.signature import signature from smnp.function.signature import signature
from smnp.runtime.evaluator import Evaluator, evaluate from smnp.runtime.evaluator import Evaluator, evaluate
@@ -45,7 +45,7 @@ def argumentsNodeToMethodSignature(node):
sign = [] sign = []
for child in node.children: for child in node.children:
if type(child) == TypedVariableNode: if type(child) == ArgumentDefinitionNode:
if type(child.type.specifiers) == NoneNode: if type(child.type.specifiers) == NoneNode:
sign.append(ofType(child.type.type)) sign.append(ofType(child.type.type))
elif child.type.type == Type.LIST and len(child.type.specifiers) == 1: elif child.type.type == Type.LIST and len(child.type.specifiers) == 1: