Essays.club - Получите бесплатные рефераты, курсовые работы и научные статьи
Поиск

Разработка синтаксического анализатора

Автор:   •  Сентябрь 16, 2020  •  Лабораторная работа  •  12,852 Слов (52 Страниц)  •  223 Просмотры

Страница 1 из 52

Федеральное государственное бюджетное образовательное учреждение

высшего образования

«Уфимский государственный нефтяной технический университет»

Кафедра «Вычислительная техника и инженерная кибернетика»

ОТЧЕТ

по лабораторной работе № 3

«РАЗРАБОТКА СИНТАКСИЧЕСКОГО АНАЛИЗАТОРА»

Вариант 8

Выполнил ст. гр.                        

                                                                            ______________

                                                                подпись, дата

Проверил: преподаватель                                    Салихова М.А.

                                                                            ______________

                                                                 оценка, дата, подпись

Уфа  2020

Лабораторная работа №3

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

Разработать синтаксический анализатор в соответствии с вариантом задания.  В P:\Салихова М.А\ТЯПиМТ\БПО\дополнительные материалы\Примеры найдете программу, реализующую распознаватель вложенности скобок методом рекурсии (BracRec.zip) и с помощью автомата с магазинной памятью (BracStack.zip). А в файле P:\Салихова М.А\ТЯПиМТ\БПО\дополнительные материалы\Основы построения компиляторов(Легалов).doc есть описание построения синтаксического анализатора. Подготовить отчет.

  1. Текст программы:

Analys.h

bool isit(lc_type it) {

   if(ilex[pos]!=it)

       return false; //ошибка, это не то!

   else {

       printf("\nRaspoznal %17s pos=%d",lc[pos],pos);

       fprintf(outfil,"\nRaspoznal %17s pos=%d",lc[pos],pos);

       str+=lv[pos]; str+=" "; code=str.toLatin1().data();

       pos++;

       return true; } //Ок, следующая лексема

}

bool Opisanie() { //$описание = идентификатор { "," $идентификатор } ":" [ vector "[" $целое "]" of ] $тип.

    fprintf(outfil,"\nOpisanie");

    if(isit(lexId)){

        while (isit(lexComma)){

           if(!isit(lexId))

               return false;  //ошибка описания нескольких переменных

        }

        if(!isit(lexColon))

            return false; //ошибка описания нехаватает ":"

        if(isit(kwVector)){

            if(!isit(lexLftSqBr)) return false; //ошибка нехватает [

            if(!isit(lexInteger)) return false; //ошибка должно быть число после [

            if(!isit(lexRghSqBr)) return false; //ошибка должно быть ] после числа

            if(!isit(kwOf)) return false; //ошибка нехватает of

            if(!(isit(kwInteger) || isit(kwReal))) return false; //ошибка в типе

            return true; //описание успешно

        }

        else {

            if(!(isit(kwInteger) || isit(kwReal))) return false; //ошибка в типе

            return true; //описание успешно

        }

   }

   else return false; //ошибка описания первой переменной

}

bool Operator() {  //$оператора = [метка] непомеченный.

    fprintf(outfil,"\nOperator");

    if(Nepomecheniy()) return true;

    if(Metka()) {

       if(!Nepomecheniy()) return false;

       return true;

    }

   return false;

}

bool Metka(){ //$метка = имя_метки ":".

   fprintf(outfil,"\nMetka");//

   if(!isit(lexId)) return false;

   if(!isit(lexColon)) return false;

   return true;

}

bool Imya_metki(){ //$имя_метки = буква {буква \ цифра}.

   fprintf(outfil,"\nImya_metki");

   if(!isit(lexId)) return false; //Настоящая метка

   else return true;

}

bool Nepomecheniy() {

    fprintf(outfil,"\nNepomecheniy"); //$непомеченный = составной | присваивания | перехода | условный | цикла | пустой | ввода | вывода.

    if(Sostavnoy()) return true;

    if(Prisvaivaniya()) return true;

    if(Perehoda()) return true;

    if(Uslovniy()) return true;

    if(Cikla()) return true;

    if(Vvoda()) return true;

    if(Vivoda()) return true;

    return false;  //Ошибка оператора

}

bool Sostavnoy(){

    fprintf(outfil,"\nSostavnoy"); // $составной = BST {/ оператор ";" /} EST.

    if(!isit(kwBegin)) return false; //Не составной

    if(!Operator()) return false; //Ошибка в операторе

    if(!isit(lexSemicolon)) return false;

    while(Operator()){

...

Скачать:   txt (43.2 Kb)   pdf (326.3 Kb)   docx (38.3 Kb)  
Продолжить читать еще 51 страниц(ы) »
Доступно только на Essays.club