Министерство образования Российской Федерации
Новосибирский Государственный Технический Университет
Лабораторная работа № 1-4
и РГЗ
по курсу
«Языки программирования и методы трансляции»
Факультет: ПМИ
Группа: ПМ-51
Студенты: Саяпина М.
Шмидт Е.
Вариант: 1
Новосибирск
2008
1. Цели и задачи проекта
Проектирование транслятора (язык проектирования Си++) с языка Си++ на язык Ассемблер.
Разработать программу, осуществляющую трансляцию программы, написанной на языке «Си» в программу на языке «Ассемблер».
Подмножество языка С++ включает:
· данные типа int;
· инструкции описания переменных;
· операторы присваивания, if, if-else любой вложенности и в любой последовательности;
· операции +, – , *, ==, != , < .
Получить представление о видах таблиц, используемых при трансляции программ. Изучить множество операций с таблицами и особенности реализации этих операций для таблиц, используемых на этапе лексического анализа. Реализовать классы таблиц, используемых сканером.
В соответствии с выбранным вариантом задания к лабораторным работам с использованием средств объектно-ориентированного программирования
1) разработать структуру постоянных таблиц для хранения алфавита языка, зарезервированных слов, знаков операций, разделителей и пр.;
реализовать для постоянных таблиц алгоритм поиска элемента в упорядоченной таблице;
2) разработать структуру переменных таблиц с вычисляемым входом для хранения идентификаторов и констант (вид хеш-функции и метод рехеширования задает разработчик);
3) реализовать для переменных таблиц алгоритмы поиска/добавления лексемы, поиска/добавления атрибутов лексемы;
4) разработать программу для тестирования и демонстрации работы программ пп.1-3.
2. Вид, объем и источник исходных данных
Постоянная таблица формируется из ключевых (зарезерированных) слов, содержащихся в текстовом файле ”keywords.txt”. Слова в файле содержатся в произвольном порядке, разделены стандартными разделителями (пробел, табуляция, перевод строки, …).
Переменные таблицы констант и идентификаторов формируются из данных, вводимых с клавиатуры.
Управление (осуществление допустимых операций) постоянными и переменными таблицами осуществляется за счет данных, вводимых с клавиатуры (при этом ввод регламентируется пользовательским меню).
3. Структура таблиц
КЛАСС "ПОСТОЯННАЯ ТАБЛИЦА"
ДЛЯ ХРАНЕНИЯ КЛЮЧЕВЫХ СЛОВ, РАЗДЕЛИТЕЛЕЙ, ЗНАКОВ ОПЕРАЦИЙ, А ТАК ЖЕ АЛФАВИТА ВХОДНОГО ЯЗЫКА
- статическая упорядоченная одномерная таблица
Ключ=elem.
Описание:
// элемент постоянной таблица (элемент списка, реализующего таблицу)
struct static_table_elem
{
char elem[MAX_STATICLEX_LENGTH+1]; // элемент таблицы
static_table_elem *next; // указатель на следующий элемент таблицы
};
// класс "постоянная таблица"
class static_table
{
private:
// указатель на список, реализующий таблицу
static_table_elem *table;
public:
// конструктор
static_table();
// деструктор
~static_table();
// чтение элементов таблицы из файла
void create_table(char filename[MAX_FILENAME_LENGTH+1]);
// поиск элемента
int find_elem(char search[MAX_STATICLEX_LENGTH+1]);
// распечатка элементов таблицы (отладочная функция)
void print_table();
};
КЛАСС "ПЕРЕМЕННАЯ ТАБЛИЦА КОНСТАНТ"
- статическо-динамическая неупорядоченная двумерная хэш-таблица.
Номер строки, в которую добавляется элемент, вычисляется хэш-функцией; элемент добавляется в конец строки (т.е. в последний столбец).
Ключ=elem.
Хэш-функция: .
Описание:
// структура, описывающая положение элемента в двумерной таблице
struct numb
{
int string; // номер строки
int column; // номер столбца
};
// элемент таблицы констант (элемент списка, реализующего таблицу)
struct const_table_elem
{
char elem[MAX_CONSTLEX_LENGTH+1]; // элемент таблицы
const_table_elem *next; // указатель на следующий элемент таблицы
};
// класс "переменная таблица констант"
class const_table
{
private:
const_table_elem *table[10]; // указатели на строки таблицы
public:
// конструктор
const_table();
// деструктор
~const_table();
// добавление элемента
int add_elem(char add[MAX_CONSTLEX_LENGTH+1], numb *place);
// поиск элемента
int find_elem(char search[MAX_CONSTLEX_LENGTH+1], numb *place);
// поиск элемента по адресу
int find_elem_byadress(char search[MAX_CONSTLEX_LENGTH+1], numb place);
// распечатка элементов таблицы (отладочная функция)
void print_table();
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.