Лекция 2

Праволинейные грамматики

Th Класс праволинейных грамматик порождает класс регулярных языков (1)

Pf 1

Пусть $G = \left(\Sigma, \Gamma, P, S\right)$. Построим недетерминированный конечный автомат по грамматике $G$:

$A = \left(\Sigma, \Gamma, \sigma, S, F\right)$, где

То есть указали правило преобразования грамматики в автомат, причем оно двухстороннее: если есть прямой переход между вершинами $A$ и $B$ по символу $a$, то в грамматике есть правило $\left( A \rightarrow aB \right )$.

КСЯ и КСГ

Df $G = \left(\Sigma, \Gamma, P, S\right)$ — контекстно-свободная грамматика

Далее $\alpha$ всегда такое — слово над обоими алфавитами и хотя бы одной буквой из нетерминального алфавита.

Df Язык $L$ — контекстно-свободный

Df Корневое дерево является упорядоченным

Пусть $child(n, \, T)$ — множество потомков узла $n$ в дереве $T$

На его узлах задан линейный порядок $\lessdot$ со свойствами:

Df $T$ — дерево вывода слова $w \in \Sigma^*$ в КСГ $G = \left(\Sigma, \Gamma, P, S\right)$

Пусть $mark(x) = X$ — функция, показывающая что меткой узла x является $X$

$T$ — упорядоченное дерево, для которого выполняются условия:

Пример дерева

Язык скобочных последовательностей.

Построим вывод какого-нибудь слова, например $(()())$:

Это всего лишь один из вариантов вывода. Построим теперь дерево:

           S
           |
    +------+------+
    |      |      |
    (      S      )
           |
    +------+------+
    |             |
    S             S
+---+---+     +---+---+
|   |   |     |   |   |
(   S   )     (   S   )
    |             |
    λ             λ

Df $T’$ — стандартное поддерево дерева вывода $T$

$root(T)$ — так обозначим корень дерева $T$

$leafs(T)$ — листья дерева $T$

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

Df Вывод $S = \alpha_0 \underset{G}{\implies} \alpha_1 \underset{G}{\implies} … \underset{G}{\implies} \alpha_n = w$ слова $w$ представим деревом вывода $T$ в грамматике $G$

$word(T)$ — слово, полученное обходом листьев дерева $T$ слева направо

$\exists T_0, T_1, …, T_k$ — стандартные поддеревья $T$, такие что:

Df Грамматика $G$ — однозначная

$tree(w)$ — множество деревьев вывода для данного слова

$\forall w \in L(G) : \, \, \vert tree(w) \vert \, = 1$

Пример разных деревьев вывода

Простая грамматика для арифметических выражений: Здесь $x$ — токен-плейсхолдер, для грамматики неважно, какое конкретно там число стояло.

Для слова $”x + x\cdot x”$ можно построить дерево вывода такое:

         E
         |
         |
+--------+---------+
|        |         |
|        |         |
v        |         |
E        +         |
|             +----E---+
|             |    |   |
|             |    |   |
|             |    ×   |
λ             E        E
              |        |
              |        |
              λ        λ

или такое:

               E
               |
               |
      +--------+---------+
      |        |         |
      |        |         |
      |        |         |
      |        +         |
 +----E---+              E
 |    |   |              |
 |    |   |              |
 |    ×   |              |
 E        E              λ
 |        |
 |        |
 λ        λ

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

Но мы можем построить грамматику, которая порождает тот же язык, но уже не позволит построить разные деревья:

Мы воспользовались идеей, что выражение есть сумма произведений.


Df КС язык $L$ однозначный

$\exists G: G \text{ — однозначная} \, : \, L(G) = L$

Df Вывод слова $w$ левосторонний

каждая следующая форма в выводе получена из предыдущей применением правила вывода к самому левому нетерминалу в форме.

Df Вывод слова $w$ правосторонний

каждая следующая форма в выводе получена из предыдущей применением правила вывода к самому правому нетерминалу в форме.