yacc_doc (1119422), страница 2

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

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

имеет вид:

%%

правила

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

ются, недопустимо лишь появление их в именах. Комментарий,

ограниченный символами "/*" в начале и "*/" в конце, может

находиться между любыми двумя разделителями в любой секции

входного файла.

- 6 -

Секция правил состоит из одного или нескольких грамма-

тических правил. Эти правила должны определять все допусти-

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

рукциями действия по обработке входного потока.

Назначение секции деклараций состоит в основном в зада-

нии информации о лексемах.

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

цедур на языке Си, которые должны включаться в текст прог-

раммы грамматического разбора. Например, это могут быть

процедура лексического анализа yylex и пользовательские про-

цедуры, вызываемые в действиях.

4.2. Секция правил

В данной секции с помощью набора грамматических правил

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

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

лению в секции правил лишь конструкЦии, выбранные пользова-

телем в качестве лексем, считающиеся для грамматического

анализа исходными единицами. Правила задаются в форме, близ-

кой БНФ.

Правило, определяющее синтаксический вид конструкции,

задается таким образом:

<имя_нетерминального_символа>: определение;

Здесь ":" и ";" - специальные символы yacc. Правая часть

правила - определение - представляет собой упорядоченную

последовательность элементов (нетерминальных символов и лек-

сем), составляющих описываемую конструкцию. При грамматичес-

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

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

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

задаются именами, а лексемы - именами или литералами. Запись

имен и литералов совпадает с записью идентификаторов и сим-

вольных констант, принятой в Си.

Правило:

P_Head: P_name '(' P_list ')';

определяет нетерминал P_Head как последовательность 4-х эле-

ментов: два элемента заданы литерально, два других - име-

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

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

нетерминалов все имена, не объявленные в секции деклараций

именами лексем (разд.4.3). Все нетерминалы должны быть

- 7 -

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

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

правил, определяющих один нетерминальный символ, т.е. правил

с одинаковой левой частью. Такие правила определяют конст-

рукции, идентичные на некотором уровне. Ниже приводятся три

правила, определяющие виды операторов в некотором языке:

statement : assign_stat ;

statement : if_then_stat;

statement : goto_stat;

Правила с общей левой частью можно задавать в сокращен-

ной записи, без повторения левой части, используя для разде-

ления альтернативных определений символ "|". Предыдущие пра-

вила можно переписать в виде:

statement : assign_stat |

if_then_stat |

goto_stat;

При необходимости с любым правилом можно связать дейст-

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

при каждом распознавании конструкции во входном тексте.

Действие не является обязательным элементом правил.

Действие заключается в фигурные скобки и помещается

вслед за правой частью правила, т.е. правило с действием

имеет вид:

<имя_нетерминального_символа>:

определение {действие};

Точка с запятой после правила с действием может опускаться.

При использовании сокращенной записи правил с общей

левой частью следует иметь в виду, что действие может отно-

ситься только к отдельному правилу, а не к их совокупности.

Следующий пример иллюстрирует задание действий в случае пра-

вил с общей левой частью.

statement: assign_stat

|

if_then_stat {printf("if_оператор\n");}

|

goto_stat {kgoto++;

printf("goto_оператор\n");}

- 8 -

На операторы, входящие в действия, не накладывается

никаких ограничений. В частности, в действиях могут содер-

жаться вызовы любых функций. Отдельные операторы могут быть

помечены, к ним возможен переход из других действий.

Существует возможность задания действий, которые будут

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

вила. Действие в этом случае помещается после одного из эле-

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

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

передано управление.

Например, в правиле

if_then_stat: if'(' expression ')' {действие1}

then statement ';' {действие 2}

действия заданы с таким расчетом, чтобы при разборе строки

вида

if (a>b) then x=a;

действие 1 выполнялось при нахождении правой круглой скобки,

а действие 2 - по окончании разбора.

Для того, чтобы действия имели реальный смысл, они, как

правило, должны использовать некоторые общие переменные,

т.е. переменные, доступные во всех действиях и сохраняющие

свои значения по окончании очередного действия. Такие пере-

менные описываются в начале секции правил, все описание

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

%{

и

%}

Здесь же могут находиться произвольные операторы Си, расс-

матриваемые как общие действия для всех правил.

Дополним приведенный выше фрагмент спецификаций для

statement с тем, чтобы осуществлялся подсчет и вывод на

печать операторов goto

- 9 -

%{

int kgoto;

%}

prog: DECLS {kgoto=0;}

stats {printf("%d\n",kgoto);}

stats: statement

| stats statement;

statement:assign_stat

...

|

if_then_stat

...

|

goto_stat {kgoto++;

... }

Укажем еще на два вида объектов, использующихся в

действиях. Это, во-первых, глобальные переменные, которые

описываются в секции деклараций (разд.4.3), и, во-вторых,

специальные переменные (псевдопеременные),облегчающие взаи-

мосвязь между действиями и связь их с лексическим анализато-

ром. Работе с псевдопеременными посвящен раздел 4.5. Струк-

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

чески, т.е. каждое правило соответствует определенному

уровню структурного разбиения. Однако, последовательность

задания правил может не отражать этой иерархии и быть вполне

произвольной. Единственно необходимой для yacc является

информация о том, какой из нетерминалов задает вершину

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

ной текст в целом. Этот нетерминал принято называть началь-

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

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

нию yacc считает начальным символом тот нетерминал, имя

которого стоит в левой части первого из правил. Однако, если

определять начальный символ в первом правиле пользователю

неудобно, он может явно задать имя начального символа в сек-

ции деклараций.

Существует два специфических вида правил, на которые

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

вида

<имя_нетерминального_символа>: ;

определяющее пустую последовательность символов. Сочетание

пустого правила с другими правилами, определяющими тот же

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

необязательность вхождения соответствующей конструкции.

Например, совокупность правил

- 10 -

целое_число:знак целое_без_знака;

знак: | '+'|'-';

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

него. Другой способ описать эту возможность состоит в зада-

нии следующей группы правил:

целое_число:знак целое_без_знака |

целое_без_знака ;

знак: '+'|'-';

С пустым правилом может быть обычным образом связано

действие:

ИМЯ: {тело_действия} ;

Во-вторых, правила часто описывают некоторую конструкцию

рекурсивно, т.е. правая часть может рекурсивно включать

определяемый нетерминальный символ. Различают леворекурсив-

ные правила вида:

<имя_нетерминала>:<имя_нетерминала>

<многократно_повторяемый_фрагмент>;

и праворекурсивные вида

<имя_нетерминала>:

<многократно_повторяемый_фрагмент>

<имя_нетерминала>;

yacc допускает оба вида рекурсивных правил, однако при

использовании правил с правой рекурсией объем анализатора

увеличивается, а во время разбора возможно переполнение

внутреннего стека анализатора.

Рекурсивные правила необходимы при задании последова-

тельностей и списков. Следующие примеры иллюстрируют уни-

версальный способ описания этих конструкций:

последовательность: элемент

| последовательность элемент;

список: элемент|список ',' элемент;

- 11 -

Заметим, что в каждом из этих случаев первое правило (не

содержащее рекурсии) будет применено только для первого эле-

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

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

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

ным числом рекурсивных и нерекурсивных правил. Например,

группа правил

идентификатор: буква |

'$' |

идентификатор буква|

идентификатор цифра|

идентификатор '_' ;

описывает идентификатор как последовательность букв, цифр и

символов "_", начинающуюся с буквы или символа "$". Следует

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

смысла, если для определяемого ими нетерминала не задано ни

одного правила без рекурсии. Для обеспечения возможности

задания пустых списков или последовательностей в качестве

нерекурсивного правила используется пустое:

последовательность :

| последовательность элемент ;

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

способом представления грамматик и ведет к большей их общ-

ности, однако,некорректное использование пустых правил может

вызывать конфликтные ситуации (раздел 5) из-за неоднознач-

ности выбора нетерминала, соответствующего пустой последова-

тельности.

4.3. Секция деклараций

Секция деклараций состоит из последовательности строк

двух видов: строк-директив и строк исходного текста.

Строки исходного текста без изменений копируются в

выходной файл y.tab.c и могут содержать операторы препроцес-

сора и описание внешних объектов. Область действия перемен-

ных, описанных в секции деклараций, распространяется на весь

спецификационный файл, т.е. они доступны как в операторах

действий, так и в процедурах, находящихся в секции программ.

Строки-директивы начинаются символом "%" (этот символ в

yacc играет роль своего рода esc-символа). Две специальные

директивы

- 12 -

%{

и

%}

ограничивают с двух сторон группы строк исходного текста.

Остальные директивы служат для задания дополнительной инфор-

мации о грамматике.

5. Декларация имен лексем

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

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

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

Синтаксические и лексические анализаторы
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
Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7027
Авторов
на СтудИзбе
260
Средний доход
с одного платного файла
Обучение Подробнее