Ассемблер, созданный для специализированного процессора. Включает собственную грамматику. Использует фреймворк ANTLR для лексического и синтаксического анализа.
Основой является класс ASIPAssembler, который осуществляет трансляцию ассемблерного кода в машинный код.
Для него существуют тесты в файле ASIPAssemblerTest.py, рядом с которым лежат тестовые программы и ожидаемый результат.
^ общее время работы (не показывается без VPN)
Пример древа разбора:
Структура проекта:
.
├── main.py # Точка входа для запуска трансляции
├── ASIPAssembler.py # Главный класс ассемблера, координирующий все этапы трансляции
├── generate_lexpas.ps1 # PowerShell команда для генерации лексера и парсера из грамматик
├── assembly_highlight.xml # Файл конфигурации подсветки синтаксиса для Notepad++
│
├── grammar # Грамматики ANTLR (лексическая в ASICLexer.g4, синтаксическая в ASICParser.g4)
│
├── generated # Сгенерированные ANTLR файлы на Python (лексер и парсер)
│
├── models # Модели данных для представления элементов ассемблерного кода
│ ├── ...
│ ├── ConfigInstruction.py # Модель конфигурации БФС
│ ├── ProgInstruction.py # Модель инструкции
│ ├── enums # Перечисления для типизации инструкций и конфигураций
│ └── exceptions # Пользовательские исключения для обработки ошибок ассемблера
│
├── test
│ ├── ASIPAssemblerTest.py # Основной файл тестов
│ └── test_files
│ ├── assembler_data # Тестовые программы на языке ассемблера, можно использовать как примеры
│ └── expected_data # Ожидаемые данные
│
├── utils # Вспомогательные функции
│
└── visitors
├── FirstPassVisitor.py # Visitor первого прохода - собирает метки и директивы
├── CodeGenerator.py # Visitor второго прохода - сама генерация кода
└── ExpressionEvaluator.py # Отдельный класс для вычисления выражений
Реализовано:
- Трансляция ассемблерного кода в машинный код (доступны все поля машинных инструкций и конфигураций)
- Поддержка директив конфигураций
- Поддержка директив константных входов конфигураций
- Поддержка директив макросов
- Поддержка меток
- Поддержка выражений (с определёнными ограничениями)
- Автоматическая вставка инструкций ожидания согласно спецификации процессора
- Проверка значений аргументов операций в конфигурациях согласно спецификации процессора
- Вывод указания точного места в исходной программе, где возникла ошибка при трансляции
- Поддержка вывода машинного кода в разных форматах (bin/hex, с указанием исходных строк, с разделением байтов)
- Синтаксис для Notepad++ (оптимизирован под светлую тему)
Не реализовано:
- Поддержка директив условной компиляции (
#if,#ifdef,#ifndef,#ifmacro,#ifnmacro) - Поддержка операторов
//,%%и^^в выражениях - Поддержка скобок в выражениях
- Пересчёт выражений, использующих метки после вставки дополнительных инструкций ожидания
- Разделение логических и арифметичeских выражений
- Порядок вычисления макросов в зависимости от использования других макросов, а не в зависимости от порядка в исходном коде
- Поддержка отсутствия точки с запятой в конце строки (пока что необходимо)
- Автоматическая вставка eop в конец программы при его отсутствии (требуется аналитика необходимости данного функционала)
- Интерфейс ассемблера (терминал, графический интерфейс или IDE)