- •Введение
- •Порождающие грамматики Хомского Цель
- •Неограниченные грамматики
- •Контекстно зависимые грамматики
- •Контекстно свободные грамматики
- •Автоматные грамматики
- •Эквивалентность грамматик
- •Однозначность грамматик
- •Задачи и упражнения
- •Контрольные вопросы
- •Конечный автомат
- •Детерминированный конечный автомат
- •Построение дка из -нка
- •Задачи и упражнения
- •Контрольные вопросы
- •Регулярные грамматики. Лексический анализатор. Роль лексических анализаторов
- •Лексические ошибки
- •Регулярные выражения
- •Преобразование регулярного выражения в автомат
- •Распознание токенов
- •Задачи и упражнения
- •Контрольные вопросы
- •Автоматы с магазинной памятью
- •Нисходящие методы разбора Устранение левой рекурсии
- •Левая факторизация
- •Метод рекурсивного спуска
- •Пример нисходящего интерпретатора
- •Задачи и упражнения
- •Контрольные вопросы
Преобразование регулярного выражения в автомат
Любой язык, определяемый регулярным выражением, можно задать некоторым конечным автоматом.
Построение -НКА, обладающего свойствами:
имеет ровно одно допускающее состояние.
нет дуг, ведущих в начальное состояние.
нет дуг, выходящих из допускающего состояния.
Таблица 7. Регулярные выражения.
Выражение |
Описание |
, |
Любой символ |
\ |
Интерпретирует символ после \ как литерал |
() |
Группировка операторов |
{n} |
Последовательность из n раз повторяющегося элемента, расположенного пред {n} |
Пример: ‘a{2}’ определяет строку 'aa' |
|
{n,m} |
Последовательность от n до m раз повторяющегося элемента, расположенного пред {n,m} |
Пример: ‘a{2,4}’ определяет строки 'aa','aaa',’aaaa’ |
|
{n,} |
Последовательность из n и более элементов |
Пример: ‘a{2,}’ определяет строки 'aa',’aaa’,… |
|
* |
Последовательность из 0 и более элементов |
L((ab)*) = {, ab, abab, ababab,…} |
|
+ |
Последовательность из 1 и более элементов |
L((ab)+) = {ab, abab, ababab,…} |
|
? |
Последовательность из 0 или 1 элемента |
L((ab)?) = {, ab} |
|
| |
Конкатенация выражений |
|
L(ab|c*) = {ab, e, c,cc,ccc,…} |
[aeiou] |
Любой символ из представленных в квадратных скобках: L([abcd]) = {a,b,c,d} |
[a-z] |
Любой символ из заданного диапазона |
|
L([a-c])={a,b,c} |
[^aeiou] |
Любой символ, исключая представленные в квадратных скобках |
\w |
Любая буква или цифра |
^ |
Последовательность начинается с начала строки |
$ |
Последовательность заканчивается на конце строки |
Все строки правильного адреса email:
L(^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$) = {new@era.com, func-01@new.era.com, …}
Распознание токенов
Задать грамматику языка
Задать регулярную грамматику токенов
Задать атрибуы токенов
Преобразовать регулярные выражения в КА.
Реализовать КА.
Пример 8. Грамматика (Pascal):
S if E then S | if E then S else E |
E T relation T | T
T id | num
Грамматика терминалов:
if if
then then
else else
relation <|<=|=|<>|>|>=
id [a-Z]([a-Z]|[0-9])*
num [0-9]+(.[0-9]+)?(E(+|-)?[0-9]+)?
Разделители лексем:
delim blank | tab | newline
ws delim+
Таблица 8. Регулярные выражения для мини-Pascal.
Регулярное выражение |
Токен |
Атрибут |
ws |
- |
- |
if |
if |
- |
then |
then |
- |
else |
else |
- |
id |
id |
Указатель на запись в таблице символов |
num |
num |
Указатель на запись в таблице символов |
< |
relation |
LT (lower than) |
> |
relation |
GT(grater than) |
>= |
relation |
GTE |
<= |
relation |
LTE |
… |
|
|
Рисунок 4. КА для операций отношения (relation).