Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Glava10 r.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
339.97 Кб
Скачать

Построение регулярного выражения для языка, заданного леволинейной грамматикой

Имеем леволинейную грамматику G(VT,VN,P,S), необходимо найти регулярное выражение над алфавитом VT, определяющее язык L(G), заданный этой грамматикой.

В данном случае преобразование не столь элементарно. Выполняется оно следующим образом:

1. Обозначим символы алфавита нетерминальных символов VN следующим образом: VN - {XI, Х2, ..., Хп}. Тогда все правила грамматики будут иметь вид: Xi-»Xjy или Xi-»y Xi.XjeVN, yeVT*; целевому символу грамматики S будет соответствовать некоторое обозначение Xk.

2. Построим систему уравнений с регулярными коэффициентами на основе переменных Х1,Х2,...,Хn:

Xi = а01 + XiCtu + Х2а21 + ... + Хпап1

коэффициенты а01, а02,..., о.0п выбираются следующим образом: a0i = (yi + у2 + + - + Ут). если во множестве правил Р грамматики G существуют правила Xj-yyi|y2|...|ym, и a0i = 0, если правил такого вида не существует;

коэффициенты a1, aj2, ..., a,jn для некоторого j выбираются следующим образом: Oji = (у! + у2 + ... + ут), если во множестве правил Р грамматики G существуют правила Xi-»Xjy1|Xjy2 ...|Xjym, и Xjj = 0, если правил такого вида не существует.

3. Находим решение построенной системы уравнений.

Доказано, что решение для Xk (которое обозначает целевой символ S грамматики G) будет представлять собой искомое регулярное выражение, обозначающее язык, заданный грамматикой G. Остальные решения системы будут представлять собой регулярные выражения, обозначающие понятия грамматики, соответствующие ее нетерминальным символам. В принципе для поиска регулярного выражения, обозначающего весь язык, не нужно искать все решения — достаточно найти решение для Xk, если выражения для понятий грамматики не представляют отдельного интереса.

Например, рассмотрим леволинейную грамматику, определяющую язык десятичных чисел с плавающей точкой G({".", "-", "+", "О", "1". "2", "3", "4", "5", "6", "7", "8", "9"}, {<знак>, <дробное>, <целое>, <число>},Р,<число>):

Обозначим символы множества VN = {<знак>, <дробное>, <целое>, <число>} соответствующими переменными Х-1, получим: VN = {Х1 Х2, Х3, Х4}.

Построим систему уравнений на основе правил грамматики G:

Эта система уравнений уже была решена выше. В данном случае нас интересует только решение для Х4, которое соответствует целевому символу грамматики G <число>.

Решение для Х4 может быть записано в виде:

Х4 = (“-“ + “+" + λ.) ("."(0+1+2+3+4+5+6+7+8+9) + (0+1+2+3+4+5+6+7+8+9)(0+1+2+3+ +4+5+6+7+8+9)*"." + (0+1+2+3+4+5+6+7+8+9)) (0+1+2+3+4+5+6+7+8+9)*

Это и есть регулярное выражение, определяющее язык, заданный грамматикой G.

Связь регулярных выражений и конечных автоматов

Регулярные выражения и конечные автоматы связаны между собой следующим образом:

--- для любого регулярного языка, заданного регулярным выражением, можно построить конечный автомат, определяющий тот же язык;

--- для любого регулярного языка, заданного конечным автоматом, можно получить регулярное выражение, определяющее тот же язык.

Ниже будет рассмотрен алгоритм, реализующий построение конечного автомата по регулярному выражению. Алгоритм построения регулярного выражения по конечному автомату здесь не рассматривается — он не представляет интереса, поскольку, как будет показано ниже, проще построить грамматику, эквивалентную заданному конечному автомату, а потом уже найти регулярное выражение для заданного грамматикой языка (по алгоритму, который уже был выше рассмотрен) [5, 6, т. 1, 12, 26].

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]