Алгоритм работы двухпроходного транслятора
1. Установить счетчик адреса в 0.
2. Выбрать очередную строку программы
3. Попытаться найти двоеточие в строке. Если найдено, то п.4, иначе п.8.
4. Вырезать кусок строки от начала до двоеточия и отбросить у полученного фрагмента пробелы справа и слева.
5. Проверить полученный фрагмент на допустимость имени
6. Если имя допустимо, то запомнить это имя в таблице имен, присвоив ему в качестве адреса текущее значение счетчика команд
7. Вырезать из входной строки все символы до двоеточия, включая и его
8. Отбросить все лидирующие пробелы и другие незначащие символы
9. Выбрать из оставшейся входной строки все символы до первого пробела или табуляции. Если таких символов нет, то всю строку
10. Сравнить полученную строку со всеми возможными командами
11. Если команда не была обнаружена, то ошибка. Если это команда определения данных, то п.12; если команда определения кода, то п.16
12. Определить длину одного элемента данных
13. Посчитать количество элементов, разделенных запятой, после команды определения данных или длину строки, если там находится строка заключенная в кавычки
14. Умножить длину одного элемента данных на их количество и добавить к счетчику адреса
15. Перейти к п.19
16. Выбрать операнды команды и сравнить их фактическое количество с необходимым. Если оно не равно, то ошибка
17. По операндам определяется тип адресации для команды
18. По имени команды и типам адресации операндов из соответствующей таблицы выбираем длину команды и прибавляем к счетчику адреса
19. Если не конец файла, то п.2, иначе п.20
20. Переместить указатель чтения/записи файла на начало. Обнулить счетчик адреса
21. Считать очередную строку исходного файла
22. Отбросить слева все пробелы и метки, если они имеются
23. Выбрать команду. Если эта команда assembler, то п.26, иначе п.24
24. Посчитать количество элементов данных и умножить их на длину одного элемента (длина одного элемента определяется командой) и отвести соответствующее количество памяти в объектном файле
25. Увеличить счетчик адреса на длину данных
26. Перейти на п.31
27. Исходя из команды и типов операндов (в зависимости от типов адресации операндов) определяем длину команды в машинном представлении
28. Для символичных представлений адреса в операндах выбрать из таблицы имен реальный адрес. Если такого имени в таблице нет, то ошибка
29. Исходя из команды, типов адресации и адресов символьных операндов, сформировать машинное представление команды и вывести его в объектный файл
30. Увеличить счетчик адреса на длину команды
31. Если не конец файла, то п.21, иначе п.32
32. Закрыть файл
На первом проходе компилятора (пп.1-19) была сформирована
таблица имен, которая ставит в соответствие имя метки и ее адрес. Таблица имен должна быть устроена так, чтобы при попытке добавления второй раз одной и той же метки возникала ошибка. Первый проход компилятора предназначен только для создания таблицы имен. На первом проходе полный синтаксический разбор можно не производить, но желательно проверить синтаксис.
На втором проходе производится собственно генерация кода и отведения места под данные.
Так как адреса переходов могут быть одно-, двух- и четырехбайтовые, то не всегда удается правильно определить длину команды перехода. В таком случае выбирается длина адреса по умолчанию и уточняется на втором проходе. При этом, при несовпадении длины прогнозируемой и реальной, требуется соответствующая корректировка таблицы имен для всех меток с адресом большим адреса текущей команды, которая привела к изменению.
Похожие записи
No user прокомментировали сообщение
Оставить комментарий