51207

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

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

Информатика, кибернетика и программирование

Для предложенного преподавателем варианта контекстного условия расширить атрибутную грамматику из лабораторной работы № 4 добавлением атрибутов, правил их вычисления, правил вычисления контекстных условий. Включить в программу синтаксического анализатора из лабораторной работы № 4 действия по вычислению атрибутов и проверки контекстных условий.

Русский

2014-02-07

48.83 KB

6 чел.

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

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

«Ижевский государственный технический университет им. М.Т.Калашникова»

Кафедра АСОИУ

ОТЧЕТ

к лабораторной работе №5

по дисциплине «Математическая лингвистика»

на тему «Разработка контекстного анализатора»

Вариант №13.

Выполнил:
студент гр. Б04-782-1 Н.А.Сидоров

Руководитель:
ассистент каф.АСОИУ Д.Р.Касимов

Ижевск 2013

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

Для предложенного преподавателем варианта контекстного условия расширить атрибутную грамматику из лабораторной работы № 4 добавлением атрибутов, правил их вычисления, правил вычисления контекстных условий. Включить в программу синтаксического анализатора из лабораторной работы № 4 действия по вычислению атрибутов и проверки контекстных условий.

Предложенный вариант контекстного условия выглядит следующим образом: все идентификаторы должны быть разными.


2 Атрибутная грамматика с действиями по построению дерева

В таблице 2.1 можно увидеть атрибутную грамматику для указанного ранее варианта.

Таблица 2.1

В таблице <цифра> обозначает лексему, состоящую только из букв, а <цифра> - какое-либо цифровое слово.

Функция  добавляет  в определенную таблицу в зависимости от типа отправляемой лексемы. Представлены 2 таблицы для лексем: для цифровых и для буквенных идентификаторов.

.

3 Исходный текст синтаксического анализатора

class SynAnalyzer

{

 private:

  …

  vector <List> digitTable;  // таблица цифровых лексем

  vector <List> letterTable; // таблица буквенных лексем

  int GetHashValue()const; // …

  void AddTokInTable();

  void FirstlyInitTables();

  bool IsInField(int )const;

  void Error(int )const; // вывод ошибок

  void A(TTreeNode *);

  void S(TTreeNode *);

  …

 public:

  void Parse();

  …

};

//-----------------------------------------------------------

void SynAnalyzer::Parse()

{

 try

  {

    GetNextToken(); //получили первый терминал, и идем...!

    AddTokInTable(); // добавляем

    S(Form1->TreeView1->Items->Item[0]); // отправляем туда корень

  }

 catch(int e)

  {

    Error(e);

  }

}

//------------------------------------------------------------

void SynAnalyzer::A(TTreeNode *uzel)

{

 TTreeNode *newUzel=Form1->TreeView1->Items->AddChild(uzel,'A'); // добавляем нетерминал

 if (curTok.type==digit)

  {

    //построить бы

    Form1->TreeView1->Items->AddChild(newUzel,curTok.val); //терминал

    GetNextToken();

    AddTokInTable(); // добавляем текущий полученый токен

  }

 else

  {

    if (curTok.type==letter)

     {

       // построить бы

       Form1->TreeView1->Items->AddChild(newUzel,curTok.val);  //терминал

       GetNextToken();

       AddTokInTable(); // добавляем текущий полученый токен

       S(newUzel);

       A(newUzel);

     }

    else throw 1; // letter expected

  }

}

//------------------------------------------------------------

void SynAnalyzer::S(TTreeNode *uzel)

{

 TTreeNode *newUzel=Form1->TreeView1->Items->AddChild(uzel, 'S'); //добавляем нетерминал

 if (curTok.type==letter)

  {

    //построить бы надо

    Form1->TreeView1->Items->AddChild(newUzel,curTok.val); //терминал

    GetNextToken();

    AddTokInTable(); // добавляем в таблицу

  }

 else

  {

    if (curTok.type==digit)

     {

       //построить бы надо

       Form1->TreeView1->Items->AddChild(newUzel,curTok.val); //терминал

       GetNextToken();

       AddTokInTable(); // добавляем curTok.val в таблицу

       A(newUzel);

       S(newUzel);

     }

    else throw 2; // digit expected

  }

}

//-----------------------------------------

void SynAnalyzer::AddTokInTable()

{

 unsigned int h=GetHashValue();

 //проверяем на размер таблицы, вдруг h > размера таблицы

 // если h> размер, то увеличиваем до нужного h

 List *dummy=new List;

 switch (curTok.type)

  {

    case letter:

     if (h > letterTable.size()-1)

      while (1)

       {

         letterTable.push_back(*dummy);

         if (h == letterTable.size()-1) break;

       }

     break;

    case digit:

     if (h > digitTable.size()-1)

      while (1)

       {

         digitTable.push_back(*dummy);

         if (h == digitTable.size()-1) break;

       }

     break;

  }

 delete dummy;

 switch (curTok.type)

  {

    case letter:

     if (letterTable[h].list.empty())

      {

        letterTable[h].list.push_back(curTok.val);

      }

     else

      {

        if (!IsInField(h))

         letterTable[h].list.push_back(curTok.val);

        else throw 4; // был найден повторный идентификатор

      }

     break;

    case digit:

     if (digitTable[h].list.empty())

      {

        digitTable[h].list.push_back(curTok.val);

      }

     else

      {

        if (!IsInField(h))

         digitTable[h].list.push_back(curTok.val);

        else throw 4; // был найден повторный идентификатор

      }

     break;

  }//case

}

Методы bool IsInField(int ) и int GetHashValue() аналогичны тем, что представлены в лексическом анализаторе (л.р. №2).

4 Результаты тестирования

На рисунках 4.2 можно увидеть окно предупреждения, доносящее информацию до пользователя о том, что были введены одинаковые идентификаторы. На рисунке 4.1 окно, предупреждающее пользователя, выведено не будет, поскольку все идентификаторы удовлетворяют условию, о котором было упомянуто ранее в п.1 данной лабораторной работы.

Рисунок 4.1 – Правильный поток идентификаторов

Рисунок 4.2 – Несоответствующий правилу поток лексем

 


 

А также другие работы, которые могут Вас заинтересовать

60104. Позакласний захід «Що потрібно знати про грип» 60.5 KB
  Тож Що потрібно знати про грип будуть розповідати діти. Сьогодні ми поговоримо про одну з найпоширеніших інфекційних хвороб грип. На грип хворіють і діти і дорослі.
60105. Відкритий виховний захід: «Психологічне здоровя дитини» 49.5 KB
  Мета: розширювати і узагальнювати поняття про поведінку між людьми; про вихованість і чемність людську доброту і милосердя та вплив цих чинників на здоровя людини; прищеплювати бажання свідомо дотримуватися усталених норм поведінки...
60107. Сценарій маленького ювілею «50 днів у школі» 69 KB
  Він нас зібрав усіх сюди У вересневу рань Щоб вчитися змогли всі ми І набиратись знань. Сьогодні всі ми урочисто Переступили цей поріг Яскраве сонечко надворі Кидає промінці у клас Такого свята ще ніколи...
60108. Усний журнал «Здоров’я» 70 KB
  Мета: формувати розуміння необхідності здорового способу життя відповідальність за власне здоровя і здоровя рідних; усвідомлення наслідків вживання алкоголю нікотину наркотиків...
60109. Позакласний захід: Княгиня Ольга 38 KB
  Вдова Ігоря - Ольга На сцену виходить Ольга сідає на свій трон: Той хто не помстився за смерть родичів буде зганьблений на віки вічні і тому наказую кинути древлянських послів у глибоку яму та закопати живцем.
60111. Любімо Україну! 74.5 KB
  Ой зелене жито зелене хорошії гості у мене Зеленеє жито женці жнуть хорошії гості мене ждуть 2р. Ой зелене житто зелене хорошії гості у мене Зеленеє жито при межі хорошії гості від душі...
60112. Виховний захід «Миколай святий іде, подарунки всім несе!» 47 KB
  Увага Дітвора У нас чудова новина До казки просимо усіх Де вас чекають жарти й сміх Сьогодні в нас казкове свято Гостей запрошено багато Уучень. Летить сніжок Легесенький кружляє Безшумно осідає він на все...