@@ -109,7 +109,8 @@ \section{LL(k)-алгоритм синтаксического анализа}
109109 Пусть $ G = \langle N, \Sigma , P, S \rangle $ ~--- КС-грамматика. Множество $ \first [k]$ определено для сентенциальной формы $ \alpha $ следующим образом:
110110 \[ \first [k](\alpha ) = \{ \omega \in \Sigma ^* \mid \alpha \derives {} \omega \text { и } |\omega | < k \text { либо } \exists \beta : \alpha \derives {} \omega \beta \text { и } |\omega | = k \}
111111 \]
112- , где $ \alpha , \beta \in (N \cup \Sigma )^*.$
112+ , где $ \alpha , \beta \in (N \cup \Sigma )^*.$ Это означает, что в общем случае $ \alpha $ может быть как одиночным нетерминалом, так и произвольной цепочкой из смешанного алфавита.
113+ Далее в алгоритме построения множества $ \first [k]$ это наглядно показано.
113114\end {definition }
114115
115116\begin {definition }
@@ -165,6 +166,8 @@ \section{LL(k)-алгоритм синтаксического анализа}
165166 \first (A') &= \{ a, b \}
166167\end {align* }
167168\end {multicols }
169+ Как можно заметить, в примере поиска множества $ \first $ в качестве аргумента функции передается нетерминал, но множество
170+ $ \first $ ищется для правой части правила.
168171
169172Пример множеств $ \follow $ для нетерминалов грамматики $ G$ :
170173
@@ -215,7 +218,7 @@ \section{LL(k)-алгоритм синтаксического анализа}
215218\begin {example }Пример работы LL анализатора.
216219Рассмотрим грамматику $ S \to aSbS \mid \varepsilon $ и выводимое слово $ \omega = abab$ .
217220
218- Расмотрим пошагово работу алгоритма, будем использовать таблицу, построенную в предыдущем примере:
221+ Расмотрим пошагово работу алгоритма c построением дерева , будем использовать таблицу, построенную в предыдущем примере:
219222
220223\begin {enumerate }
221224 \item Начало работы.
@@ -264,6 +267,14 @@ \section{LL(k)-алгоритм синтаксического анализа}
264267 \textcolor {red}{a} & b & a & b & \$ \\ \hline
265268 \end {tabular }
266269
270+ \begin {center }
271+ \resizebox {1cm}{1cm}{
272+ \begin {tikzpicture }[shorten >=1pt,on grid,auto,node distance=1.8cm]
273+ \node [symbol_node] (s_0) {$ (S)$ };
274+ \end {tikzpicture }
275+ }
276+ \end {center }
277+
267278\item Снимаем терминал $ a$ со стека и двигаем указатель.
268279
269280 Стек: \,
@@ -280,6 +291,20 @@ \section{LL(k)-алгоритм синтаксического анализа}
280291 a & \textcolor {red}{b} & a & b & \$ \\ \hline
281292 \end {tabular }
282293
294+ \begin {center }
295+ \resizebox {1.5cm}{1.3cm}{
296+ \begin {tikzpicture }[shorten >=1pt,on grid,auto,node distance=1.8cm]
297+
298+ \node [symbol_node] (s_0) {$ (S)$ };
299+ \node [symbol_node] (a_0) [below =of s_0] {$ (a)$ };
300+
301+ \path [->]
302+ (s_0) edge (a_0)
303+
304+ \end {tikzpicture }
305+ }
306+ \end {center }
307+
283308\item Ищем ячейку с координатами (S, b), применяем продукцию из ячейки.
284309
285310 Стек: \,
@@ -294,6 +319,22 @@ \section{LL(k)-алгоритм синтаксического анализа}
294319 \hline
295320 a & \textcolor {red}{b} & a & b & \$ \\ \hline
296321 \end {tabular }
322+ \begin {center }
323+ \resizebox {3cm}{2cm}{
324+ \begin {tikzpicture }[shorten >=1pt,on grid,auto,node distance=1.8cm]
325+
326+ \node [symbol_node] (s_0) {$ (S)$ };
327+ \node [symbol_node] (a_0) [below =of s_0] {$ (a)$ };
328+ \node [symbol_node] (s_1) [right =of a_0] {$ (S)$ };
329+
330+ \path [->]
331+ (s_0) edge (a_0)
332+ (s_0) edge (s_1)
333+
334+ \end {tikzpicture }
335+ }
336+ \end {center }
337+
297338
298339\item Снимаем терминал $ b$ со стека и двигаем указатель.
299340
@@ -309,6 +350,24 @@ \section{LL(k)-алгоритм синтаксического анализа}
309350 a & b & \textcolor {red}{a} & b & \$ \\ \hline
310351 \end {tabular }
311352
353+ \begin {center }
354+ \resizebox {3cm}{2cm}{
355+ \begin {tikzpicture }[shorten >=1pt,on grid,auto,node distance=1.8cm]
356+
357+ \node [symbol_node] (s_0) {$ (S)$ };
358+ \node [symbol_node] (s_1) [below =of s_0] {$ (S)$ };
359+ \node [symbol_node] (a_0) [left =of s_1] {$ (a)$ };
360+ \node [symbol_node] (b_0) [right =of s_1] {$ (b)$ };
361+
362+ \path [->]
363+ (s_0) edge (a_0)
364+ (s_0) edge (s_1)
365+ (s_0) edge (b_0)
366+
367+ \end {tikzpicture }
368+ }
369+ \end {center }
370+
312371 \item Ищем ячейку с координатами (S, a), применяем продукцию из ячейки.
313372
314373 Стек: \,
@@ -326,6 +385,26 @@ \section{LL(k)-алгоритм синтаксического анализа}
326385 a & b & \textcolor {red}{a} & b & \$ \\ \hline
327386 \end {tabular }
328387
388+ \begin {center }
389+ \resizebox {5cm}{3cm}{
390+ \begin {tikzpicture }[shorten >=1pt,on grid,auto,node distance=1.8cm]
391+
392+ \node [symbol_node] (s_0) {$ (S)$ };
393+ \node [symbol_node] (s_1) [below =of s_0] {$ (S)$ };
394+ \node [symbol_node] (a_0) [left =of s_1] {$ (a)$ };
395+ \node [symbol_node] (b_0) [right =of s_1] {$ (b)$ };
396+ \node [symbol_node] (s_2) [right =of b_0] {$ (S)$ };
397+
398+ \path [->]
399+ (s_0) edge (a_0)
400+ (s_0) edge (s_1)
401+ (s_0) edge (b_0)
402+ (s_0) edge (s_2)
403+
404+ \end {tikzpicture }
405+ }
406+ \end {center }
407+
329408\item Снимаем терминал $ a$ со стека и двигаем указатель.
330409
331410 Стек: \,
@@ -342,6 +421,28 @@ \section{LL(k)-алгоритм синтаксического анализа}
342421 a & b & a & \textcolor {red}{b} & \$ \\ \hline
343422 \end {tabular }
344423
424+ \begin {center }
425+ \resizebox {6cm}{3.5cm}{
426+ \begin {tikzpicture }[shorten >=1pt,on grid,auto,node distance=1.8cm]
427+
428+ \node [symbol_node] (s_0) {$ (S)$ };
429+ \node [symbol_node] (s_1) [below =of s_0] {$ (S)$ };
430+ \node [symbol_node] (a_0) [left =of s_1] {$ (a)$ };
431+ \node [symbol_node] (b_0) [right =of s_1] {$ (b)$ };
432+ \node [symbol_node] (s_2) [right =of b_0] {$ (S)$ };
433+ \node [symbol_node] (a_1) [below =of s_2] {$ (a)$ };
434+
435+ \path [->]
436+ (s_0) edge (a_0)
437+ (s_0) edge (s_1)
438+ (s_0) edge (b_0)
439+ (s_0) edge (s_2)
440+ (s_2) edge (a_1)
441+
442+
443+ \end {tikzpicture }
444+ }
445+ \end {center }
345446\item Ищем ячейку с координатами (S, b), применяем продукцию из ячейки.
346447
347448 Стек: \,
@@ -357,6 +458,31 @@ \section{LL(k)-алгоритм синтаксического анализа}
357458 a & b & a & \textcolor {red}{b} & \$ \\ \hline
358459 \end {tabular }
359460
461+ \begin {center }
462+ \resizebox {6cm}{3.5cm}{
463+ \begin {tikzpicture }[shorten >=1pt,on grid,auto,node distance=1.8cm]
464+
465+ \node [symbol_node] (s_0) {$ (S)$ };
466+ \node [symbol_node] (s_1) [below =of s_0] {$ (S)$ };
467+ \node [symbol_node] (a_0) [left =of s_1] {$ (a)$ };
468+ \node [symbol_node] (b_0) [right =of s_1] {$ (b)$ };
469+ \node [symbol_node] (s_2) [right =of b_0] {$ (S)$ };
470+ \node [symbol_node] (s_3) [below =of s_2] {$ (S)$ };
471+ \node [symbol_node] (a_1) [left =of s_3] {$ (a)$ };
472+
473+
474+ \path [->]
475+ (s_0) edge (a_0)
476+ (s_0) edge (s_1)
477+ (s_0) edge (b_0)
478+ (s_0) edge (s_2)
479+ (s_2) edge (a_1)
480+ (s_2) edge (s_3)
481+
482+ \end {tikzpicture }
483+ }
484+ \end {center }
485+
360486\item Снимаем терминал $ b$ со стека и двигаем указатель.
361487
362488 Стек: \,
@@ -371,6 +497,31 @@ \section{LL(k)-алгоритм синтаксического анализа}
371497 a & b & a & b & \textcolor {red}{\$ } \\ \hline
372498 \end {tabular }
373499
500+ \begin {center }
501+ \resizebox {6cm}{3.5cm}{
502+ \begin {tikzpicture }[shorten >=1pt,on grid,auto,node distance=1.8cm]
503+
504+ \node [symbol_node] (s_0) {$ (S)$ };
505+ \node [symbol_node] (s_1) [below =of s_0] {$ (S)$ };
506+ \node [symbol_node] (a_0) [left =of s_1] {$ (a)$ };
507+ \node [symbol_node] (b_0) [right =of s_1] {$ (b)$ };
508+ \node [symbol_node] (s_2) [right =of b_0] {$ (S)$ };
509+ \node [symbol_node] (s_3) [below =of s_2] {$ (S)$ };
510+ \node [symbol_node] (a_1) [left =of s_3] {$ (a)$ };
511+ \node [symbol_node] (b_1) [right =of s_3] {$ (b)$ };
512+
513+ \path [->]
514+ (s_0) edge (a_0)
515+ (s_0) edge (s_1)
516+ (s_0) edge (b_0)
517+ (s_0) edge (s_2)
518+ (s_2) edge (a_1)
519+ (s_2) edge (s_3)
520+ (s_2) edge (b_1)
521+
522+ \end {tikzpicture }
523+ }
524+ \end {center }
374525\item Ищем ячейку с координатами (S, \$ ), применяем продукцию из ячейки.
375526
376527 Стек: \,
@@ -384,13 +535,43 @@ \section{LL(k)-алгоритм синтаксического анализа}
384535 a & b & a & b & \textcolor {red}{\$ } \\ \hline
385536 \end {tabular }
386537
538+ \begin {center }
539+ \resizebox {7cm}{4cm}{
540+ \begin {tikzpicture }[shorten >=1pt,on grid,auto,node distance=1.8cm]
541+
542+ \node [symbol_node] (s_0) {$ (S)$ };
543+ \node [symbol_node] (s_1) [below =of s_0] {$ (S)$ }
544+ \node [symbol_node] (a_0) [left =of s_1] {$ (a)$ };
545+ \node [symbol_node] (b_0) [right =of s_1] {$ (b)$ };
546+ \node [symbol_node] (s_2) [right =of b_0] {$ (S)$ };
547+ \node [symbol_node] (s_3) [below =of s_2] {$ (S)$ };
548+ \node [symbol_node] (a_1) [left =of s_3] {$ (a)$ };
549+ \node [symbol_node] (b_1) [right =of s_3] {$ (b)$ };
550+ \node [symbol_node] (s_4) [right =of b_1] {$ (S)$ };
551+
552+
553+ \path [->]
554+ (s_0) edge (a_0)
555+ (s_0) edge (s_1)
556+ (s_0) edge (b_0)
557+ (s_0) edge (s_2)
558+ (s_2) edge (a_1)
559+ (s_2) edge (s_3)
560+ (s_2) edge (b_1)
561+ (s_2) edge (s_3)
562+ (s_2) edge (s_4)
563+
564+
565+ \end {tikzpicture }
566+ }
567+ \end {center }
387568\item Оказались в конце строки и на вершине стека символ конца --- завершаем разбор.
388569
389570\end {enumerate }
390571
391572\end {example }
392573
393- Можно расширить данный алгоритм так, чтобы он строил дерево вывода. Дерево будет строиться сверху вниз, от корня к листьям. Для этого необходимо расширить шаги алгоритма.
574+ Дерево строится сверху вниз, от корня к листьям. Для этого выолняются следующие шаги алгоритма:
394575\begin {itemize }
395576 \item В ситуации, когда мы читаем очередной терминал (на вершине стека и во входе одинаковые терминалы), мы создаём лист с соответствующим терминалом.
396577 \item В ситуации, когда мы заменяем нетерминал на стеке на правую часть продукции в соответствии с управляющей таблицей, мы создаём нетерминальный узел соответствующий применяемой продукции.
0 commit comments