- •4. Синтаксический анализ регулярных языков
- •4.1. Конечные автоматы
- •4.1.1. Основные определения
- •4.1.2. Конечные автоматы и а-грамматики
- •4.2. Детерминированные конечные автоматы
- •4.2.1. Детерминированные и недетерминированные автоматы
- •4.2.2. Минимизация детерминированного автомата
- •4.3. Лексический анализатор
4.1.2. Конечные автоматы и а-грамматики
Установим теперь соответствие между А-грамматиками и конечными автоматами. Грамматика G = (N,T,P,S) и автомат A = (Q,T,t,q0,F) называются соответствующими друг другу, если N = Q, S = q0, X aY P (X,a) Y t, X P X F.
Для того, чтобы доказать, что в этом случае L(G) = L(A), введем понятие диаграммы А-грамматики. Это помеченный ориентированный граф, вершинами которого являются символы из N, помеченная дуга XaY соответствует правилу X aY. Если X P, то вершину X будем изображать двойным кружком.
Пример 4.2. Построенная в примере 3.11 А-грамматика для чисел представляется диаграммой
Очевидны также следующие леммы.
Л е м м а 4.2. X G*Y в диаграмме грамматики есть путь из X в Y, метки дуг которого образуют цепочку .
Л е м м а 4.3. Графы соответствующих друг другу грамматики и автомата совпадают.
Из лемм 4.1-4.3 непосредственно следует
Т е о р е м а 4.1. L(G) = L(A) для соответствующих друг другу грамматики G и автомата A.
Заметим, что автомат, соответствующий грамматике чисел, является детерминированным. Но не всегда легко записать детерминированный автомат для сложного регулярного языка. В следующем разделе рассматривается способ построения наиболее эффективного детерминированного автомата для произвольного регулярного языка. Это построение может осуществляться автоматически.
С л е д с т в и е 4.1. Класс регулярных языков совпадает с классом языков, допускаемых конечными автоматами.
4.2. Детерминированные конечные автоматы
4.2.1. Детерминированные и недетерминированные автоматы
Автоматы A и A' называются эквивалентными, если L(A) = L(A').
Т е о р е м а 4.2. Для любого недетерминированного конечного автомата можно построить эквивалентный детерминированный конечный автомат.
Доказательство. Сначала заметим, что грамматика соответствует детерминированному автомату тогда и только тогда, когда в каждом ее правиле вида A a1A1 | ... | anAn или A a1A1 | ... | anAn | выполняется условие: ai aj при i j. Поэтому достаточно преобразовать А-грамматику G = (N,T,P,S) к указанному виду. В процессе преобразования на грамматику будем смотреть, как на соответствующую систему уравнений.
Для каждого непустого подмножества {A1,...,An} множества N введем новый нетерминальный символ [A1,...,An] и определим его так, чтобы соответствующее уравнение имело вид [A1,...,An] = A1 ... An. Для этого достаточно, как в доказательстве теоремы 3.10, задать правило [A1,...,An] r1 | ... | rn, где ri правая часть правила для Ai.
Теперь построим требуемую грамматику G' = (N',T,P',S), где N' получается из N добавлением определенных выше новых нетерминальных символов, а P' получено следующим образом из P и правил для новых нетерминальных символов: в каждом правиле все члены вида aA1, ..., aAn с одним и тем же a T заменяются одним членом a[A1,...,An]. Таким правилам соответствует детерминированный автомат, эквивалентный исходному, т.к. a[A1,...,An] = aA1 ... aAn.
Так как не все нетерминальные [A1,...,An] достижимы из S, то при построении P' достаточно включать только необходимые правила, начиная с правила для S.
Пример 4.3. Недетерминированный автомат, изображенный на следующем рисунке слева,
имеет соответствующую грамматику с правилами
q0 aq1 | bq2, q1 aq1 | aq3 | bq1 | bq2, q2 aq1 | aq2 | bq2 | bq3, q3 aq3 | bq3 | .
Преобразуем его в детерминированный автомат по методу теоремы 4.2. В новую грамматику войдет старое правило для q0, т.к. оно удовлетворяет условию детерминированности. Правило для q1 преобразуется к виду q1 a(q1 | q3) | b(q1 | q2), или q1 aq13 | bq12.
Аналогично получается правило для q2: q2 aq12 | bq23.
Для q13 = q1 | q3 правило имеет вид q13 aq1 | aq3 | bq1 | bq2 | bq3 | , или, окончательно, q13 aq13 | bq123 | , где q123 = q1 | q2 | q3. Аналогично, для q12 = q1 | q2, q23 = q2 | q3 и q123 правила (после преобразования) имеют вид q12 aq123 | bq123, q23 aq123 | bq23 | , q123 aq123 | bq123 | .
Диаграмма построенного детерминированного автомата изображена на том же рисунке справа.
Отметим, что, как видно из доказательства и примера, построенный детерминированный автомат при анализе цепочки как бы одновременно ведёт все пути её анализа исходным автоматом.