Enable support for custom functions
This commit is contained in:
45
Parser.py
45
Parser.py
@@ -244,21 +244,48 @@ def rollup(parser):
|
|||||||
elem = parser(input, node)
|
elem = parser(input, node)
|
||||||
return node.children[0] if len(node.children) > 0 else None
|
return node.children[0] if len(node.children) > 0 else None
|
||||||
return _rollup
|
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):
|
def parseStatement(input, parent):
|
||||||
value = runParsers(input, parent, [
|
value = runParsers(input, parent, [
|
||||||
parseBlock,
|
parseBlock,
|
||||||
parseExpression,
|
parseExpression,
|
||||||
|
parseFunctionDefinition,
|
||||||
|
parseReturn
|
||||||
])
|
])
|
||||||
|
|
||||||
return value
|
return value
|
||||||
@@ -324,6 +351,6 @@ def parseToken(input, parent):
|
|||||||
|
|
||||||
def parse(input):
|
def parse(input):
|
||||||
root = Program()
|
root = Program()
|
||||||
while input.notParsedTokensRemain():
|
while input.hasCurrent():
|
||||||
root.append(parseToken(input, root))
|
root.append(parseToken(input, root))
|
||||||
return root
|
return root
|
||||||
|
|||||||
@@ -43,9 +43,6 @@ class Tokens:
|
|||||||
self.cursor = self.snapshot
|
self.cursor = self.snapshot
|
||||||
return self.tokens[self.cursor]
|
return self.tokens[self.cursor]
|
||||||
|
|
||||||
def notParsedTokensRemain(self):
|
|
||||||
return self.cursor < len(self.tokens)
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"[Cursor: {self.cursor}\n{', '.join([str(token) for token in self.tokens])}]"
|
return f"[Cursor: {self.cursor}\n{', '.join([str(token) for token in self.tokens])}]"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user