Опубликован: 06.08.2007 | Доступ: свободный | Студентов: 1590 / 768 | Оценка: 4.45 / 4.29 | Длительность: 18:50:00
Специальности: Программист
Лекция 4:

Лексический анализ

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

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

Теорема 3.1. Язык, допускаемый детерминированным конечным автоматом, является регулярным множеством.

Доказательство. Пусть L - язык, допускаемый детерминированным конечным автоматом

M=(\{q_1, \ldots , q_n\},T,D,q_1,F).

Введем De - расширенную функцию переходов автомата M: De(q, w) = p, где w \in T^*, тогда и только тогда, когда (q, w)\vdash^* (p, e).

Обозначим посредством R^k_{ij} множество всех слов x таких, что De(qi, x) = qj и если De(qi, y) = qs для любой цепочки y - префикса x, отличного от x и e, то s <= k.

Иными словами, R^k_{ij} есть множество всех слов, которые переводят конечный автомат из состояния qi в состояние qj, не проходя ни через какое состояние qs для s > k. Однако, i и j могут быть больше k.

R^k_{ij} может быть определено рекурсивно следующим образом:

\begin{align*}
& \text{$R^0_{ij}=\{a \mid a \in T,D(q_i,a)=q_j\},$} \\  
& \text{$R^k_{ij}=R^{k-1}_{ij}\bigcup R^{k-1}_{ik}(R^{k-1}_{kk})*R^{k-1}_{kj}$,  где $1 \leq k \leq n$}
\end{align*}

Таким образом, определение R^k_{ij} означает, что для входной цепочки w, переводящей M из qi в qj без перехода через состояния с номерами, большими k, справедливо ровно одно из следующих двух утверждений:

  1. Цепочка w принадлежит R^{k-1}_{ij}, то есть при анализе цепочки w автомат никогда не достигает состояний с номерами, большими или равными k.
  2. Цепочка w может быть представлена как w = w1w2w3, где w_1 \in R^{k-1}_{ik} (подцепочка w1 переводит M сначала в qk ), w_2 \in (R^{k-1}_{kk} )^* (подцепочка w2 переводит M из qk обратно в qk, не проходя через состояния с номерами, большими или равными k ), и w_3 \in R^{k-1}_{kj} (подцепочка w3 переводит M из состояния qk в qj ) - рис. 3.16.

Рис. 3.16.

Тогда L= \bigcup\limits_{q_j\in F} R^n_{1j}. Индукцией по k можно показать, что это множество является регулярным.

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

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

Праволинейная грамматика G = (N, T, P, S) называется регулярной, если

(1) каждое ее правило, кроме S -> e, имеет вид либо A -> aB, либо A -> a, где A, B \in N, a \in T,

(2) в том случае, когда S \rightarrow e \in P, начальный символ S не встречается в правых частях правил.

Лемма. Пусть G - праволинейная грамматика. Существует регулярная грамматика G' такая, что L(G) = L(G').

Доказательство. Предоставляется читателю в качестве упражнения.

Теорема 3.2. Пусть G = (N, T, P, S) - праволинейная грамматика. Тогда существует конечный автомат M = (Q, T, D, q0, F) для которого L(M) = L(G).

Доказательство. На основании приведенной выше леммы, без ограничения общности можно считать, что G - регулярная грамматика.

Построим НКА M следующим образом:

  1. состояниями M будут нетерминалы G плюс новое состояние R, не принадлежащее N. Так что Q = N \cup \{R\},
  2. в качестве начального состояния M примем S, то есть q0 = S,
  3. если P содержит правило S -> e, то F = {S, R}, иначе F = {R}. Напомним, что S не встречается в правых частях правил, если S \rightarrow e \in P,
  4. состояние R \in D(A, a), если A \rightarrow a \in P. Кроме того, D(A, a) содержит все B такие, что A \rightarrow aB \in P. \; \; D(R, a) = \oslash , для каждого a \in T.

M, читая вход w, моделирует вывод w в грамматике G. Покажем, что L(M) = L(G). Пусть w = a_1a_2 \ldots a_n \in L(G), n > 1. Тогда S \Rightarrow a_1A_1 \Rightarrow \ldots \Rightarrow a_1a_2 \ldots a_{n-1}A_{n-1} \Rightarrow a_1a_2 \ldots a_{n-1}a_n для некоторой последовательности нетерминалов A1, A2, ... , An-1. По определению, D(S, a1) содержит A1, D(A1, a2) содержит A2, и т.д., D(An-1, an) содержит R. Так что w \in L(M), поскольку De(S, w) содержит R, а R \in F. Если e \in L(G), то S \in F, так что e \in L(M).

Аналогично, если w = a_1a_2 \ldots a_n \in L(M), \; n \geq 1, то существует последовательность состояний S, A1, A2, ... , An-1, R такая, что D(S, a1) содержит A1, D(A1, a2) содержит A2, и т.д. Поэтому S \Rightarrow a_1A_1 \Rightarrow a_1a_2A_2 \Rightarrow \ldots \Rightarrow a_1a_2 \ldots a_{n-1}A_{n-1} \Rightarrow a_1a_2 \ldots a_{n-1}a_n - вывод в G и x \in L(G). Если e \in L(M), то S \in F, так что S \rightarrow e \in P и e \in L(G).

Теорема 3.3. Для каждого конечного автомата M = (Q, T, D, q0, F) существует праволинейная грамматика G = (N, T, P, S) такая, что L(G) = L(M).

Доказательство. Без потери общности можно считать, что автомат M - детерминированный. Определим грамматику G следующим образом:

  1. нетерминалами грамматики G будут состояния автомата M. Так что N = Q,
  2. в качестве начального символа грамматики G примем q0, то есть S = q0,
  3. A \rightarrow aB \in P, если D(A, a) = B,
  4. A \rightarrow a \in P, если D(A, a) = B и B \in F,
  5. S \rightarrow e \in P, если q_0 \in F.

Доказательство того, что S  \Rightarrow^* w тогда и только тогда, когда D^e(q_0, w) \in F, аналогично доказательству теоремы 3.2.

В некоторых случаях для определения того, является ли язык регулярным, может быть полезным необходимое условие, которое называется леммой Огдена о разрастании.

Теорема 3.4. (Лемма о разрастании для регулярных множеств). Пусть L - регулярное множество. Существует такая константа k, что если w \in L и \mid \! w \! \mid \geq k, то цепочку w можно представить в виде xyz, где 0 < \mid \! y \! \mid \leq k и xy^iz \in L для всех i \geq 0.

Доказательство. Пусть M = (Q, \Sigma , D, q_{0}, F) - конечный автомат, допускающий L, то есть L(M) = L и k = |Q|. Пусть w \in L и \mid \! w \! \mid \geq k. Рассмотрим последовательность конфигураций, которые проходит автомат M, допуская цепочку w. Так как в ней по крайней мере k + 1 конфигурация, то среди первых k+1 конфигурации найдутся две с одинаковыми состояниями. Таким образом, получаем существование такой последовательности тактов, что

(q_0, xyz) \vdash^* (q_1, yz) \vdash^r (q_1, z) \vdash^* (q_2, e)

для некоторых q_1 \in Q, q_2 \in F \; \text{и} \; 0 < r \leq k. Отсюда 0 < \mid \! y \! \mid \leq n. Но тогда для любого i > 0 автомат может проделать последовательность тактов (q_0, xyz) \vdash^* (q_1, y^iz) \vdash^+ (q_1, y^{i-1}z) \ldots \vdash^+(q_1, yz) \vdash^+(q_1, z) \vdash^* (q_2, e) Таким образом, xy^iz \in L для всех i >= 1. Случай i = 0 то есть xy \in L также очевиден.

С помощью леммы о разрастании можно показать, что не является регулярным множеством язык L={0n1n|n>=1}.

Допустим, что L регулярен. Тогда для достаточно большого n0n1n можно представить в виде xyz, причем y \ne  e и xy^iz \in L для всех i >= 0. Если y \in 0^+ или y \in 1^+, то xz = xy^0z \in L. Если y \in 0^+1^+, то xyyz \in L. Получили противоречие. Следовательно, L не может быть регулярным множеством.