Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
175
Добавлен:
31.10.2018
Размер:
2.51 Mб
Скачать

3.4 Регулярные определения

Для удобства записи регулярным выражениям можно давать имена и определять регулярные выражения с использованием этих имён так, как если бы это были символы. Если А является алфавитом базовых символов, то регулярное определение представляет собой последовательность вида

d1r1

d2r2

. . .

Dnrn

где каждая di – индивидуальное имя, а каждое ri – регулярное выражение над символами из А U{d1, d2, …, di-1}, т.е. базовыми символами и уже определенными именами. Ограничивая каждое ri, символами из А и ранее определенными именами, можно построить регулярное выражение над А для любого ri, заменяя (возможно, неоднократно) имена регулярных выражений обозначенными ими именами. Если ri использует dj для некоторого ji, то ri может оказаться определенно рекурсивно, и подстановка никогда не завершиться.

Для того чтобы отличить имена от символов, имена в регулярных выражениях выделяются полужирным шрифтом.

Пример 5

Множество идентификаторов Pascal представляет собой множество строк из букв и цифр, начинающихся с буквы. Регулярное определение этого множества:

letter →

A │ B │ . . . │ Z │ a │ b │ . . . │z

digit →

0 │ 1 │ . . . │ 9

id →

letter (letter │ digit) *

Замечание

Не все языки могут быть описаны регулярными выражениями. Регулярные выражения не могут быть использованы для описания сбалансированных или вложенных конструкций. Например, с одной стороны, множество всех строк из сбалансированных скобок не может быть описано регулярным выражением. С другой стороны, это множество может быть описано посредством контекстно-свободной грамматики.

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

3.5 Распознавание лексем и регулярные выражения

Рассмотрим пример языка, порождаемого следующей грамматикой.

Пример 6

Рассмотрим следующий фрагмент грамматики:

stmt

if expr then stmt

if expr then stmt else stmt

λ

expr

term relop term

term

term

id

где терминалы if, then, else, relop, id и num порождают множество строк, задаваемых следующими регулярными определениями:

if→

if

then→

then

else→

else

relop→

< │ <= │ = │ <> │ > │ >=

id→

letter ( letter │ digit ) *

где letter и digit определены так же, как и ранее.

Для этого фрагмента языка лексический анализатор будет распознавать ключевые слова if,then,else,а также лексемы, обозначенные relop, id. Для простоты считаем, что ключевые слова зарезервированы и, таким образом, не могут использоваться в качестве идентификаторов.

Цель – построение лексического анализатора, который сможет выделять из входного очередную лексему и, используя таблицу трансляции на рис. 8, выдавать пары, состоящие из значения лексемы и атрибута-значения. Атрибут-значение для операторов отношения определяется символическими константами LT,LE,EQ,NE,GT,GE.

Регулярное выражение

Лексема

Атрибут-значение

ws

if

if

then

then

else

else

Id

id

указатель на запись в таблице

num

num

указатель на запись в таблице

<

relop

LT

<=

relop

LE

=

relop

EQ

<>

relop

NE

>

relop

GT

>=

relop

GE

Рис. 8. Шаблоны регулярных выражений для лексем