Moved all AST nodes to a separate module and fixed a bug with unary + operator

This commit is contained in:
2023-04-17 18:36:18 -04:00
parent 70cd50b087
commit 092e2d311e
2 changed files with 146 additions and 138 deletions

120
internal/nodes.py Normal file
View File

@@ -0,0 +1,120 @@
# d888888
# d88P aaa 888 888 888d88 .d88b. 888d88 8888b.
# d88P aaa 888 888 888P d88^^88b 888P 88b
# d88P aaa 888 888 888 888 888 888 .d888888
# d8888888888 Y88b 888 888 Y88..88P 888 888 888
# d88P aaa Y88888 888 Y88P 888 Y888888
# -- Copyright © 2023 Zandercraft. All rights reserved. --
"""
Purpose: Contains all node types for the AST of the language.
"""
class NumberNode:
def __init__(self, token):
self.token = token
self.pos_start = self.token.pos_start
self.pos_end = self.token.pos_end
def __repr__(self):
return f"{self.token}"
class StringNode:
def __init__(self, token):
self.token = token
self.pos_start = self.token.pos_start
self.pos_end = self.token.pos_end
def __repr__(self):
return f'{self.token}'
class VarAccessNode:
def __init__(self, var_name_token):
self.var_name_token = var_name_token
self.pos_start = self.var_name_token.pos_start
self.pos_end = self.var_name_token.pos_end
class VarAssignNode:
def __init__(self, var_name_token, value_node):
self.var_name_token = var_name_token
self.value_node = value_node
self.pos_start = self.var_name_token.pos_start
self.pos_end = self.var_name_token.pos_end
class BinaryOperationNode:
def __init__(self, left_node, operation, right_node):
self.left_node = left_node
self.operation = operation
self.right_node = right_node
self.pos_start = self.left_node.pos_start
self.pos_end = self.right_node.pos_end
def __repr__(self):
return f"({self.left_node}, {self.operation}, {self.right_node})"
class UnaryOperationNode:
def __init__(self, operation, node):
self.operation = operation
self.node = node
self.pos_start = self.operation.pos_start
self.pos_end = self.node.pos_end
def __repr__(self):
return f'({self.operation}, {self.node})'
class IfNode:
def __init__(self, cases, else_case):
self.cases = cases
self.else_case = else_case
self.pos_start = self.cases[0][0].pos_start
self.pos_end = (self.else_case or self.cases[len(self.cases) - 1][0]).pos_end
class ForNode:
def __init__(self, var_name_token, start_value_node, end_value_node, step_value_node, body_node):
self.var_name_token = var_name_token
self.start_value_node = start_value_node
self.end_value_node = end_value_node
self.step_value_node = step_value_node
self.body_node = body_node
self.pos_start = self.var_name_token.pos_start
self.pos_end = self.body_node.pos_end
class WhileNode:
def __init__(self, condition_node, body_node):
self.condition_node = condition_node
self.body_node = body_node
self.pos_start = condition_node.pos_start
self.pos_end = body_node.pos_end
class FunDefNode:
def __init__(self, var_name_token, arg_name_tokens, body_node):
self.var_name_token = var_name_token
self.arg_name_tokens = arg_name_tokens
self.body_node = body_node
if self.var_name_token:
self.pos_start = self.var_name_token.pos_start
elif len(self.arg_name_tokens) > 0:
self.pos_start = self.arg_name_tokens[0].pos_start
else:
self.pos_start = self.body_node.pos_start
self.pos_end = self.body_node.pos_end
class CallNode:
def __init__(self, node_to_call, arg_nodes):
self.node_to_call = node_to_call
self.arg_nodes = arg_nodes
self.pos_start = self.node_to_call.pos_start
if len(self.arg_nodes) > 0:
self.pos_end = self.arg_nodes[len(self.arg_nodes) - 1].pos_end
else:
self.pos_end = self.node_to_call.pos_end