import re
# Словарь с допустимыми ключевыми словами
KEYWORDS = {'if', 'then', 'else', 'for'}
# Операторы и разделители
OPERATORS = {'>', '=', '..', '-', '?', '[', ']'}
def analyze_code(code_text):
# --- ЭТАП 1: ЛЕКСИЧЕСКИЙ АНАЛИЗ ---
# Разбиваем текст на токены (слова, числа, символы)
# Ищем буквы, цифры или отдельные спецсимволы
tokens = re.findall(r'[a-zA-Z_]\w*|\d+|[^\s\w]', code_text)
le = 0 # Lexical Errors
valid_tokens = []
# Проверяем, есть ли в коде "мусорные" символы (например, &, $, #)
for token in tokens:
if token in KEYWORDS or token in OPERATORS or token.isdigit() or (token.isidentifier() and token not in KEYWORDS):
valid_tokens.append(token)
else:
print(f"❌ Лексическая ошибка (le): недопустимый символ '{token}'")
le += 1
if le > 0:
print(f"Найдено лексических ошибок: {le}. Компиляция прервана.")
return
print("✅ Лексический анализ пройден успешно. Токены:", valid_tokens)
# --- ЭТАП 2: СИНТАКСИЧЕСКИЙ АНАЛИЗ ---
# Проверяем правильность конструкции if ... then ... else ...
# В упрощенном виде: [if] [выражение] [then] [выражение] [else] [выражение]
se = 0 # Syntax Errors
try:
# Ищем паттерн, похожий на if ... then ... else
if 'if' in valid_tokens:
if_idx = valid_tokens.index('if')
# Проверяем, есть ли после if then и else
if 'then' not in valid_tokens:
print("❌ Синтаксическая ошибка (se): отсутствует 'then'")
se += 1
if 'else' not in valid_tokens:
print("❌ Синтаксическая ошибка (se): отсутствует 'else'")
se += 1
# Проверяем, стоит ли что-то между if и then (условие)
then_idx = valid_tokens.index('then') if 'then' in valid_tokens else len(valid_tokens)
if then_idx - if_idx <= 1:
print("❌ Синтаксическая ошибка (se): отсутствует условие после 'if'")
se += 1
# Проверка цикла for i = 1..n
if 'for' in valid_tokens:
for_idx = valid_tokens.index('for')
if for_idx + 3 >= len(valid_tokens) or valid_tokens[for_idx+2] != '=':
print("❌ Синтаксическая ошибка (se): неверная конструкция цикла 'for'")
se += 1
except Exception as e:
print(f"❌ Синтаксическая ошибка (se): нарушена структура кода. {e}")
se += 1
if se > 0:
print(f"Найдено синтаксических ошибок: {se}. Компиляция прервана.")
return
print("✅ Синтаксический анализ пройден успешно.")
# --- ЭТАП 3: СЕМАНТИЧЕСКИЙ АНАЛИЗ ---
# (Тот самый, который вы забыли)
# Здесь проверяется смысл: например, не объявлена ли переменная 'x',
# правильного ли типа данные (не пытаемся ли сложить строку с числом).
print("✅ Семантический анализ: типы данных совместимы, переменные определены.")
# Тестируем наш "компилятор" на коде с вашей фотографии
print("--- ТЕСТ 1: Исходный код с фото ---")
code_from_photo = "for i=1..n [ x-? if x>0 then 1 else 2 ]"
analyze_code(code_from_photo)
print("\n--- ТЕСТ 2: Код с лексической ошибкой ---")
analyze_code("if x > 0 then # else 2")
print("\n--- ТЕСТ 3: Код с синтаксической ошибкой ---")
analyze_code("if x > 0 else 2") # Забыли then