Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LexBisonLabs

.pdf
Скачиваний:
5
Добавлен:
02.04.2015
Размер:
867.83 Кб
Скачать

31

extern int debug;

void yyerror(char const* msg);

int yylex();

int lineno();

%}

 

 

%union {

 

 

char

*string;

/* string buffer for token values */

}

 

 

%token <string> AP_ASPECT_KW AP_AGENT_KW AP_USERS_KW AP_DATABASE_KW AP_INSTRUMENT_KW AP_COLON AP_PAGE_KW AP_CARD_KW AP_PORT_KW AP_DESCR_KW AP_STATUS_KW AP_ONLINE_KW AP_OFFLINE_KW AP_DEFAULT_KW AP_PROFILE_KW AP_LASTNAME_KW AP_FIRSTNAME_KW AP_TYPE_KW AP_GROUP_KW AP_TEAM_KW AP_COS_KW AP_NUMBER_KW AP_EXT_KW AP_TOTAL_KW AP_RECORDS_KW AP_NEW_LINE AP_NUMBER AP_IDENTIFIER AP_SEMI AP_SLASH AP_NUM

%%

 

section

: header database counter ;

database : databasetypeusr databaseheaderusr usrstatements ;

databasetypeusr

: AP_USERS_KW AP_DATABASE_KW

{

 

if (debug)

 

printf("DEBUG: line(%d): agents database\r\n",lineno() );

}

;

databaseheaderusr : AP_DEFAULT_KW AP_DEFAULT_KW AP_EXT_KW AP_NUM AP_LASTNAME_KW AP_FIRSTNAME_KW AP_TYPE_KW AP_GROUP_KW AP_TEAM_KW

{

if (debug)

printf("DEBUG: line(%d): agent header reached\r\n",lineno() );

}

;

usrstatements : /* empty */

| usrstatements usrstatement ;

usrstatement : ap_active_agent ;

31

32

ap_active_agent: AP_NUMBER AP_IDENTIFIER AP_IDENTIFIER AP_AGENT_KW AP_NUMBER AP_NUMBER

{

std::cout << $1 << "," << $2 << "," << $3 << "," << $4 << "," << $5 << "," << $6 << std::endl;

}

;

 

 

counter

:

counterstr | /*empty*/;

counterstr

:

AP_TOTAL_KW AP_RECORDS_KW AP_COLON AP_NUMBER

{

 

 

if (debug)

printf("DEBUG: line(%d):End of file footer reached\r\n",lineno());

}

;

header

: AP_EXT_KW AP_NUMBER datetime AP_ASPECT_KW

 

AP_PAGE_KW AP_NUMBER

{

 

if (debug)

printf("DEBUG: line(%d): SA - header reached\r\n",lineno() );

}

;

datetime : AP_NUMBER AP_COLON AP_NUMBER AP_IDENTIFIER AP_SEMI AP_NUMBER AP_SLASH AP_NUMBER AP_SLASH AP_NUMBER

{

if (debug)

printf("DEBUG: line(%d): datetime readed\r\n",lineno() );

}

;

%%

Приведенный текст может быть обработан утилитой bison с целью получения файла с C/C++ реализацией анализатора (aspect_parser.cpp), а также - файла с определением констант, используемых в качестве кодов лексем в сканере (aspect_parser.cpp.h).

После получения перечисленных файлов, для реализации полнофункционального приложения необходимо использовать сканер. В рассматриваемом примере будем использовать объектно-ориентированную версию сканера, созданного утилитой flex на основе файла описания из примера для предыдущей лабораторной работы. При этом для интеграции с созданным анализатором описание сканера должно быть изменено следующим образом:

32

33

1)В секции определений следует использовать директиву include с именем ранее со-

зданного файла aspect_parser.cpp.h

2)Во всех действиях, ассоциированных с лексемами, заменить:

tmpstr = strdup(yytext);

на

yylval.string = strdup(yytext);

так как теперь сканеру доступна глобальная переменная yylval, которую использует код синтаксического анализатора в качестве источника информации о значении лексем. Объявление данной переменной присутствует во включаемом файле aspect_parser.cpp.h

8. Использование синтезированного программного кода

Основной код приложения, определяющий точку входа в программу и делающий необходимые объявления для интеграции сканера и анализатора, представлен ниже:

#include <iostream> #include <fstream> #include "FlexLexer.h"

extern int debug;

yyFlexLexer* lexer = NULL; //this is reference to global scanner

int debug = 1; // parser to produce debug info output

int yyparse();//parser function,implemented by bison declaration int yylex() // wrapper for scanner function, bison looks it

{

if (lexer != NULL)

return lexer->yylex();

else

return 0;

}

void yyerror(char const* msg) // bison looks for it

{

std::cerr << msg << std::endl;

}

int lineno()

{

if (lexer != NULL)

return lexer->lineno();

else

return 0;

}

33

34

int main (int argc, char* argv[])

{

if (argc < 2) {

std::cout << "USE: cbisonparser <source file>"

<<std::endl;

return 0;

}

std::ifstream infile(argv[1]); lexer = new yyFlexLexer(&infile); if (yyparse() != 0)

{

std::cout << "Syntax error, document rejected" << std::endl;

} else

std::cout << "Success" << std::endl; return 0;

}

Результатом ее выполнения, при условии, что в файле, указанном в качестве параметра при запуске, находятся данные, описанные в примере для предыдущей лабораторной работы, будет вывод на экран следующей информации:

201,TEST,TEST,Agent,20,0

202,TEST,TEST,Agent,21,0

203,TEST,TEST,Agent,23,0

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

9. Задание на лабораторную работу

Используя утилиту bison, разработать программу синтаксического анализа и обработки текстовых данных в соответствии с вариантом задания. В ходе выполнения необходимо, используя ранее созданное определение сканера текстов для варианта задания из предыдущей лабораторной работы, сформировать описание синтаксического анализатора, модифицировав, при необходимости, определение текстового сканера. По созданным описаниям выполнить генерацию кода сканера и анализатора с реализацией методов обработки текстовых данных. Скомпилировать действующую программу посредством любого доступного компилятора C/C++. В отчете по лабораторной работе привести текст описания сканера и синтаксического анализатора вместе с протоколом тестового выполнения созданной на основе описания программы, включая исходные данные и полученные результаты.

10. Варианты заданий

Используя вариант задания на предыдущую лабораторную работу, выполнить 1) Форматирование табличных данных с целью удаления заголовка таблицы

34

35

2)Печать таблицы сопоставления DN (Directory Numbers) именам пользователя

(NAME)

3)Проверку правильности содержания графы таблицы «Итого к оплате» с выводом результатов проверки на экран

4)Вычисление средней стоимости минуты междугородной и международной связи с выводом результатов вычислений на экран

5)Печать таблицы авансового отчета с заполненными графами «Итого получено» и «Остаток»

6)Печать квитанции с дополнительной строкой «К оплате» и указанием соответствующей суммы для оплаты

7)Печать списка кафедр-рецензентов с указанием часов на рецензирование работ студентов госбюджетной и контрактной форм обучения

8)Печать списка групп третьего курса

Библиографический список

1.Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиляции. Т.1. Синтаксический анализ. М.: Мир, 1978. - 612c.

2.Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиляции. Т.2.Компиляция. М.: Мир, 1978. - 612c.

3.A.Ахо и др. Компиляторы: принципы, технологии и инструменты.-М.: «Вильямс», 2001. – 768с.

4.Гладкий А. В. Формальные грамматики и языки. - М.: Наука. 1983.- 266 с.

5.В.А. Серебряков, Текст лекций по конструированию компиляторов, М.: МГУ,

1993 http://redsun.cs.msu.su/~amc/lectures/conscomp.htm

6.Flex, version 2.5. A fast scanner generator. Users Manual. http://www.gnu.org/software/flex/manual/html_mono/flex.html

7.

Bison

tool,

Users

Manual

 

http://www.gnu.org/software/bison/manual/html_mono/bison.html.gz

 

8.Молчанов А.Ю., Системное программное обеспечение: Учебник для вузов. СПб.: Питер, 2003

 

Содержание

 

Лабораторная работа № 1............................................................................................................

3

1.

Лексический анализ и регулярные выражения..................................................................

3

2.

Структура сканера текстов, создаваемого утилитой flex ................................................

4

3.

Файл описания сканера ........................................................................................................

6

4.

Параметры flex......................................................................................................................

8

5.

Пример описания сканера....................................................................................................

9

6.

Использование синтезированного программного кода ..................................................

13

7.

Задание на выполнение лабораторной работы ................................................................

16

8.

Варианты заданий...............................................................................................................

16

Лабораторная работа №2...........................................................................................................

20

1.

Синтаксический анализ и магазинные автоматы ............................................................

20

35

 

 

36

2.

Построение набора правил для описания формального языка .....................................

22

3.

Структура анализатора, создаваемого утилитой bison ...................................................

23

4.

Файл описания синтаксического анализатора .................................................................

25

5.

Параметры утилиты bison ..................................................................................................

28

6.

Типичные ошибки при составлении грамматики............................................................

29

7.

Пример описания синтаксического анализатора.............................................................

30

8.

Использование синтезированного программного кода ..................................................

33

9.

Задание на лабораторную работу.....................................................................................

34

10. Варианты заданий.............................................................................................................

34

Библиографический список ......................................................................................................

35

36

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]