Главная » Просмотр файлов » И.А. Волкова, А.А. Вылиток, Т.В. Руденко - Формальные грамматики и языки. Элементы теории трансляции

И.А. Волкова, А.А. Вылиток, Т.В. Руденко - Формальные грамматики и языки. Элементы теории трансляции (1114891), страница 9

Файл №1114891 И.А. Волкова, А.А. Вылиток, Т.В. Руденко - Формальные грамматики и языки. Элементы теории трансляции (И.А. Волкова, А.А. Вылиток, Т.В. Руденко - Формальные грамматики и языки. Элементы теории трансляции) 9 страницаИ.А. Волкова, А.А. Вылиток, Т.В. Руденко - Формальные грамматики и языки. Элементы теории трансляции (1114891) страница 92019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

9. ДС для модельного языка.44Элементы теории трансляции / Задачи лексического анализаНа рис. 9 приведена диаграмма состояний для модельного языка. Лексический анализможет проводиться независимо от последующих этапов трансляции. В этом случае исходныйфайл с текстом программы преобразуется в последовательность лексем во внутреннем представлении согласно построенной ДС; затем эта последовательность подается на вход синтаксическому анализатору.Мы реализуем другой подход: лексический анализатор выдает очередную лексему потребованию синтаксического анализатора и затем «замирает», пока к нему не обратятся заследующей лексемой. При таком подходе действие Lex(k, l); в ДС означает return Lex(k, l);.Кроме того, вместо перехода в состояние ошибки ER генерируется исключение с указаниемсимвола, который привел к ошибочной ситуации.

Перехватываться и обрабатываться исключения будут не в лексическом анализаторе, а в основной программе, содержащей анализатор. Обработка исключения состоит в выводе сообщения об ошибке и корректном завершении программы.Непосредственно реализует ЛА по ДС функция get_lex():Lex Scanner::get_lex (){int d, j;CS = H;do{switch ( CS ){case H:if ( c ==' ' || c =='\n' || c=='\r' || c =='\t' )gc ();else if ( isalpha(c) ){clear ();add ();gc ();CS = IDENT;}else if ( isdigit(c) ){d = c - '0';gc ();CS = NUMB;}else if ( c== '{' ){gc ();CS = COM;}else if ( c== ':' || c== '<' || c== '>'){clear ();add ();gc ();CS = ALE;}else if ( c == '@' )return Lex(LEX_FIN);45Элементы теории трансляции / Задачи лексического анализаelse if ( c == '!' ){clear ();add ();gc ();CS = NEQ;}elseCS = DELIM;break;case IDENT:if ( isalpha(c) || isdigit(c) ){add ();gc ();}elseif ( j = look (buf, TW) )return Lex (words[j], j);else{j = TID.put(buf);return Lex (LEX_ID, j);}break;case NUMB:if ( isdigit(c) ){d = d * 10 + (c - '0');gc();}elsereturn Lex ( LEX_NUM, d );break;case COM:if ( c == '}' ){gc ();CS = H;}else if (c == '@' || c == '{' )throw c;elsegc ();break;case ALE:if ( c == '=' ){add ();gc ();j = look ( buf, TD );return Lex ( dlms[j], j );}else{46Элементы теории трансляции / Синтаксический анализj = look (buf, TD);return Lex ( dlms[j], j );}break;case NEQ:if ( c == '=' ){add ();gc ();j = look ( buf, TD );return Lex ( LEX_NEQ, j );}elsethrow '!';break;case DELIM:clear ();add ();if ( j = look(buf, TD) ){gc ();return Lex ( dlms[j], j );}elsethrow c;break;}// end switch}while ( true );}Синтаксический анализНа этапе синтаксического анализа нужно:1) установить, имеет ли цепочка лексем структуру, заданную синтаксисом языка, и2) зафиксировать эту структуру.Следовательно, снова надо решать задачу разбора: дана цепочка лексем, и надо определить, выводима ли она в грамматике, определяющей синтаксис языка.

Если да, то построить вывод этой цепочки или дерево вывода. Однако структура таких конструкций как выражение, описание, оператор и т.п., более сложная, чем структура идентификаторов и чисел.Поэтому для описания синтаксиса языков программирования нужны более мощные грамматики, чем регулярные. Обычно для этого используют КС-грамматики, правила которых име*ют вид A → α, где A ∈ N, α ∈ (T ∪ N ) . Грамматики этого класса, с одной стороны, позволяют вполне адекватно описать синтаксис реальных языков программирования; с другой стороны, для разных подклассов КС-грамматик построены достаточно эффективные алгоритмыразбора.47Элементы теории трансляции / Синтаксический анализИз теории синтаксического анализа известно, что существует алгоритм, который полюбой данной КС-грамматике и данной цепочке выясняет, принадлежит ли цепочка языку,порождаемому этой грамматикой.

Но время работы такого алгоритма (синтаксического анализа с возвратами) экспоненциально зависит от длины цепочки, что с практической точкизрения совершенно неприемлемо.Существуют табличные методы анализа ([3]), применимые ко всему классу КСграмматик и требующие для разбора цепочек длины n времени Cn3 (алгоритм Кока-ЯнгераКасами), где C — константа, либо Cn2 (алгоритм Эрли). Их разумно применять только в томслучае, если для интересующего нас языка не существует грамматики, по которой можно построить анализатор с линейной временной зависимостью от длины цепочки (такими языкамимогут быть, например, подмножества естественного языка).При разработке языков программирования их синтаксис обычно стараются сделатьтаким, чтобы время на анализ было прямо пропорционально длине программы. Алгоритмыанализа, расходующие на обработку входной цепочки линейное время, применимы только кнекоторым подклассам КС-грамматик.Различные методы синтаксического анализа, или разбора, основываются на разныхпринципах, и используют различные техники построения дерева вывода.

Каждый методпредполагает свой способ построения по грамматике программы-анализатора, которая будетосуществлять разбор цепочек. Корректный анализатор завершает свою работу для любойвходной цепочки и выдает верный ответ о принадлежности цепочки языку. Анализатор некорректен, если:ƒ не распознает хотя бы одну цепочку, принадлежащую языку;ƒ распознает хотя бы одну цепочку, языку не принадлежащую;ƒ зацикливается на какой-либо цепочке.Говорят, что метод анализа применим к данной грамматике, если анализатор, построенный в соответствии с этим методом, корректен.Рассмотрим один из фундаментальных методов разбора, применимый к некоторомуподклассу КС-грамматик.Метод рекурсивного спускаПример: пусть дана грамматика G1 = 〈 {a, b, c, d}, {S, A, B}, P, S 〉 , гдеP:SAB→ ABd→ a | cA→ bAи надо определить, принадлежит ли цепочка cabad языку L(G1).

Построим левый вывод этойцепочки: S → ABd → cABd → caBd → cabAd → cabad.Следовательно, цепочка cabad принадлежит языку L(G1).Построение левого вывода эквивалентно построению дерева вывода методом сверхувниз (нисходящим методом), при котором на очередном шаге раскрывается самый левый нетерминал в частично построенном дереве ( рис. 10):48Элементы теории трансляции / Синтаксический анализSSA⇒B⇒⇒AcabadcSASBABAbadadAadB⇒AabS⇒⇒cacaAbAadcaAbРис. 10. Построение левого вывода.Метод рекурсивного спуска (РС-метод) реализует разбор сверху-вниз и делает это спомощью системы рекурсивных процедур.Для каждого нетерминала грамматики создается своя процедура, носящая его имя;ее задача — начиная с указанного места исходной цепочки найти подцепочку, которая выводится из этого нетерминала.Если такую подцепочку найти не удается, то процедура завершает свою работу, сигнализируя об ошибке.

Это означает, что цепочка не принадлежит языку; разбор останавливается.Если подцепочку удалось найти, то работа процедуры считается нормально завершенной и осуществляется возврат в точку вызова.Тело каждой такой процедуры пишется непосредственно по правилам вывода (по альтернативам) соответствующего нетерминала: для правой части каждого правила осуществляется поиск подцепочки, выводимой из этой правой части. При этом терминалы из правойчасти распознаются самой процедурой, а нетерминалы соответствуют вызовам процедур, носящих их имена. После распознавания каждого терминала процедура считывает следующийсимвол из исходной цепочки, который становится текущим анализируемым символом.

Выбор нужной альтернативы осуществляется процедурой по первому символу из еще нерассмотренной части исходной цепочки (т. е. по текущему символу).Работа системы процедур начинается с главной функции main( ). Она считывает первый символ исходной цепочки (заданной во входном потоке stdin) и вызывает процедуру S( ),которая проверяет, выводится ли входная цепочка из начального символа S (в общем случаеэто делается с участием других процедур, которые, в свою очередь, рекурсивно могут вызывать и саму S( ) для анализа фрагмента исходной цепочки). Будем полагать, что в конце любой анализируемой цепочки всегда присутствует символ ⊥ (признак конца цепочки)16), такчто в задачу main( ) входит также распознавание символа ⊥.

Можно считать, что main( ) соответствует добавленному в грамматику правилу M → S⊥, где M — новый начальный символ.16)На практике этим признаком может быть ситуация «конец файла» или «конец строки».49Элементы теории трансляции / Синтаксический анализПример. Совокупность процедур рекурсивного спуска для грамматикиG1:S → ABdA → a | cAB → bAбудет такой:#include <iostream>using namespace std;int c;void A ();void B ();void gc (){cin >> c;}// текущий анализируемый символ// считать очередной символvoid S (){cout << "S-->ABd, "; // применяемое правило выводаA();B();if ( c != 'd' )throw c;gc ();}void A (){if ( c =='a' ){cout << "A-->a, ";gc ();}else if ( c =='c' ){cout << "A-->cA, ";gc ();A ();}elsethrow c;}void B (){if ( c =='b' ){cout << "B-->bA, ";gc ();A ();}50Элементы теории трансляции / Синтаксический анализelsethrow c;}int main (){try{gc ();S ();if ( c != '⊥' )throw c;cout << "SUCCESS !!!" << endl;return 0;}catch ( int c ){cout << "ERROR on lexeme" << c << endl;return 1;}}Для цепочки, выводимой из S, программа напечатает (помимо сообщения об успехе)последовательность правил, применяемых при нисходящем построении дерева вывода дляданной цепочки (эта же последовательность годится для построения левого вывода).

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

Список файлов книги

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