Транслятор из языка С++ в язык Pascal
Автор: Пользователь скрыл имя, 26 Февраля 2011 в 14:37, курсовая работа
Описание работы
Задачей данного курсового проекта является написание транслятора из языка высокого уровня С++ в язык Pascal. Входными данными является текст программы на языке C++, а выходными текст оттранслированной программы на языке Pascal.
Содержание
Постановка задачи 3
Проектирование лексического анализатора 4
Реализация лексического анализатора 6
Проектирование синтаксического анализатора 10
Реализация синтаксического анализатора 12
Проектирование транслятора 16
Реализация транслятора 17
Работа содержит 1 файл
Отчет.doc
— 126.00 Кб (Скачать)584770 584575
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РФ
АЛТАЙСКИЙ
ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
КАФЕДРА
ВТиЭ
Курсовая работа по дисциплине
«Системное
ПО»
«Транслятор
из языка С++ в язык Pascal»
Барнаул 2007
Оглавление:
Постановка задачи
Задачей
данного курсового проекта
Процесс разработки разбит на 3 этапа:
- Проектирование и разработка лексического анализатора. Он выполняет поиск токенов в тексте исходной программы и формирует динамический список сформированный из токенов и их атрибутов.
- Проектирование и разработка синтаксического анализатора. Он анализирует список сформированный лексическим анализатором, и проводит проверку синтаксиса входного текста в соответствии с правилами грамматики.
- Проектирование и разработка транслятора. Он анализирует таблицу токенов, составленную после синтаксического анализатора, и формирует оттранслированную программу на языке Pascal.
Проектирование лексического анализатора
Лексический анализатор является первой фазой трансляции. Его основная задача состоит в чтении новых символов и построении таблицы токенов, которую в своей работе использует синтаксический анализатор.
В качестве промежуточного шага построим диаграммы переходов для поиска очередной лексемы.
Отделение ключевых слов от идентификаторов состоит в инициализации таблицы символов, в которой хранятся ключевые слова. Процедура gettoken просматривает таблицу символов в поисках ключевого слова. Если оно найдено, то возвращает соответствующий токен, в противном случае возвращает id, num или sym. Приведенная выше диаграмма может быть преобразована в программу поиска токенов.
Реализация лексического анализатора
// Лексический анализ.
void Lexan ()
{
InitSymbolTable();// Инициализация
таблицы ключевых слов.
int forward = 0;
int lineno = 1;
char lexeme[33];
TOKEN
token;
while ( GetLexemeLimit(forward, lineno,lexeme)) //Получаем новую лексему
{
token = GetTokenAndAttribute( lexeme ); //сравниваем текщую лексему с таблицей зарезервированных слов, определяем тип токена
AddTokenAndAttribu
forward++;
}
AddTokenAndAttribute( end_file, NULL, lineno );//Добавяем в конец таблицы токен конца файла
}
Для
начала работы лексического анализатора
нужно сначала определить зарезервированные
слова, для этого используется функция
InitSymbolTable. В качестве входного потока используется
файл, который в начале программы считывается
в буфер, непосредственно над которым
производится лексический анализ. Сложность
заключается в определении начала и конца
следующей лексемы, чем занимается функция
GetLexeme с её же помощью можно получить саму
лексему. Функция GetTokenAndAttribute просматривает
таблицу зарезервированных слов и возвращает
соответствующий лексеме токен, а функция
AddTokenAndAttribute записывает его в динамический
список. Сложность заключается в определении
границ лексем, поэтому его реализация
приведена ниже.
/* Ищет начало и конец лексемы,
и
записывает нужный кусок
bool GetLexeme(int &forward, int &lineno, char *lexeme)
{
aa:
int lexeme_begin = forward;
switch ( buf[forward] )
{
case '{': break;
case '}': break;
case '(': break;
case ')': break;
case ';': break;
case ',': break;
case ' ': forward++; goto aa;
case '\t': forward++; goto aa;
case '\n': forward++;
case
(char)13: forward++; goto aa;
case '!': if ( buf[++forward]=='=' ) break;
case '<': case '>': case '=': if ( buf[++forward]!='=' )
case '+': break;
case '-': break;
case '*': break;
case '/': forward++;
forward++; while(buf[forward]!='*'||buf[
if ( buf[forward]=='\0' )
error(11,lineno);
forward++;
while(buf[++forward]!='\
case '\'': if ( ! isalpha( buf[++forward] ))
error( 22, lineno );
error( 23, lineno );