Главная » Просмотр файлов » А.В. Ахо, М.С. Лам, Р. Сети, Дж. Д. Ульман - Компиляторы - принципы, технологии и инструментарий

А.В. Ахо, М.С. Лам, Р. Сети, Дж. Д. Ульман - Компиляторы - принципы, технологии и инструментарий (1114947), страница 24

Файл №1114947 А.В. Ахо, М.С. Лам, Р. Сети, Дж. Д. Ульман - Компиляторы - принципы, технологии и инструментарий (А.В. Ахо, М.С. Лам, Р. Сети, Дж. Д. Ульман - Компиляторы - принципы, технологии и инструментарий) 24 страницаА.В. Ахо, М.С. Лам, Р. Сети, Дж. Д. Ульман - Компиляторы - принципы, технологии и инструментарий (1114947) страница 242019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

° Как и в С, в 5ача для присваивания используется оператор =, для проверки на равенство — ==, а для проверки на неравенство — ! =. ° Конструкция г)згомв 10Ехсерс1оп в определении сегвз() объявляет, что может быть сгенерировано исключение 10ЕхсерГ1оп. Такие исключения генерируются в ситуации, когда функция азассп при помощи подпрограммы геас( не может считать очередной символ из входного потока. Любая функция, которая вызывает тагс)т, также должна объявить, что в процессе ее выполнения может быть сгенерировано исключение 10Ехсергфсп. ется цифрой. Подпрограмма 1вШс1Г применяется к символу, олнако переменная 1оо)саЬеас(, как уже говорилось, имеет тип 1пг для обеспечения возможного будущего расширения грамматики.

Конструкция ( с)таг ) 1ос)са)теас( приводит 1оо)са)зеас( к типу сваг. Небольшое отклонение от рис. 2.25 состоит в том, что семантическое действие по выводу сканируемого символа выполняется до вызова васс)т. Функция взассЬ проверяет терминалы; она считывает очередной входной терминал, если текущий сканируемый символ соответствует переданному, или в противном случае сообщает об ошибке при помощи с)згом пеи Еггсг("вупгах еггсг") 118 Глава 2. Простой синтаксически управляемый транслятор Этот код создает новое исключение класса Еггое со строкой нвуппах еггогв в качестве сообщения об ошибке. (ауа не требует объявления исключений Егтот в конструкциях и!зеоыя, поскольку они предназначены только для аварийных ситуаций, которые никогда не должны происходить.в 2.6 Лексический анализ Лексический анализатор считывает символы из входной строки и группирует их в "объекты токенов".

Вместе с терминальными символами, которые используются при синтаксическом анализе, объекты токенов несут дополнительную информацию в форме значений атрибутов. Пока что нам не требовалось отличать термины "токен" и "терминал", поскольку синтаксический анализатор игнорирует значения атрибутов в токенах. В данном разделе токен представляет собой терминал с дополнительной информацией. Последовательность входных символов, составляющая отдельный токен, называется лексемой (!ехеше). Таким образом, можно сказать, что лексический анализатор отделяет синтаксический анализатор от представления токенов в виде лексем.

Лексический анализатор в данном разделе допускает появление в выражевиях чисел, идентификаторов и пробельных символов (шЫ1езрасе), в число которых входят пробелы, символы табуляции и новой строки. Можно воспользоваться расширением транслятора выражений из предыдущего раздела. Поскольку грамматика выражений на рис. 2.2! должна быть расширена, чтобы позволять использование чисел и идентификаторов, отбит воспользоваться этой возможностью и добавить в нее умножение и деление. Такая расширенная схема трансляции приведена на рис. 2.28. На рис. 2.28 предполагается, что терминал ппгп имеет атрибут пиала(ие, который содержит целое значение, соответствующее этому терминалу. Терминал Ы имеет строковый атрибут, записываемый как !я!.!едете; предполагается, что эта строка представляет собой фактическую лексему, соответствующую данному экземпляру токена !д.

"Обработка ошибок может быть осуществлена с испояьзоввнием возможностей по обработке исключений в (втв. Один из подходов состоит в определении нового исключения, скажем, ЯупСахЕккок, который расширяет системный кввсс Ехсереьоп. Тогда в функциях Сети и павой при обнаружении ошибки следует генерировать исключении ЯупеахЕгеок вместо Егеож Обработке исключений в жаьп должна осуществляться путем помещения вызове расее. ехрг() в блок оку, который перехватывает исключение Яупеахкккот, выводиз сообщение и зявершвет работу программы. Двя этого мы должны дабввить в программу нв рис.

2.27 клесс Яупсахвктог. Дяя завершения модификвции в дополнение к спецификации исключений 10Ехсере1оп функпии жавсн н Сегш должны объявить, что они могут генерировать исключение ЯупгахЕггог. То же должно быть оделено и в функции ехрк, которая их вызывал. 119 2.6. Лексический анализ ехрг — ехрг + Гегт ) рпп1('+') ) ехрг — Гегт 1 рпп1('-') ) 1егт гегт — ~ Гегт я /асГог ) рпп1(~*') ) !ест //асгог 1 рпп1( / ) ) /асгог /асгог — ( ехрг ) ппщ и 1 рпп1(ппщ.га1ие) ) 1 рпп1(1Н.1ехете) ) Рис.

2.28. Действия лля трансляции в постфиксную запись Фрагменты псевдокода использованы для иллюстрации действий лексического анализатора, который будет включен в код 1ача в конце этого раздела. Подход, описанный в данном разделе, применим для написания лексических анализаторов вручную. В разделе 3.5 будет описан инструмент под названием 1.ех, который генерирует лексический анализатор на основе предоставляемой ему спецификации. Таблицы символов или структуры данных для хранения информации об идентификаторах рассматриваются в разделе 2.7. 2.6.1 Удаление пробельных символов и комментариев Транслятор выражений из раздела 2.5 просматривает каждый символ входного потока, так что посторонние символы, такие как пробелы, приводят к ошибке. Большинство языков программирования допускают произвольное количество пробельных символов между токенами. Аналогично в процессе синтаксического анализа игнорируются комментарии, так что они также могут рассматриваться как пробельные символы.

Если пробельные символы удаляются лексическим анализатором, синтаксический анализатор никогда не столкнется с ними. Альтернативным способом является изменение грамматики, при котором в нее включаются и пробельные символы, но он не так прост в реализации, как использование лексического анализатора для удаления пробельных символов. Псевдокод на рис.

2.29 при чтении входного потока пропускает пробельные символы, такие как пробелы, символы табуляции и новой строки. Переменная рее/г содержит очередной считываемый символ. Номер строки и контекст в сообщениях об ошибках помогают точно локализовать место ошибки; в приведенном коде используется переменная Йие, подсчитывающая символы новой строки во входном потоке.

12О Глава 2. Простой синтаксически управляемый транслятор (ог (:; рее1 = очередной считываемый символ ) ( И ( реек — пробел или символ табуляции ) до ничего; ене (('( реей — символ новой строки ) 1ше = йпе+1; ене Ьгеак; Рнс. 2.29.

Пропуск пробельных символов 2.6.2 Опережающее чтение Лексическому анализатору может потребоваться прочесть некоторое количество символов за текущим, чтобы решить, какой именно токен следует вернуть синтаксическому анализатору. Например, лексический анализатор С, встретив символ >, должен прочесть следующий за ним символ. Если он окажется символом =, то > представляет собой часть последовательности >=, лексемы токена оператора "больше или равно"; если же это символ >, то первый символ представляет собой часть последовательности », лексемы токена оператора "битовый сдвиг вправо".

В противном случае символ > сам по себе образует оператор "больше", и оказывается, что лексический анализатор прочитал один лишний символ нз входного потока. В общем случае подход к опережающему чтению входного потока состоит в поддержке входного буфера, из которого лексический анализатор может выполнять чтение и в который может возвращать прочитанные символы. Использовать входной буфер можно уже только потому, что он повышает эффективность анализатора, так как считывание блока символов обычно существенно более эффективно, чем посимвольное считывание.

Указатель отслеживает проанализированную часть входа; возврат символов во входной поток осуществляется путем простого перемещения указателя. Методы буферизации ввода рассматриваются в разделе 3.2. Обычно достаточно односимвольного опережающего чтения, так что простейшее решение состоит в использовании переменной, скажем, реей, для хранения очередного считанного символа. Лексический анализатор из этого раздела применяет опережающее на один символ чтение при сборке чисел из цифр или идентификаторов из символов; например, он считывает один символ после 1, чтобы отличить 1 от 10, и считывает один символ после г., чтобы отличить г.

от ~гце. Лексический анализатор использует опережающее чтение только тогда, когда это необходимо. Оператор наподобие * может быть идентифицирован без дополнительного чтения. В таких случаях в реей помещается пробел, который будет пропущен при вызове лексического анализатора для получения следующего токена. Инвариант в данном разделе заключается в том, что, когда лексический 121 2.6. Лексический анализ анализатор возвращает токен, переменная рее)г содержит либо символ, следую- щий за лексемой текущего токена, либо пробел.

2.6.3 Константы Везде, где в грамматике выражений встречается отдельная цифра, на ее месте естественно использовать произвольную целую константу. Целая константа может быть введена в грамматику путем либо создания для таких констант терминального символа, скажем, ппш, либо добавления в грамматику синтаксиса для целых констант. Работа по сборке последовательных цифр в целые числа и вычислению их значений обычно поручается лексическому анализатору, поскольку числа в процессе синтаксического анализа и трансляции можно рассматривать как отдельные элементы.

Когда во входном потоке встречается последовательность цифр, лексический анализатор передает синтаксичесюму анализатору токен, состоящий из терминала пцт, вместе с целочисленным атрибутом, вычисленным из цифр входного потока. Если записывать токены как кортежи в угловых скобках (), то входная строка 31+28+59 преобразуется в последовательность (пшп, 31) (+) (пцт, 28) (+) (пшп, 59) Терминальный символ + не имеет атрибутов, так что его кортеж представляет собой просто (+).

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

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

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