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

 


 

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

30829. Оценка нагнетательной (насосной) функции сердца 27 KB
  Продолжительность фаз цикла при условной его длительности 1 сек 60 ударов мин. Рисунок Систола желудочков 035 сек Период напряжения 01 сек: 1. Фаза асинхронного сокращения 005 сек. Фаза изометрического сокращения 005 сек.
30830. Механические проявления сердечной деятельности 30.5 KB
  Механические проявления сердечной деятельности Механические проявления сердечной деятельности: а верхушечный толчок б сердечный толчок в кровяное давление г артериальный и венный пульс д явления связанные с движением крови по сосудам Верхушечный толчок в норме локализуется в 5 межреберье слева на 15 2 см кнутри от срединноключичной линии. Артериальный пульс колебание артериальной стенки в результате распространения волны повышенного давления по столбу крови. Наполнение пустой vcuus полный plenus зависит от...
30831. Физиология как наука 31 KB
  Физиология изучает функции и процессы протекающие в организме отдельных органах и системах органов механизмы их формирования реализации и регуляции. Физиология изучает процессы т. Физиология относится к разряду фундаментальных наук.
30832. Внутренняя среда организма 33 KB
  Внутренняя среда организма Под внутренней средой организма понимают ту среду которая непосредственно не сообщается с окружающей средой и является микроокружением клеток человеческого организма т. Истинной внутренней средой организма является межклеточная жидкость. Внутренняя среда это среда в которой непосредственно живут клетки организма т. Еще в 18м веке знаменитый французский физиолог Клод Бернар сформулировал понятие гомеостаз постоянство внутренней среды организма.
30833. Приспособление к среде обитания, как важнейшее условие жизнедеятельности. Срочная и долговременная адаптация 27.5 KB
  Срочная и долговременная адаптация. Адаптация процесс приспособления организма к изменяющимся условиям среды обитания. При благоприятном стечении обстоятельств прекращении действия сверхсильного фактора или снижении его силы и интенсивности до уровня физиологического диапозона действия возможна деадаптация. Организм всегда оставляет след от неблагоприятного воздействия вегетативная память что облегчает приспособление при повторной адаптации реадаптация.
30834. Функции клеток 21.5 KB
  Раздражимость способность клетки отвечать на раздражение изменением своего обмена веществ. Возбудимость это способность клетки отвечать на раздражение изменением проницаемости клеточной мембраны входящим натриевым током и как следствие генерацией потенциала действия т. Проводимость это способность клетки проводить распространять возбуждение от места его возникновения в клетке к другим ее частям. Если у клетки утрачена раздражимость возбудимость или проводимость то она или функционально нарушена либо погибла т.
30835. Ионно-мембранная теория происхождения биоэлектрических явлений (Ходжкин, Хаксли, Катц). Электрические явления в возбудимых тканях (потенциал покоя, потенциал действия, токи градиента основного обмена, токи повреждения) 25 KB
  Электрические явления в возбудимых тканях потенциал покоя потенциал действия токи градиента основного обмена токи повреждения. Происхождение электрических явлений в тканях На уровне клетки регистрируется потенциал мембраны ПД разность потенциалов между наружной и внутренней поверхности мембраны в каждый данный момент времени. Стационарно как показатели электрического состояния клетки регистрируют 2 вида потенциала мембраны ПМ: потенциал покоя ПП и потенциал действия ПД. Потенциал покояПП это разность потенциалов между...
30836. Понятие о потенциале покоя. Роль ионов К+, Na+, Ca+2, Cl- в происхождении мембранного потенциала. Калий-натриевый насос, его значение. Уравнения Нернста и Гольдмана, расчет величины мембранного потенциала 23.5 KB
  в покое мембрана поляризована. Избирательная проницаемость клеточной мембраны в покое для натрия и калия. В покое высокая проницаемость для калия а для натрия в покое она практически отсутствует небольшая. В покое за счет процесса облегченной диффузии через неуправляемые медленные калиевые каналы за счет градиента концентрации калий постоянно выходит из клетки во внеклеточное пространство это формирует постоянный выходящий калиевый ток.
30837. Потенциал действия и его фазы. Изменение проницаемости калиевых, натриевых и кальциевых каналов в процессе формирования потенциала действия 30 KB
  При нанесении раздражения увеличивается проницаемость мембраны для натрия. За счет этого процесса происходит уменьшение полярности мембраны по сравнению с исходным с 70 мВ до 4050 мВ. Критический уровень деполяризации КУД это такая величина разности потенциалов 4050 мВ при которой активируется большое количество потенциалзависимых быстрых натриевых каналов проницаемость мембраны для натрия становится максимальной и перестает быть зависимой от силы раздражителя. Возникает лавинообразный входящий натриевый ток который быстро доли...