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 – Несоответствующий правилу поток лексем

 


 

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

16776. ГЛУБИННЫЕ ЗОЛОТОНОСНЫЕ РЕКИ ЗЕМЛИ 113 KB
  ГЛУБИННЫЕ ЗОЛОТОНОСНЫЕ РЕКИ ЗЕМЛИ Доктор геологоминералогических наук профессор А. ПОРТНОВ. Опубликовано Наука и жизнь 12 . 2000г. Как было открыто золото Витватерсранда самое крупное в мире скопление этого драгоценного металл
16777. Госты и пробы (золото, серебро) 124.5 KB
  Госты и пробы золото серебро Для золота существуют утвержденные ГОСТом цифровые значения пробы указывающие на количество драгоценного металла содержащегося в 1000 частях сплава. Проба присваивается каждому драгоценному сплаву. ГОСТ 683585 преду...
16778. ДАЛЬНЕВОСТОЧНАЯ ЗОЛОТОДОБЫВАЮЩАЯ ПРОМЫШЛЕННОСТЬ И ЕЕ ВЛИЯНИЕ НА ОСВОЕНИЕ РЕГИОНА (ВТОРАЯ ПОЛОВИНА ХIХ в. – 1917 г.) 346 KB
  Маркова Нина Анатольевна ДАЛЬНЕВОСТОЧНАЯ ЗОЛОТОДОБЫВАЮЩАЯ ПРОМЫШЛЕННОСТЬ И ЕЕ ВЛИЯНИЕ НА ОСВОЕНИЕ РЕГИОНА ВТОРАЯ ПОЛОВИНА ХIХ в. – 1917 г. ОБЩАЯ ХАРАКТЕРИСТИКА РАБОТЫ Актуальность исследования. Золото традиционно является валютным металлом играет роль резер
16779. Добыча драгоценных металлов из промышленных отходов 66.5 KB
  Добыча драгоценных металлов из промышленных отходов Сразу же хочу напомнить читателям об уголовной ответственности существующей на момент написания этих строк за самодеятельную добычу драгоценных металлов из промышленных отходов. Такое положение вещей не может дол
16780. Добыча россыпного золота в XXI веке 179 KB
  Добыча россыпного золота в XXI в. Б.К.Кавчик ОАО Иргиредмет Добыча россыпного золота ведется в России уже почти 200 лет и в настоящее время ее объем ежегодно составляет около 50 т. Однако запасы россыпного золота близки ...
16781. Золотая добыча 89.5 KB
  Золотая добыча Мировые цены на золото сейчас как никогда высоки: в марте 2008 года котировки этого драгметалла превысили 1 тыс. за тройскую унцию. Однако отечественная золотодобывающая отрасль вряд ли сможет оперативно отреагировать на резкий рост ценовой конъюнктуры. ...
16782. Золотая лихорадка или роль золота в истории 145 KB
  Золотая лихорадка или роль золота в истории. Золото расковывается до толщины 01 микрометра. 28 грамм хватит на лист площадью около 17 кв. метров Цивилизация человечества невозможна без таких металлов как медь железо затем алюминий и пр. Но золото представляется...
16783. Золото и его добыча 56 KB
  Золото ЗОЛОТО лат. Aurum – драгоценный металл химический элемент I группы периодической системы атомный номер 79 атомная масса 1969665. Этот благородный металл желтого цвета ковкий его плотность составляет 1932 г/см3 tпл 10644оC. Химически весьма инертен на воздухе не изменяет...
16784. ЗОЛОТО ГДЕ ОНО В РЕКЕ 141 KB
  ЗОЛОТО ГДЕ ОНО В РЕКЕ ЗОЛОТО ТАМ ГДЕ ТЫ ЕГО НАХОДИШЬ Россыпное золото россыпи находят в осадочных отложениях в руслах древних рек и в отложениях современных потоков. Россыпи бывают аллювиальными террасовыми русловыми донные косовые. Террасовые отложения