Загрузка данных


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