Упражнение 2.1.25 |
Синтаксический разбор
13.2. Восходящий разбор
Определение 13.2.1. Протоколом
правостороннего вывода в контекстно-свободной грамматике
будем называть
обращенную
последовательность правил,
примененных в этом выводе.
Формально говоря,
протоколом правостороннего вывода
![\omega_0 , \omega_1 , \ldots , \omega_n](/sites/default/files/tex_cache/188216fbf2c50d5b422b4a2a840f3098.png)
![( A_1 \tto \alpha_1 ) , \ldots , ( A_n \tto \alpha_n ) ,](/sites/default/files/tex_cache/855ee4707c893227d355a42d327bda9c.png)
![\omega_i = \eta B v](/sites/default/files/tex_cache/d23dc2fcaa101ce862e757ab81d1c1de.png)
![\omega_{i+1} = \eta \beta v](/sites/default/files/tex_cache/3d6eab10ddefaabe3e55f46283083bda.png)
![\eta \in \ns ^*](/sites/default/files/tex_cache/86a9944db6a33322df37c1d845e75192.png)
![B \in N](/sites/default/files/tex_cache/123c4aad7ed47fd912a868e167546e26.png)
![v \in \Sigma^*](/sites/default/files/tex_cache/7d14e73be47e81c94efeac7d3999a1c2.png)
![\beta \in \ns ^*](/sites/default/files/tex_cache/c4d2a31677163d8baeca8792dab13253.png)
![\alpha_{n-i} = \beta](/sites/default/files/tex_cache/b009b5859b318303db490befaa1da9bd.png)
Пример 13.2.2. Рассмотрим контекстно-свободную грамматику
![\begin{align*}
S \; & {\to} \; c\\
S \; & {\to} \; dS\\
S \; & {\to} \; aSeSb
\end{align*}](/sites/default/files/tex_cache/6b6d2ec9b01c9b893a48c384c8db8995.png)
![\xymatrix @=6pt {
& & & & S\ar[ddllll]\ar[ddll]\ar[dd]\ar[ddrr]\ar[ddrrrr] \\
\\
a & & S\ar[dd] & & e & & S\ar[ddl]\ar[ddr] & & b \\
\\
& & c & & & d & & S\ar[dd] \\
\\
& & & & & & & c
}](/sites/default/files/tex_cache/cb4985ced830d8fbadae5d6e430cbbf8.png)
![S \pRightarrow
aSeSb \pRightarrow
aSedSb \pRightarrow
aSedcb \pRightarrow
acedcb .](/sites/default/files/tex_cache/9080d206f3fea48ed6f589c279e4cac3.png)
![( S \tto c ) ,\
( S \tto c ) ,\
( S \tto dS ) ,\
( S \tto aSeSb ) .](/sites/default/files/tex_cache/40741c2941d708b730b051e2c26ea27c.png)
Лемма 13.2.3. Разным правосторонним выводам в одной и той же контекстно-свободной грамматике соответствуют разные протоколы.
Протокол правостороннего вывода в контекстно-свободной грамматике является естественным описанием соответствующего дерева вывода в порядке постфиксного обхода (postorder traversal). (Постфиксный обход упорядоченного дерева можно определить рекурсивно так: сначала выполняется постфиксный обход первого непосредственного потомка корня, затем второго и т. д., а в самом конце посещается корень дерева.)
Например, протокол правостороннего вывода из примера 13.2.2 задает процесс постепенного конструирования дерева вывода, изображенный ниже.
![\newcommand{\rb}[1]{\raisebox{0pt}[8pt]{$ #1 $}}
\entrymodifiers={=<3.3mm>[o]}
\xymatrix @=0mm {
& & & & \boldsymbol{S}\ar[ddddll] \\
\\
\\
\\
\rb{\boldsymbol{a}} & & \rb{c}
\\%}
\\
%&\xymatrix @=0mm {
& & & & \boldsymbol{S}\ar[ddddll] \\
\\
& & & & & & & \boldsymbol{S}\ar[ddr] \\
\\
\rb{\boldsymbol{a}} & & \rb{c} & & \rb{\boldsymbol{e}} & & \rb{\boldsymbol{d}} & & \rb{c}
\\%}
\\
%&\xymatrix @=0mm {
& & & & \boldsymbol{S}\ar[ddddll] & & \boldsymbol{S}\ar[dddd]\ar[ddr] \\
\\
& & & & & & & S\ar[ddr] \\
\\
\rb{\boldsymbol{a}} & & \rb{c} & & \rb{\boldsymbol{e}} & & \rb{d} & & \rb{c}
\\%}
\\
%&\xymatrix @=0mm {
& & & & & \boldsymbol{S}\ar[ddddddlllll]<-1mm>\ar[ddl]\ar[ddddddl]\ar[ddr]\ar[ddddddrrrrr]<1mm> \\
\\
& & & & S\ar[ddddll] & & S\ar[dddd]\ar[ddr] \\
\\
& & & & & & & S\ar[ddr] \\
\\
\rb{a} & & \rb{c} & & \rb{e} & & \rb{d} & & \rb{c} & & \rb{b}
}](/sites/default/files/tex_cache/f4d456a4d68b609074ccdf21dd7117a6.png)
Определение 13.2.5. Правым разбором (right parse) слова w в контекстно-свободной грамматике G называется протокол любого правостороннего вывода слова w в грамматике G.
Пример 13.2.6. Правым разбором слова aceaacecbecbb в грамматике из примера 13.2.2 является последовательность
![\begin{multiline*}
( S \tto c ) ,\
( S \tto c ) ,\
( S \tto c ) ,\
( S \tto aSeSb ) ,\\
( S \tto c ) ,\
( S \tto aSeSb ) ,\
( S \tto aSeSb ) .
\end{multiline*}](/sites/default/files/tex_cache/94f0a8c14a4fdc41c0f62574431c76fe.png)
Определение 13.2.7. Процесс нахождения правого разбора слова w в~заданной контекстно-свободной грамматике G называется восходящим разбором (bottom-up parsing).
Определение 13.2.8.
Пусть даны контекстно-свободная грамматика
и МП-автомат
.
Будем говорить, что МП-автомат M - восходящий магазинный анализатор
(bottom-up, left-to-right parser)
для грамматики G,
если
и существует такой
гомоморфизм
,
что для каждого
вычислительного процесса
(МП-автомата M ),
допускающего слово
,
образ протокола этого вычислительного процесса при гомоморфизме r
является протоколом некоторого правостороннего вывода
слова w
в грамматике
.
Пример 13.2.9.
Рассмотрим контекстно-свободную
грамматику
из примера 13.1.17.
Язык
распознается недетерминированным МП-автоматом
,
где
![\Gamma = \{ A , B , C ,
\trm{+} , \trm{-} , \trm{*} , \trm{/} , \trm{(} \}](/sites/default/files/tex_cache/6f7dc67201bc01855786cf3e24ada9e0.png)
![\begin{align*}
{}
\Delta&=\{
\lp\lp1,\trm{+},\varepsilon\rp,
\lp1,\trm{+}\rp\rp,\
\lp\lp1,\trm{-},\varepsilon\rp,
\lp1,\trm{-}\rp\rp,\
\\&\hphantom{{}={}\{}%\}
\lp\lp1,\trm{*},\varepsilon\rp,
\lp1,\trm{*}\rp\rp,\
\lp\lp1,\trm{/},\varepsilon\rp,
\lp1,\trm{/}\rp\rp,\
\\&\hphantom{{}={}\{}%\}
\lp\lp1,\trm{(},\varepsilon\rp,
\lp1,\trm{(}\rp\rp,\
\\&\hphantom{{}={}\{}%\}
\lp\lp1,\varepsilon,B\trm{+}A\rp,
\lp1,A\rp\rp,\
\lp\lp1,\varepsilon,B\trm{-}A\rp,
\lp1,A\rp\rp,\
\lp\lp1,\varepsilon,B\rp,
\lp1,A\rp\rp,\
\\&\hphantom{{}={}\{}%\}
\lp\lp1,\varepsilon,C\trm{*}B\rp,
\lp1,B\rp\rp,\
\lp\lp1,\varepsilon,C\trm{/}B\rp,
\lp1,B\rp\rp,\
\lp\lp1,\varepsilon,C\rp,
\lp1,B\rp\rp,\
\\&\hphantom{{}={}\{}%\}
\lp\lp1,\trm{)},A\trm{(}\rp,
\lp1,C\rp\rp,\
\lp\lp1,\trm{m},\varepsilon\rp,
\lp1,C\rp\rp,\
\lp\lp1,\trm{n},\varepsilon\rp,
\lp1,C\rp\rp,\
\\&\hphantom{{}={}\{}%\}
\lp\lp1,\eos,A\rp,
\lp2,\varepsilon\rp\rp
\}.
\end{align*}](/sites/default/files/tex_cache/31d43d6272212cbf250f70913253ca4b.png)
Определение 13.2.10.
Контекстно-свободная грамматика
принадлежит классу LR(1),
если для любых
,
,
,
,
,
,
,
,
из условий
![\begin{align*}
& S_\eos \overstar{\rmarrow} \eta_1 A_1 b v_1 ,\\
& S_\eos \overstar{\rmarrow} \eta_2 A_2 b v_2 ,\\
& ( A_1 \tto \alpha_1 ) \in P_\eos ,\\
& ( A_2 \tto \alpha_2 ) \in P_\eos ,\\
& \eta_1 \alpha_1 = \eta_2 \alpha_2
\end{align*}](/sites/default/files/tex_cache/f31e7e2407d7e0375f167d404c246c49.png)
![\alpha_1 = \alpha_2](/sites/default/files/tex_cache/b0c164e2d4aa6485ff9d9d90f26ba812.png)
Замечание 13.2.11. Классу LR(1) принадлежат те языки, для которых возможен восходящий разбор слова при чтении слева направо с заглядыванием на один символ вперед.
Замечание 13.2.12. Буква L в названии класса LR(1) означает, что входное слово читается слева направо (left-to-right). Буква R означает, что строится правосторонний вывод (rightmost derivation). Число 1 указывает на то, что на каждом шаге для принятия решения используется один символ неразобранной части входного слова.
Теорема 13.2.13. Для каждой грамматики из класса LR(1) существует детерминированный восходящий магазинный анализатор.
Доказательство можно найти в [2, с. 420-447].
Теорема 13.2.14. Грамматики из класса LR(1) порождают только детерминированные контекстно-свободные языки.
Теорема 13.2.15. Каждая грамматика из класса LL(1) принадлежит также классу LR(1).
Упражнение 13.2.16. Найти все правые разборы слова bbacba в грамматике
![\begin{align*}
S \; & {\to} \; bScS , \\
S \; & {\to} \; bS , \\
S \; & {\to} \; a .
\end{align*}](/sites/default/files/tex_cache/d849514b08e88c9573cc02c3876dfa12.png)
Упражнение 13.2.17. Найти детерминированный восходящий магазинный анализатор для грамматики
![\begin{align*}
S \; & {\to} \; a , \\
S \; & {\to} \; Sb , \\
S \; & {\to} \; SSc .
\end{align*}](/sites/default/files/tex_cache/63f402ea657d32d54f2621b75341c3ec.png)
Упражнение 13.2.18. Найти детерминированный восходящий магазинный анализатор для грамматики
![\begin{align*}
S \; & {\to} \; a , \\
S \; & {\to} \; bS , \\
S \; & {\to} \; cSS .
\end{align*}](/sites/default/files/tex_cache/996375bbf8af382b75bd04304604e1ad.png)