Как реализовать скриптовый язык для своей игры?
Я разрабатываю свою игру для которой мне понадобился скриптовый язык. Дело в том, что я не знаю как связать два класса: Parser и Game. В классе Game находится игровой цикл и поля, такие как текущий бг, текст, спрайты и тд:
class Game:
def __init__(self, quest_name):
# A lot of fields
def run(self):
clock = pygame.time.Clock()
while self.running:
self.window.fill(BLACK)
self.window.blit(
pygame.transform.scale(self.current_bg, (self.window.get_width(), self.window.get_height())),
(0, 0))
elif self.current_state == State.GAME:
if self.current_bg_music:
pygame.mixer.music.load(self.current_bg_music)
pygame.mixer.music.play(-1)
self.current_bg_music = None
self.window.blit(
pygame.transform.scale(self.current_bg, (self.window.get_width(), self.window.get_height())),
(0, 0))
for sprite in self.current_sprites:
self.sprite.draw(sprite, self.current_sprites[sprite])
self.text.bg.draw()
self.text.update(script[self.text_pos])
self.text.draw()
event = pygame.event.wait()
if event.type == pygame.QUIT:
self.running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
self.current_state = State.MENU
clock.tick(60)
pygame.display.flip()
В классе Parser находятся функции парсинга и запуска кода:
class Parser:
def __init__(self, tokens):
self.tokens = tokens
self.pos = 0
self.scope = {}
def parse_expression(self):
# parse expressions
def parse_code(self):
root = StatementsNode()
while self.pos < len(self.tokens):
code_string_node = self.parse_expression()
self.require(token_types_list['SEMICOLON'])
root.add_node(code_string_node)
return root # root node, which contains all strings of code
def run(self, node):
if isinstance(node, NumberNode):
return int(node.number.text)
if isinstance(node, StringNode):
return str(node.string.text).replace('"', '')
if isinstance(node, ColorNode):
return node.color.join(', ')
if isinstance(node, SceneNode):
for string in node.code:
self.run(string)
return
if isinstance(node, ActionNode):
for string in node.code:
self.run(string)
return
if isinstance(node, VariableNode):
if self.scope[node.variable.text]:
return self.scope[node.variable.text]
else:
raise Exception(f'Переменная {node.variable.text} не обнаружена')
if isinstance(node, StatementsNode):
for string in node.code_strings:
self.run(string)
return
if isinstance(node, UnarOperationNode):
# do unar operations, like set_bg or set_sprite
if isinstance(node, BinOperationNode):
# do bin operation, like + or -
raise Exception('Ошибка')
Вопрос: как сделать так, чтобы парсер вносил изменения в поля Game? Это нужно для того, чтобы отрисовать новые данные, которые были получены из исходного кода. (Кода очень много, предоставил в укороченном варианте)