lex_doc (1119420), страница 5

Файл №1119420 lex_doc (Синтаксические и лексические анализаторы) 5 страницаlex_doc (1119420) страница 52019-05-09СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 5)

yywrap(){

if( b1 == 0 && b2 == 0 )

printf("В программе\

отсутствует функция main.\n");

if( b1 >= 1 && b2 >= 1 ){

printf("Многократное\

определение функции main.\n");

} else {

if(b1 == 1 )

printf("Функция main\

28

с аргументами.\n");

if( b2 == 1 )

printf("Функция main\

без аргументов.\n");

}

printf("Включений файлов: %d.\n",a2);

printf("Условных компиляций: %d.\n",a3);

printf("Определений: %d.\n",a1);

printf("Меток: %d.\n",c);

return(1);

}

Оператор return(1) в функции yywrap указывает, что лек-

сический анализатор должен завершить работу. Если необходимо

продолжить работу анализатора для чтения данных из нового

файла, нужно указать return(0), предварительно осуществив

операции закрытия и открытия файлов и, в этом случае, анали-

затор продолжит чтение и обработку входного потока. Однако,

если yywrap не возвращает 1, то это приводит к бесконечному

циклу.

6. Функция REJECT

Обычно lex разделяет входной поток, не осуществляя

поиск всех возможных соответствий каждому выражению. Это

означает, что каждый символ рассматривается один и только

один раз. Предположим, что мы хотим подсчитать все вхождения

цепочек she и he во входном тексте. Для этого мы могли бы

записать следующие правила:

she s++;

he h++;

. |

\n ;

Так как she включает в себя he, анализатор не распознает те

вхождения he, которые включены в she, так как, прочитав один

раз she, эти символы он не вернет во входной поток.

Иногда желательно переопределить этот выбор. Действие

функции REJECT означает "выбрать следующую альтернативу".

Это приводит к тому, что каким бы ни было правило, после

него необходимо выполнить второй выбор. Соответственно изме-

нится и положение указателя во входном потоке:

29

she { s++; REJECT; }

he { h++; REJECT; }

. |

\n ;

Здесь после выполнения одного правила символы возвращаются

назад во входной поток, и выполняется другое правило.

Функция REJECT полезна в том случае, когда она применя-

ется для определения всех вхождений какого-либо объекта,

причем вхождения могут перекрываться или включать друг

друга. Предположим, необходимо получить из одного потока

таблицу всех двухбуквенных сочетаний, которые обычно перек-

рываются, например, слово the содержит как th, так и he.

Допустим, имеется двумерный массив digram, тогда:

%%

[a-z][a-z] {

digram[yytext[0]][yytext[1]]++;

REJECT;

}

\n ;

Здесь REJECT используется для выделения буквенных пар, начи-

нающихся на каждой букве, а не на каждой следующей.

7. Функции yyless и yymore

В обычной ситуации содержимое yytext обновляется всякий

раз, когда на входе появляется следующая строка. Напомним,

что в yytext всегда находятся символы распознанной последо-

вательности. Иногда возникает необходимость добавить к теку-

щему содержимому yytext следующую распознанную цепочку сим-

волов. Для этой цели используется функция yymore. Формат

вызова этой функции:

yymore()

В некоторых случаях возникает необходимость использовать не

все символы распознанной последовательности в yytext, а

только необходимое их число. Для этой цели используется

функция yyless. Формат ее вызова:

yyless(n)

где n указывает, что в данный момент необходимы только n

символов строки в yytext. Остальные найденные символы будут

возвращены во входной поток.

Пример использования фунцкии yymore:

30

.

.

.

\"[^"]* {

if( yytext[yyleng - 1] == '\\'){

yymore();

}else{

/*

* здесь должна быть часть

* программы, обрабатывающая

* закрывающую кавычку.

*/

}

}

.

.

.

В этом примере распознаются строки симвoлов, взятые в двой-

ные кавычки, причем символ двойная кавычка внутри этой

строки может изображаться с предшествующей косой чертой.

Анализатор должен распознавать кавычку, ограничивающую

строку, и кавычку, являющуюся частью строки, когда она изоб-

ражена как \".

Допустим, на вход поступает строка "абв\"где". Сначала

будет распознана цепочка "абв\ и, так как последним символом

в этой цепочке будет символ "\", выполнится вызов yymore().

В результате к цепочке "абв\ будет добавлено "где, и в

yytext мы получим: "абв\"где, что и требовалось.

Пример использования фунции yyless:

.

.

.

=-[A-ZА-Яa-zа-я] {

printf("Oператор (=-) двусмысленный.\n");

yyless(yyleng - 2);

/*

* здесь необходимо указать

* действия для случая "=-"

*/

}

.

.

.

В этом примере разрешается двусмысленность выражения "=-

31

буква" в языке Си. Это выражение можно рассматривать как

"=- буква" (равносильно "-=" )

или

"= -буква"

Предположим, что желательно эту ситуацию рассматривать как

"= -буква" и выводить пердупреждение. Указанное в примере

правило распознает эту ситуацию и выводит предупреждение.

Затем, в результате вызова "yyless(yyleng - 2);" два сим-

вола "-буква" будут возвращены во входной поток, а знак "="

останется в yytext для обработки, как в нормальной ситуации.

Таким образом, при продолжении чтения входного потока уже

будет обрабатываться цепочка "-буква", что и требовалось.

8. Совместное использование lex и yacc

yacc требует указание лексическому анализатору имени

yylex(). Именно поэтому эта функция так называется в lex.

Известно, что yacc строит выходной файл y.tab.c .

Основной в файле y.tab.c является функция yyparse, реализую-

щая алгоритм грамматического разбора. Функция yyparse содер-

жит многократное обращение к функции лексического анализа

yylex.

Для обеспечения корректной работы грамматического ана-

лизатора функция yylex должна быть согласована с конкретной

спецификацией грамматики и удовлетворять определенным требо-

ваниям.

Пользователь при описании грамматики решает, какие

конструкции целесообразнее непосредственно выделять из вход-

ного текста на этапе лексического анализа.

Сложность лексического анализатора зависит от того,

какие структурные единицы взяты за основу при описании грам-

матических правил. Детализовав грамматику до отдельных сим-

волов, можно обойтись простейшим лексическим анализатором.

Однако, в этом случае число правил растет, а грамматический

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

обычно должен найти некоторый компромисс при выборе набора

лексем.

Заметим, что ключевые слова описываемого входного языка

часто бывает удобно считать лексемами. Имена лексем могут

совпадать с этими ключевыми словами, недопустимым является

лишь совпадение имен лексем с зарезервированными словами

языка Си.

Основная задача функции yylex состоит во вводе из вход-

ного потока ряда очередных символов до выявления конструк-

ции, соответствующей одной из лексем, и возвращении номера

32

типа этой лексемы и, когда это необходимо, значения этой

лексемы.

Все виды лексем, кроме литералов, обозначаются некото-

рыми именами и под этими именами фигурируют в Yacc-

программе, где объявление имен лексем осуществляется дирек-

тивой token:

%token <список имен лексем>

Благодаря объявлению имен лексем в директиве token, yacc

отличает имена лексем от имен нетерминальных символов.

Пример объявления имен лексем в Yacc-программе:

%token IDENT CONST ЗНАК IF THEN GOTO

При первом появлении лексемы или литерала в секции объявле-

ний Yacc-программы за каждым из них может следовать неотри-

цательное целое число, рассматриваемое как номер_типа лек-

семы.

По умолчанию номера типов всех лексем определяются yacc

следующим образом:

- для литерала номером типа лексемы считается числовое

значение данного литерального символа, рассматривае-

мого как однобайтовое целое число;

- лексемы, обозначенные именами, в соответствии с оче-

редностью их объявления получают последовательные

номера, начиная с 257.

Для каждого имени лексемы независимо от того, переопре-

делен ли ее номер пользователем, yacc генерирует в выходном

файле y.tab.c оператор препроцессора:

#define <имя_лексемы> <номер_типа>

Значение, возвращаемое функцией yylex, является номером типа

лексемы. Таким образом, список лексем и номера их типов ука-

зываются в Yacc-программе, а определения этих лексем в Lex-

программе. Возникает проблема соответствия номеров типов

лексем в файлах y.tab.c и lex.yy.c, котороя разрешается сле-

дующим образом:

- при вызове yacc с флагом -d последовательность опера-

торов #define помещается в файл y.tab.h.;

- этот файл посредством оператора #include включается в

Lex-программу.

33

В процедуре лексического анализа кроме выделения лексем

можно предусмотреть некоторую обработку лексем определенных

типов, в частности, запоминание конкретных значений лексем.

Примером значения лексемы могут служить числовое значе-

ние символа - цифры, вычисленное значение константы, адрес

идентификатора в таблице имен (построение таблицы имен осу-

ществляет lex). Кроме того, эти значения обычно требуется

передать грамматическому анализатору. С этой целью нужное

значение должно быть присвоено внешней переменной целого

типа с именем yylval. Если функция yylex находится в отдель-

ном файле, то эта переменная должна быть объявлена:

extern int yylval;

Уточним, что значением_лексемы будем называть значение,

присвоенное при ее распознавании переменной yylval. Заметим,

что в yylval всегда должно находится значение последней

выделенной лексемы.

Допустим, мы располагаем Yacc-программой в файле

source.y и Lex-программой в файле source.l, которые необхо-

димо собрать в работающую программу. Существует два способа

сборки:

- сборка Lex- и Yacc-программы с созданием файла

y.tab.h;

- сборка Lex- и Yacc-программы без создания файла

y.tab.h.

Рассмотрим первый способ сборки.

Ниже приведен пример makefile для программы make, кото-

рая осуществляет последовательную обработку и сборку эих

программ и размещает результат в файле program:

34

program: y.tab.o lex.yy.o

cc y.tab.o lex.yy.o -ly -ll -o program

y.tab.o: y.tab.c

cc -c -O y.tab.c

lex.yy.o: lex.yy.c y.tab.h

cc -c -O lex.yy.c

y.tab.h:

y.tab.c: source.y

yacc -d source.y

lex.yy.c: source.l

lex -v source.l

Характеристики

Список файлов учебной работы

Синтаксические и лексические анализаторы
Coco-R
Программа - для С++
CocoR
Coco.exe
Action.cpp
Action.h
ArrayList.cpp
ArrayList.h
BitArray.cpp
BitArray.h
CharClass.cpp
CharClass.h
CharSet.cpp
CharSet.h
Coco.atg
Coco.cpp
Comment.cpp
Comment.h
Copyright.frame
DFA.cpp
DFA.h
Generator.cpp
Generator.h
Graph.h
HashTable.cpp
HashTable.h
Makefile.
Melted.cpp
Melted.h
Node.cpp
Node.h
Parser.cpp
Parser.frame
Parser.h
ParserGen.cpp
Parser.frame
Scanner.frame
Taste
Coco.exe
CodeGenerator.h
Copyright.frame
Makefile.
Parser.cpp
Parser.frame
Parser.h
Scanner.cpp
Scanner.frame
Scanner.h
SymbolTable.cpp
SymbolTable.h
Taste.IN
Taste.atg
Taste.cpp
Taste.exe
Test.TAS
build.bat
coc.bat
run.bat
__MACOSX
Taste
._Scanner.frame
cocorc17 - for unix.tgz
Разные мануалы
Примеры
Taste
Coco.exe
CodeGenerator.h
Copyright.frame
Makefile.
Parser.cpp
Parser.frame
Parser.h
Scanner.cpp
Scanner.frame
Scanner.h
SymbolTable.cpp
SymbolTable.h
Taste.IN
Taste.atg
Taste.cpp
Taste.exe
Test.TAS
build.bat
Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7028
Авторов
на СтудИзбе
260
Средний доход
с одного платного файла
Обучение Подробнее