lex (813547), страница 8
Текст из файла (страница 8)
Например, следующая последовательность строк регулярных определений формируетмакрос IDENT, который обозначает регулярное выражение, необходимое для поискаидентификаторов в исходных текстах программ:ALPHA[a-zA-Z]DIGIT[0-9]IDENT{ALPHA}({ALPHA}|{DIGIT})*В итоговом регулярном выражении использованы регулярные определения ALPHA и DIGIT дляобозначения латинских букв и цифр, соответственно. Генератор LEX автоматическиподставляет,соответствующиеимрегулярныевыраженияврегулярноевыражение,обозначаемое макросом IDENT. В результате подстановки для макроса IDENT получаетсяследующее регулярное определение:IDENT[a-zA-Z]([a-zA-Z]|[0-9])*согласнокоторомуподидентификаторомпонимаетсялюбаяалфавитно-цифроваяпоследовательность символов, которая начинается с латинской буквы.
Аналогичным образом,регулярное определение, заданное макросом IDENT, может быть использовано в регулярныхвыражениях секции правил или других регулярных определениях секции описаний также какмакросы ALPHA и DIGIT.В частности, макрос DIGIT может быть применен для формирования следующего регулярногоопределения вещественных чисел:REAL[+-]?(({DIGIT}+”.”{DIGIT}*)|”.”{DIGIT}+)С учетом автоматической подстановки регулярного определения для макроса DIGIT оноэквивалентно следующей конструкции:REAL[+-]?(([0-9]+”.”[0-9]*)|”.”{DIGIT}+)Кроме декларации перечисленных внешних объектов для секций правил и подпрограмм файласпецификации лексем, в секции описаний могут быть заданы размеры некоторых внутреннихтаблиц программы проектируемого лексического анализатора, если их значения должныотличаться от величин, которые по умолчанию устанавливает генератор LEX. Дляспецификации внутренних таблиц в программе лексического анализатора используетсяструктура фиксированных массивов, которые имеют ограниченный предельный размер.Поэтому в некоторых случаях, например, когда в секции правил файла спецификации лексемиспользуются сложные регулярные выражения с большим числом операндов и операций,возможно переполнение внутренних таблиц лексического анализатора, размеры массивовкоторых приняты по умолчанию.Желаемые размеры внутренних таблиц программы лексического анализатора специфицируютсястроками секции описаний, которые имеют следующий формат:%XSIZEВ этой строке литера X после служебного символа % обозначает код внутренней таблицылексического анализатора, а параметр SIZE устанавливает ее требуемый размер.
Каждая изтаких деклараций должна начинаться с первой позиции новой строки секции описаний, а части,определяющие код и размер таблицы, могут разделять произвольное число символов пробелаили табуляции. При этом значение размера таблицы специфицируется неотрицательным целымдесятичным числом. Код таблицы задается одной из латинских букв E, P, N, A ,K или O,которые имеют следующий смысл:Eтаблица вершин синтаксического дерева регулярного выражения;Pтаблица позиций вершин синтаксического дерева регулярного выражения;Nтаблица состояний в конечном автомате лексического анализатора;Aтаблица переходов в конечном автомате лексического анализатора;Kтаблица классов символов в регулярных выражениях;Oтаблица выходных элементов.Например, следующая декларация секции описаний устанавливает допустимое число состоянийв таблице состояний конечного автомата лексического анализатора равным 500 вместозначения, принятого по умолчанию:%N500Следует отметить, что явная декларация размеров внутренних таблиц относительно редкоиспользуется на практике при построении программы лексического анализатора генераторомLEX в отличие от объявления меток предусловий и регулярных определений.
Она становитсянеобходимой, только когда при построении программы лексического анализатора можетпроизойти переполнение некоторых внутренних таблиц. Переполнение можно исключить,увеличивая размеры одних таблиц при соответствующем сокращении других таблиц, такимобразом, чтобы суммарный размер всех таблиц сохранялся постоянным. Хотя возможностьявного изменения размеров внутренних таблиц используется редко, разработчику лексическиханализаторов полезно знать, что она существует.СПЕЦИФИКАЦИЯ ПРАВИЛСекция правил – обязательная секция файла спецификации лексем. Она должна начинатьсяпосле первой разделительной пары знаков процента %%, и может продолжаться либо до секцииподпрограмм, либо до конца файла спецификации лексем, если секция подпрограммотсутствует.
Эта секция предназначена для спецификации набора правил распознавания иобработки лексем во входном потоке стандартного ввода символьной информации. Любыевходные символы, которые не соответствуют заданному набору правил, передаются в выходнойпоток стандартного вывода без изменений. Таким образом, лексический анализаторинтерпретирует входной поток в соответствии с заданным набором правил.Каждое правило должно начинаться с первой позиции новой строки секции правил и можетзанимать произвольное число строк. Между строками правил может произвольное числопустых строк и строк, содержащих комментарии или объявления глобальных переменных,которые оформляются в соответствии с синтаксисом языка программирования C. Аналогичносекции описаний, комментарии и объявления глобальных переменных могут начинаться слюбой позиции своих строк, кроме первой.Количество правил непосредственно не регламентировано, но в неявной форме ограниченопринятымиразмерамивнутреннихтаблицпрограммылексическогоанализатора.Вбольшинстве случаев, когда гарантирована однозначность интерпретации лексем, порядокперечисления правил не имеет значения.
В общем случае правило состоит из двух частей иимеет следующий формат:REGULARACTIONВ этой спецификации REGULAR обозначает регулярное выражение для распознавания лексемвходного потока, а ACTION – действие, которое предусмотрено для обработки лексем. Обечасти правила должен разделять, по крайней мере, один символ пробела или табуляции.В левой части правила может быть задано любое регулярное выражение.
При необходимости внем могут присутствовать макросы регулярных определений и метки предусловий из секцииописаний, указанные, соответственно, в фигурных и угловых скобках. В частном случае вправиле может отсутствовать регулярное выражение.В правой части действия правила могут быть специфицированы любые синтаксическикорректныеинструкцииязыкапрограммирования C,которыедолжнывыполнятьсялексическим анализатором, когда обнаружено соответствие символов входного потокарегулярному выражению правила. Если соответствие регулярным выражениям правил необнаружено, выполняется действие по умолчанию, которое обеспечивает автоматическоекопирование символов входного потока стандартного ввода в выходной поток стандартноговывода. Таким образом, можно сказать, что действие это набор инструкций, которыевыполняются вместо копирования входного потока в выходной.В действия правил могут быть включены комментарии, декларации локальных переменных,операторы, выражения и вызовы стандартных функций системы программирования C илифункций, специфицированных в секции подпрограмм, которые необходимы для реализациитребуемой обработки лексем входного потока.
Кроме того, в блоках действий доступнывнешние переменные и макроопределения констант из секции описаний, а также собственныевстроенные переменные, стандартные функции и операторы генератора LEX.Количество инструкций в действиях правил не регламентировано. В частности, допустимыправила даже с пустым действием, однако, правила без действий не разрешены. С другойстороны гарантирована корректная обработка многострочных спецификаций действий спроизвольным количеством строк и инструкций в них, которые объединяются в блок действий,ограниченный фигурными скобками.
При этом блок действий должен начинаться в той жестроке, где указано регулярное выражение правила.На практике в секцию правил могут быть включены правила, которые обладают различнымиспецифическими особенностями своей структуры. Типичными частными разновидностямиправил являются:правила с предусловием и правила без условия,правила с пустым действием и правила без регулярного выражения,правила с однострочным и многострочным действием,правила с альтернативными действиями.Перечисленные структурные особенности действий и регулярных выражений можнокомбинировать для построения правил, которые обеспечивают требуемую обработку входногопотока.
Различные варианты формирования правил рассмотрены ниже.ЭЛЕМЕНТАРНЫЕ ДЕЙСТВИЯ ПРАВИЛВ простейшем случае функциональную обработку лексемы, соответствующей заданномурегулярному выражению, обеспечивает единственная инструкция в действие правила, образуяправило с однострочным действием.
Конструкцию правила, где действие содержит только однуинструкцию, иллюстрирует следующий пример спецификаций программы лексическогоанализатора, которая должна копировать входной поток стандартного ввода в выходной потокстандартного вывода, игнорируя символы возврата каретки (Carriage Return, сокращенно, CR)перед символами перевода строки (Line Feed, сокращенно, LF) в конце каждой строки.