Опубликован: 09.07.2007 | Уровень: профессионал | Доступ: платный | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 14:

Синтаксический разбор

< Лекция 13 || Лекция 14: 12345 || Лекция 15 >
Аннотация: В данной лекции рассматриваются формальные определения, связанные с прямыми синтаксическими анализаторами, определяется понятие синтаксического разбора и связанные с ним специфические определения. Приведены практические примеры и упражнения для самостоятельной проработки

В этой лекции даются формальные определения, связанные с прямыми (то есть читающими входную строку слева направо) синтаксическими анализаторами. В первом разделе доказывается, что для языков из класса LL(1) можно построить основанный на детерминированном автомате с магазинной памятью анализатор, который создает дерево разбора, двигаясь снизу вверх, то есть от листьев к корню (в теории контекстно-свободных грамматик принято изображать деревья с корнем наверху). Во втором разделе формулируется аналогичный результат об анализе сверху вниз для грамматик из класса LR(1). При этом понятие анализа снизу вверх формализовано в терминах последовательности правил, примененных в левостороннем выводе, а понятие анализа сверху вниз - в терминах обращенной последовательности правил, примененных в правостороннем выводе.

13.1. Нисходящий разбор

Определение 13.1.1. Процесс нахождения дерева вывода слова w в заданной контекстно-свободной грамматике называется синтаксическим разбором или синтаксическим анализом (parsing).

Определение 13.1.2. Протоколом левостороннего вывода в контекстно-свободной грамматике G = \lalg N , \Sigma , P , S \ralg будем называть последовательность правил, примененных в этом выводе. Формально говоря, протоколом левостороннего вывода

\omega_0 , \omega_1 , \ldots , \omega_n
является последовательность
( A_1 \tto \alpha_1 ) , \ldots , ( A_n \tto \alpha_n ) ,
где для каждого i < n, если \omega_i = u B \theta и \omega_{i+1} = u \beta \theta для некоторых u \in \Sigma^* , B \in N , \theta \in \ns ^* , \beta \in \ns ^* , то Ai+1 = B и \alpha_{i+1} = \beta .

Пример 13.1.3. Рассмотрим контекстно-свободную грамматику

\begin{align*}
S \; & {\to} \; c , \\
S \; & {\to} \; dS , \\
S \; & {\to} \; aSeSb .
\end{align*}
Дереву вывода
\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
}
соответствует левосторонний вывод
S \pRightarrow
 aSeSb \pRightarrow
 aceSb \pRightarrow
 acedSb \pRightarrow
 acedcb .
Протоколом этого вывода является последовательность
( S \to aSeSb ) ,\
 ( S \to c ) ,\
 ( S \to dS ) ,\
 ( S \to c ) .

Лемма 13.1.4. Разным левосторонним выводам в одной и той же контекстно-свободной грамматике соответствуют разные протоколы.

Замечание 13.1.5. Протокол левостороннего вывода в контекстно-свободной грамматике является естественным описанием соответствующего дерева вывода в порядке префиксного обхода (preorder traversal). (При префиксном обходе упорядоченного дерева первым посещается корень этого дерева, затем выполняется префиксный обход первого непосредственного потомка корня, затем второго и т. д.)

Например, протокол левостороннего вывода из примера 13.1.3 задает процесс постепенного конструирования дерева вывода, изображенный ниже.

\newcommand{\rb}[1]{\raisebox{0pt}[8pt]{$#1$}}
\entrymodifiers={=<3.3mm>[o]}
\xymatrix@=0mm{
&&&&&\boldsymbol{S}
\\
\\
\\
\\
&&&&&S\ar[ddddddlllll]<-1mm>\ar[ddl]\ar[ddddddl]\ar[ddr]\ar[ddddddrrrrr]<1mm>\\
\\
&&&&\boldsymbol{S}&&\boldsymbol{S}\\
\\
\\
\\
\rb{a}&&&&\rb{\boldsymbol{e}}&&&&&&\rb{\boldsymbol{b}}
\\
\\
&&&&&S\ar[ddddddlllll]<-1mm>\ar[ddl]\ar[ddddddl]\ar[ddr]\ar[ddddddrrrrr]<1mm>\\
\\
&&&&S\ar[ddddll]&&\boldsymbol{S}\\
\\
\\
\\
\rb{a}&&\rb{c}&&\rb{e}&&&&&&\rb{\boldsymbol{b}}
\\
\\
&&&&&S\ar[ddddddlllll]<-1mm>\ar[ddl]\ar[ddddddl]\ar[ddr]\ar[ddddddrrrrr]<1mm>\\
\\
&&&&S\ar[ddddll]&&S\ar[dddd]\ar[ddr]\\
\\
&&&&&&&\boldsymbol{S}\\
\\
\rb{a}&&\rb{c}&&\rb{e}&&\rb{d}&&&&\rb{\boldsymbol{b}}
\\
\\
&&&&&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}
}

Определение 13.1.6. Левым разбором (left parse) слова w в контекстно-свободной грамматике G называется протокол любого левостороннего вывода слова w в грамматике G.

Пример 13.1.7. Левым разбором слова

aceaacecbecbb

в грамматике из примера 13.1.3 является последовательность

\begin{multiline*}
 ( S \tto aSeSb ) ,\
 ( S \tto c ) ,\
 ( S \tto aSeSb ) ,\\
 ( S \tto aSeSb ) ,\
 ( S \tto c ) ,\
 ( S \tto c ) ,\
 ( S \tto c ) .
\end{multiline*}

Определение 13.1.8. Процесс нахождения левого разбора слова w в заданной контекстно-свободной грамматике G называется нисходящим разбором (top-down parsing).

Определение 13.1.9. Вычислительным процессом МП-автомата M будем называть конечную последовательность его конфигураций, каждая из которых (кроме первой) получается из предыдущей одним тактом работы автомата M.

Пример 13.1.10. Рассмотрим МП-автомат

\objectwidth={5mm} \objectheight={5mm} \let\objectstyle=\scriptstyle
\xymatrix @=11mm{
  *=[o][F-]{1}
 \ar @`{+/l16mm/} [] ^{}
 \rloop{0,1} ^{ab,\varepsilon:E}
 \rloop{0,-1} ^{aa,E:\varepsilon}
 \ar  "1,2" <0.6mm> ^{b,\varepsilon:D}
& *=[o][F=]{2}
 \ar  "1,1" <0.6mm> ^{a,\varepsilon:D}
 \rloop{0,1} ^{\varepsilon,D:\varepsilon}
 \rloop{0,-1} ^{b,E:\varepsilon}
}
из примера 10.2.8. Последовательность
\begin{multiline*}
 \lp 1 , bab , \varepsilon \rp ,\
 \lp 2 , ab , D \rp ,\
 \lp 1 , b , DD \rp ,\
 \lp 2 , \varepsilon , DDD \rp ,\\
 \lp 2 , \varepsilon , DD \rp ,\
 \lp 2 , \varepsilon , D \rp ,\
 \lp 2 , \varepsilon , \varepsilon \rp
\end{multiline*}
является вычислительным процессом этого МП-автомата.

Определение 13.1.11. Если в некотором вычислительном процессе МП-автомата M = \lalg Q , \Sigma , \Gamma , \Delta , I , F \ralg первая конфигурация имеет вид \lp s , w , \varepsilon \rp , где s \in I и w \in \Sigma^* , а последняя конфигурация имеет вид \lp q , \varepsilon , \varepsilon \rp , где q \in F , то будем говорить, что этот вычислительный процесс допускает слово w.

Пример 13.1.12. Вычислительный процесс из примера 13.1.10 допускает слово bab.

Замечание 13.1.13. МП-автомат M допускает слово w \in \Sigma^* тогда и только тогда, когда некоторый вычислительный процесс МП-автомата M допускает слово w.

< Лекция 13 || Лекция 14: 12345 || Лекция 15 >
Юлия Маковецкая
Юлия Маковецкая

Упражнение 2.1.25

Евгения Гунченко
Евгения Гунченко

Сдавала тест экстерном, результат получен 74 после принятия данного результата и соответственно оплаты курса, будет ли выдано удостоверение о повышении квалификации?

Юрий Фролов
Юрий Фролов
Украина
Руслан Мухамедьяров
Руслан Мухамедьяров
Россия, Казань, КФУ