Транслятор из языка С++ в язык Pascal

Автор: Пользователь скрыл имя, 26 Февраля 2011 в 14:37, курсовая работа

Описание работы

Задачей данного курсового проекта является написание транслятора из языка высокого уровня С++ в язык Pascal. Входными данными является текст программы на языке C++, а выходными текст оттранслированной программы на языке Pascal.

Содержание

Постановка задачи 3
Проектирование лексического анализатора 4
Реализация лексического анализатора 6
Проектирование синтаксического анализатора 10
Реализация синтаксического анализатора 12
Проектирование транслятора 16
Реализация транслятора 17

Работа содержит 1 файл

Отчет.doc

— 126.00 Кб (Скачать)

584770 584575

МИНИСТЕРСТВО  ОБРАЗОВАНИЯ РФ

АЛТАЙСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ 

КАФЕДРА ВТиЭ 
 
 
 
 

Курсовая  работа по дисциплине

«Системное  ПО»  
 

«Транслятор из языка С++ в язык Pascal» 
 
 
 

                                                      Выполнил:

                                                      студент группы  546

                                                                                           Шипулин Н. В.________ 

                                                      Проверил:

                                                      Зацепин П. М._________ 
 
 
 

Барнаул 2007

    Оглавление:

 

     Постановка  задачи

    Задачей данного курсового проекта является написание транслятора из языка  высокого уровня С++ в язык Pascal. Входными данными является текст программы на языке C++, а выходными текст оттранслированной программы на языке Pascal.

    Процесс разработки разбит на 3 этапа:

  1. Проектирование и разработка лексического анализатора. Он выполняет поиск токенов в тексте исходной программы и формирует динамический список сформированный из токенов и их атрибутов.
  2. Проектирование и разработка синтаксического анализатора. Он анализирует список сформированный лексическим анализатором, и проводит проверку синтаксиса входного текста в соответствии с правилами грамматики.
  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 );    //сравниваем текщую лексему с таблицей зарезервированных слов, определяем тип токена  

            AddTokenAndAttribute( token, lexeme, lineno );  //делаем запись в таблицу лексем  

            forward++;

      }  

      AddTokenAndAttribute( end_file, NULL, lineno );//Добавяем в конец таблицы токен конца файла

} 

    Для начала работы лексического анализатора  нужно сначала определить зарезервированные  слова, для этого используется функция  InitSymbolTable. В качестве входного потока используется файл, который в начале программы считывается в буфер, непосредственно над которым производится лексический анализ. Сложность заключается в определении начала и конца следующей лексемы, чем занимается функция GetLexeme с её же помощью можно получить саму лексему. Функция GetTokenAndAttribute просматривает таблицу зарезервированных слов и возвращает соответствующий лексеме токен, а функция AddTokenAndAttribute записывает его в динамический список. Сложность заключается в определении границ лексем, поэтому его реализация приведена ниже.   

/* Ищет начало и конец лексемы,

   и  записывает нужный кусок буфера, соответствующий найденной лексеме  в перменную lexeme */

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++;

                              lineno = lineno + 1;  goto aa;

                  case (char)13: forward++;    goto aa; 

                    case '!'if ( buf[++forward]=='=' ) break;                          

                              else error( 1, lineno);        

                  case '<': case '>'case '=':           if ( buf[++forward]!='=' )

                                          forward--;

                                    break; 

                  case '+'break;

                  case '-'break;

                  case '*'break;

                  case '/': forward++;

                              if ( buf[forward]=='*' ) // Комментарии типа "/*  */"

                              {

              forward++; while(buf[forward]!='*'||buf[forward+1]!='/')

                                          

                                                if ( buf[forward]=='\n' )            lineno++;

                     if ( buf[forward]=='\0' )

                       error(11,lineno);

                  forward++;

                                          

                                    forward++;

                              }

                              else if(buf[forward]=='/'// Комментарии типа  "//"

                                    {

                   while(buf[++forward]!='\n');

                                          lineno++;

                                          forward++;             

                                    }

                                    else {     // Оператор деления /

                                          forward--;

                                          break;

                                         }   

                                    forward++;  //Если дошло до этого места значит мы обнаружили комментарии

                                    goto aa;     //которые должны пропустить вернувшись к началу функции с новым forward

                  case '\''if ( ! isalpha( buf[++forward] ))

                    error( 22, lineno );   

                                                 if ( buf[++forward]!='\'' )

                       error( 23, lineno );

                                                 break;      

Информация о работе Транслятор из языка С++ в язык Pascal