Skip to content

Commit 8cbfe33

Browse files
fix: Add tree construction to the LL(1) algorithm
Clarified the definition of the first set. Also added tree construction to the LL(1) algorithm
1 parent 5b0fd05 commit 8cbfe33

File tree

1 file changed

+184
-3
lines changed

1 file changed

+184
-3
lines changed

tex/GLL-based_CFPQ.tex

Lines changed: 184 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)