Всем привет, я разрабатываю интерпритатор для своего языка программирования. Вот код:
import re
variables = {}
def interpret(command):
try:
# Если строка начинается с символа '#', это комментарий, и мы его пропускаем
if command.startswith('#'):
return
# Переменные
match = re.match(r'var (\w+) is (\d+)', command)
if match:
var_name = match.group(1)
var_value = int(match.group(2))
variables[var_name] = var_value
match = re.match(r'var (\w+) is (\w+) mlp (\w+)', command)
if match:
var_name = match.group(1)
var1_name = match.group(2)
var2_name = match.group(3)
if var1_name in variables and var2_name in variables:
variables[var_name] = variables[var1_name] * variables[var2_name]
else:
print("Один из компонентов функции varmpl не определён")
match = re.match(r'var (\w+) is (\w+) sum (\d+)', command)
if match:
var_name = match.group(1)
var1_name = match.group(2)
var2_name = match.group(3)
if var1_name in variables and var2_name in variables:
variables[var_name] = variables[var1_name] + variables[var2_name]
match = re.match(r'logvar (\w+)', command)
if match:
var_name = match.group(1)
if var_name in variables:
print(variables[var_name])
else:
print(f'Переменная {var_name} не определена')
# Логи (вывод на экран)
match = re.match(r'log "(.*)"', command)
if match:
value = match.group(1)
print(value)
match = re.match(r'log (\d+) sum (\d+)', command)
if match:
num1 = int(match.group(1))
num2 = int(match.group(2))
print(num1 + num2)
match = re.match(r'log (\d+) mlp (\d+)', command)
if match:
num1 = int(match.group(1))
num2 = int(match.group(2))
print(num1 * num2)
# Многострочный луп
match = re.match(r'loop (\d+) {(.*?)}', command, re.DOTALL)
if match:
n = int(match.group(1))
commands = [cmd.strip()]
for a in range(n):
interpret(commands)
# Цикл
match = re.match(r'loop (\d+) log "(.*)"', command)
if match:
n = int(match.group(1))
txt = match.group(2)
a = 0
while a < n:
print(txt)
a+=1
#Ифы
match = re.match(r'if (\w+) eq (\d+) then log "(.*)"', command)
if match:
var_name = match.group(1)
var_value = int(match.group(2))
message = match.group(3)
if variables.get(var_name) == var_value:
print(message)
match = re.match(r'if (\w+) less (\d+) then log "(.*)"', command)
if match:
var_name = match.group(1)
var_value = int(match.group(2))
message = match.group(3)
if variables.get(var_name) <= var_value-1:
print(message)
match = re.match(r'if (\w+) over (\d+) then log "(.*)"', command)
if match:
var_name = match.group(1)
var_value = int(match.group(2))
message = match.group(3)
if variables.get(var_name) >= var_value+1:
print(message)
match = re.match(r'if (\w+) btw (\d+) and (\d+) then log "(.*)"', command)
if match:
var_name = match.group(1)
var_value = int(match.group(2))
var_value1 = int(match.group(3))
message = match.group(4)
if variables.get(var_name) >= var_value+1 and variables.get(var_name) <= var_value1-1:
print(message)
except Exception as e:
print(f'Произошла ошибка: {str(e)}')
def interpret_file(filename):
try:
with open(filename, ‘r’) as file:
for line in file:
interpret(line.strip())
except FileNotFoundError:
print(‘Файл не найден’)
except Exception as e:
print(f’Произошла ошибка при чтении файла: {str(e)}’)
while True:
intF = input(’> Выберите файл для компиляции > ')
interpret_file(intF)
Мне нужно реализовать многострочный цикл (на несколько команд). ПОМОГИТЕ ПОЖАЛУЙСТА