Расширение языка Milan для построения транслятора
Автор: antonPavlov • Июнь 9, 2022 • Курсовая работа • 3,017 Слов (13 Страниц) • 441 Просмотры
КУРСОВАЯ РАБОТА
Расширение языка Milan для построения транслятора
по дисциплине «Теория автоматов»
Вариант №18
Выполнил
студент гр.
Руководитель,
доцен т
Введение
Язык Milan - учебный язык программирования. Программа представляет собой последовательность операторов, заключенных между ключевыми словами begin и end. Операторы отделяются друг от друга точкой с запятой. После последнего оператора в блоке точка с запятой не ставится. Компилятор CMilan не учитывает регистр символов в именах переменных и ключевых словах.
Транслятор - программа или техническое средство, выполняющее трансляцию программы.
Трансляция программы - преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определённом смысле, равносильную первой. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати тексты программы и т. д.
В ходе данной работы необходимо разобраться в реализации и работе CMilan и внести свои изменения согласно заданию. В данном варианте нужно усовершенствовать компилятор СMilan, добавив в него следующую конструкцию, не меняя существенно структуру компилятора (вариант № 18):
18. Множественное присваивание типа x:=y:=z:=w+3
Также необходимо написать соответствующие тесты для проверки правильности компиляции входной строки, запустить виртуальную стековую машину, принимающую транслированный код, и проверить правильность работы программы и транслятора.
Основная часть
Лексический анализатор посимвольно читает из файла текст программы и преобразует группы символов в лексемы. При формировании лексем анализатор идентифицирует ключевые слова и последовательности символов, а также определяет значения числовых констант и имена переменных. (исходный текст лексического анализатора находится в файлах scanner.h и scanner.cpp)
Синтаксический анализатор же читает сформированную лексическим анализатором последовательность лексем и проверяет ее соответствие грамматике языка Милан. Для этого используется метод рекурсивного спуска. В процессе анализа программы синтаксический анализатор генерирует набор машинных команд, соответствующие каждой конструкции языка (исходный текст синтаксического анализатора находится в файлах parser.h и parser.cpp)
Генератор поддерживает буфер команд и предоставляет синтаксическому анализатору набор функций, позволяющий записать указанную команду по определенному адресу. После того, как синтаксический анализатор заканчивает формирование программы, генератор кода используется для печати на стандартный вывод, отсортированной по возрастанию адресов последовательности инструкций.
Множественное присваивание типа x:=y:=z:=w+3
Измененная грамматика в виде формул:
⟨letter⟩ ::= ‘a’ | ‘b’ | ‘c’ | . . . | ‘z’ | ‘A’ | ‘B’ | ‘C’ | . . . | ‘Z’
⟨digit⟩ ::= ‘0’ | ‘1’ | ‘2’ | ‘3’ | ‘4’ | ‘5’ | ‘6’ | ‘7’ | ‘8’ | ‘9’
⟨ident⟩ ::= ⟨letter⟩ {⟨letter⟩ | ⟨digit⟩}
⟨contStatement⟩ ::= ⟨expression⟩ | ⟨ident⟩ ‘:=’ ⟨contStatement⟩
⟨statement⟩ ::= ⟨ident⟩ ‘:=’ ⟨contStatement⟩
Диаграмма грамматики:
[pic 1]
- Для начала нам необходимо модернизировать реализацию функции Parser:statement() в файл parser.cpp для обработки выражения и значений переменных:
Код функции приведен ниже:
void Parser::statement()
{
// Если встречаем переменную, то запоминаем ее адрес или добавляем новую если не встретили.
...