Enable support for custom functions

This commit is contained in:
Bartłomiej Pluta
2019-07-01 17:56:45 +02:00
parent df56013334
commit c266e5b28e
2 changed files with 36 additions and 12 deletions

View File

@@ -244,21 +244,48 @@ def rollup(parser):
elem = parser(input, node)
return node.children[0] if len(node.children) > 0 else None
return _rollup
def rollStatement(input, parent):
node = Node(None, (-1, -1))
stmt = parseStatement(input, node)
while stmt is not None:
node.append(stmt)
stmt = parseStatement(input, node)
return node.children[0]
def parseFunctionDefinition(input, parent):
if input.current().type == TokenType.FUNCTION:
token = input.current()
input.ahead()
assertToken(TokenType.IDENTIFIER, input)
identifier = parseIdentifier(input, parent)
assertToken(TokenType.OPEN_PAREN, input)
args = parseList(input, parent)
assertToken(TokenType.OPEN_BRACKET, input)
body = parseBlock(input, parent)
function = FunctionDefinitionNode(identifier, args, body, parent, token.pos)
identifier.parent = function
args.parent = function
body.parent = function
return function
return None
def parseReturn(input, parent):
if input.current().type == TokenType.RETURN:
token = input.current()
input.ahead()
expr = parseExpression(input, parent)
node = ReturnNode(expr, parent, token.pos)
expr.parent = node
return node
return None
def parseStatement(input, parent):
value = runParsers(input, parent, [
parseBlock,
parseExpression,
parseFunctionDefinition,
parseReturn
])
return value
@@ -324,6 +351,6 @@ def parseToken(input, parent):
def parse(input):
root = Program()
while input.notParsedTokensRemain():
while input.hasCurrent():
root.append(parseToken(input, root))
return root

View File

@@ -43,9 +43,6 @@ class Tokens:
self.cursor = self.snapshot
return self.tokens[self.cursor]
def notParsedTokensRemain(self):
return self.cursor < len(self.tokens)
def __str__(self):
return f"[Cursor: {self.cursor}\n{', '.join([str(token) for token in self.tokens])}]"