Читайте также:
|
|
Расширения регулярных выражений
С тех пор как в 1950-х годах Клини (Kleene) ввел регулярные выражения с базовыми операторами для объединения, конкатенации и замыкания Клини, к ним было добавлено много расширений, повышающих их способность определять строковые шаблоны. К сожалению, в настоящее время не определены стандарты на запись расширенных регулярных выражений, и в языках программирования нотация записи шаблонов может несколько отличаться. Здесь мы рассмотрим несколько расширений в записи регулярных выражений, которые первоначально появились в утилитах Unix, таких как Lex, и которые в особенности полезны при определении лексических анализаторов.
Выражение | Соответствие | Пример |
с | Один неоператорный символ с | а |
\с | Символ с буквально | \* |
"s" | Строка s буквально | "**" |
• | Любой символ, кроме символа новой строки \n | а.*b |
^ | Начало строки | ^аbс |
$ | Конец строки | abc$ |
[s] | Любой символ из s | [abc] |
[^s] | Любой символ, не входящий в s | [^abc] |
r* | Нуль или более строк, соответствующих r | а* |
г+ | Одна или более строк, соответствующих r | а+ |
г? | Нуль или одно r | а? |
r{m,n} | От т до n повторений r | а{1,5} |
r1r2 | r1, за которым следует r2, конкатенация | ab |
r1|r2 | r1 или r2, объединение | а|b |
(г) | То же, что и r, группировка | (a|b) |
r1/r2 | r1, если за ним следует r2 | abc/123 |
Рис. 3.8. Регулярные выражения Lex.
Генератор лексических анализаторов Lex
В этом разделе мы познакомимся с программным инструментом под названием Lex (или, в более поздних реализациях, Flex), который позволяет определить лексический анализатор, указывая регулярные выражения для описания шаблонов токенов. Входные обозначения для Lex обычно называют языком Lex, а сам инструмент — компилятором Lex. Компилятор Lex преобразует входные шаблоны в диаграмму переходов и генерирует код (в файле с именем lex.yy.c), имитирующий данную диаграмму переходов.
Использование Lex
На рис. 3.22 показана схема использования Lex. Входной файл lex.1 написан на языке Lex и описывает генерируемый лексический анализатор. Компилятор Lex преобразует lex.1 в программу на языке программирования С в файле с именем lex.yy.c. Этот файл компилируется компилятором С в файл с названием а.out, как обычно. Выход компилятора С представляет собой работающий лексический анализатор, который может получать поток входных символов и выдавать поток токенов.
Рис. 3.22. Создание лексического анализатора с помощью Lex
Обычно скомпилированная программа на языке С, которая на рис. 3.22 показана как a.out, используется в качестве подпрограммы синтаксического анализатора. Это функция на языке программирования С, которая возвращает целое число, представляющее собой код одного из возможных имен токенов. Значение атрибута, которое может быть другим числовым кодом, указателем на запись таблицы символов или просто отсутствовать, помещается в глобальную переменную yylval[1], которая совместно используется лексическим и синтаксическим анализаторами. Этот метод позволяет вернуть из функции как имя токена, так и значение его атрибута.
Дата добавления: 2015-07-12; просмотров: 101 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Хай-тек остановка. | | | Структура программ Lex |