Автор: Пользователь скрыл имя, 26 Февраля 2011 в 14:37, курсовая работа
Задачей данного курсового проекта является написание транслятора из языка высокого уровня С++ в язык Pascal. Входными данными является текст программы на языке C++, а выходными текст оттранслированной программы на языке Pascal.
Постановка задачи 3
Проектирование лексического анализатора 4
Реализация лексического анализатора 6
Проектирование синтаксического анализатора 10
Реализация синтаксического анализатора 12
Проектирование транслятора 16
Реализация транслятора 17
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 );