mirror of
https://github.com/Zandercraft/Aurora-lang.git
synced 2026-10-29 04:39:21 +00:00
Moved all AST nodes to a separate module and fixed a bug with unary + operator
This commit is contained in:
120
internal/nodes.py
Normal file
120
internal/nodes.py
Normal 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
|
||||
Reference in New Issue
Block a user