From c266e5b28e6b5a449035f2edef5261c57e8ad5f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Mon, 1 Jul 2019 17:56:45 +0200 Subject: [PATCH] Enable support for custom functions --- Parser.py | 45 ++++++++++++++++++++++++++++++++++++--------- Tokenizer.py | 3 --- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/Parser.py b/Parser.py index c8d314a..fff9660 100644 --- a/Parser.py +++ b/Parser.py @@ -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 diff --git a/Tokenizer.py b/Tokenizer.py index 5aaf9b9..730eadc 100644 --- a/Tokenizer.py +++ b/Tokenizer.py @@ -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])}]"