Skip to content

Commit 2a0dc09

Browse files
Add tree construction in LL(1) and some fixed typos (#44)
* fix: typos in ring definition and LL example add example of buildig tree in LL algorithm and fixed typos fix: actions * fix: add semicolon * fix: delete superfluous, some typos
1 parent 21887e0 commit 2a0dc09

File tree

3 files changed

+207
-11
lines changed

3 files changed

+207
-11
lines changed

tex/GLL-based_CFPQ.tex

+203-7
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ \section{LL(k)-алгоритм синтаксического анализа}
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
\]
112112
, где $\alpha, \beta \in (N \cup \Sigma)^*.$
113+
Далее в алгоритме построения множества $\first[k]$ это наглядно показано.
113114
\end{definition}
114115

115116
\begin{definition}
@@ -155,16 +156,13 @@ \section{LL(k)-алгоритм синтаксического анализа}
155156

156157
Пример множеств $\first$ для нетерминалов грамматики $G$:
157158

158-
\begin{multicols}{2}
159-
160-
\columnbreak
161-
159+
% \begin{multicols}{2}
162160
\begin{align*}
163161
\first(S) &= \{ a \} & \first(B) &= \{ c, \varepsilon \} \\
164162
\first(A) &= \{ a, \varepsilon \} & \first(S') &= \{ a, b, \varepsilon \}\\
165163
\first(A') &= \{ a, b \}
166164
\end{align*}
167-
\end{multicols}
165+
% \end{multicols}
168166

169167
Пример множеств $\follow$ для нетерминалов грамматики $G$:
170168

@@ -215,7 +213,7 @@ \section{LL(k)-алгоритм синтаксического анализа}
215213
\begin{example}Пример работы LL анализатора.
216214
Рассмотрим грамматику $S \to aSbS \mid \varepsilon$ и выводимое слово $\omega = abab$.
217215

218-
Расмотрим пошагово работу алгоритма, будем использовать таблицу, построенную в предыдущем примере:
216+
Расмотрим пошагово работу алгоритма c построением дерева, будем использовать таблицу, построенную в предыдущем примере:
219217

220218
\begin{enumerate}
221219
\item Начало работы.
@@ -264,6 +262,14 @@ \section{LL(k)-алгоритм синтаксического анализа}
264262
\textcolor{red}{a} & b & a & b & \$ \\ \hline
265263
\end{tabular}
266264

265+
\begin{center}
266+
\resizebox{1cm}{1cm}{
267+
\begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm]
268+
\node[symbol_node] (s_0) {$S$};
269+
\end{tikzpicture}
270+
}
271+
\end{center}
272+
267273
\item Снимаем терминал $a$ со стека и двигаем указатель.
268274

269275
Стек: \,
@@ -280,6 +286,20 @@ \section{LL(k)-алгоритм синтаксического анализа}
280286
a & \textcolor{red}{b} & a & b & \$ \\ \hline
281287
\end{tabular}
282288

289+
\begin{center}
290+
\resizebox{1.5cm}{1.3cm}{
291+
\begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm]
292+
293+
\node[symbol_node] (s_0) {$S$};
294+
\node[symbol_node] (a_0) [below =of s_0] {$a$};
295+
296+
\path[->]
297+
(s_0) edge (a_0)
298+
;
299+
\end{tikzpicture}
300+
}
301+
\end{center}
302+
283303
\item Ищем ячейку с координатами (S, b), применяем продукцию из ячейки.
284304

285305
Стек: \,
@@ -295,6 +315,23 @@ \section{LL(k)-алгоритм синтаксического анализа}
295315
a & \textcolor{red}{b} & a & b & \$ \\ \hline
296316
\end{tabular}
297317

318+
\begin{center}
319+
\resizebox{3cm}{2cm}{
320+
\begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm]
321+
322+
\node[symbol_node] (s_0) {$S$};
323+
\node[symbol_node] (a_0) [below =of s_0] {$a$};
324+
\node[symbol_node] (s_1) [right =of a_0] {$S$};
325+
\node[symbol_node] (eps_1) [below =of s_1] {$\varepsilon$};
326+
\path[->]
327+
(s_0) edge (a_0)
328+
(s_0) edge (s_1)
329+
(s_1) edge (eps_1)
330+
;
331+
\end{tikzpicture}
332+
}
333+
\end{center}
334+
298335
\item Снимаем терминал $b$ со стека и двигаем указатель.
299336

300337
Стек: \,
@@ -309,6 +346,26 @@ \section{LL(k)-алгоритм синтаксического анализа}
309346
a & b & \textcolor{red}{a} & b & \$ \\ \hline
310347
\end{tabular}
311348

349+
\begin{center}
350+
\resizebox{3cm}{2cm}{
351+
\begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm]
352+
353+
\node[symbol_node] (s_0) {$S$};
354+
\node[symbol_node] (s_1) [below =of s_0] {$S$};
355+
\node[symbol_node] (a_0) [left =of s_1] {$a$};
356+
\node[symbol_node] (b_0) [right =of s_1] {$b$};
357+
\node[symbol_node] (eps_1) [below =of s_1] {$\varepsilon$};
358+
359+
\path[->]
360+
(s_0) edge (a_0)
361+
(s_0) edge (s_1)
362+
(s_0) edge (b_0)
363+
(s_1) edge (eps_1)
364+
;
365+
\end{tikzpicture}
366+
}
367+
\end{center}
368+
312369
\item Ищем ячейку с координатами (S, a), применяем продукцию из ячейки.
313370

314371
Стек: \,
@@ -326,6 +383,28 @@ \section{LL(k)-алгоритм синтаксического анализа}
326383
a & b & \textcolor{red}{a} & b & \$ \\ \hline
327384
\end{tabular}
328385

386+
\begin{center}
387+
\resizebox{5cm}{3cm}{
388+
\begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm]
389+
390+
\node[symbol_node] (s_0) {$S$};
391+
\node[symbol_node] (s_1) [below =of s_0] {$S$};
392+
\node[symbol_node] (a_0) [left =of s_1] {$a$};
393+
\node[symbol_node] (b_0) [right =of s_1] {$b$};
394+
\node[symbol_node] (s_2) [right =of b_0] {$S$};
395+
\node[symbol_node] (eps_1) [below =of s_1] {$\varepsilon$};
396+
397+
\path[->]
398+
(s_0) edge (a_0)
399+
(s_0) edge (s_1)
400+
(s_0) edge (b_0)
401+
(s_0) edge (s_2)
402+
(s_1) edge (eps_1)
403+
;
404+
\end{tikzpicture}
405+
}
406+
\end{center}
407+
329408
\item Снимаем терминал $a$ со стека и двигаем указатель.
330409

331410
Стек: \,
@@ -342,6 +421,30 @@ \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+
\node[symbol_node] (eps_1) [below =of s_1] {$\varepsilon$};
435+
436+
\path[->]
437+
(s_0) edge (a_0)
438+
(s_0) edge (s_1)
439+
(s_0) edge (b_0)
440+
(s_0) edge (s_2)
441+
(s_2) edge (a_1)
442+
(s_1) edge (eps_1)
443+
;
444+
\end{tikzpicture}
445+
}
446+
\end{center}
447+
345448
\item Ищем ячейку с координатами (S, b), применяем продукцию из ячейки.
346449

347450
Стек: \,
@@ -357,6 +460,35 @@ \section{LL(k)-алгоритм синтаксического анализа}
357460
a & b & a & \textcolor{red}{b} & \$ \\ \hline
358461
\end{tabular}
359462

463+
\begin{center}
464+
\resizebox{6cm}{3.5cm}{
465+
\begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm]
466+
467+
\node[symbol_node] (s_0) {$S$};
468+
\node[symbol_node] (s_1) [below =of s_0] {$S$};
469+
\node[symbol_node] (a_0) [left =of s_1] {$a$};
470+
\node[symbol_node] (b_0) [right =of s_1] {$b$};
471+
\node[symbol_node] (s_2) [right =of b_0] {$S$};
472+
\node[symbol_node] (s_3) [below =of s_2] {$S$};
473+
\node[symbol_node] (a_1) [left =of s_3] {$a$};
474+
\node[symbol_node] (eps_1) [below =of s_1] {$\varepsilon$};
475+
\node[symbol_node] (eps_2) [below =of s_3] {$\varepsilon$};
476+
477+
478+
\path[->]
479+
(s_0) edge (a_0)
480+
(s_0) edge (s_1)
481+
(s_0) edge (b_0)
482+
(s_0) edge (s_2)
483+
(s_2) edge (a_1)
484+
(s_2) edge (s_3)
485+
(s_1) edge (eps_1)
486+
(s_3) edge (eps_2)
487+
;
488+
\end{tikzpicture}
489+
}
490+
\end{center}
491+
360492
\item Снимаем терминал $b$ со стека и двигаем указатель.
361493

362494
Стек: \,
@@ -371,6 +503,36 @@ \section{LL(k)-алгоритм синтаксического анализа}
371503
a & b & a & b & \textcolor{red}{\$} \\ \hline
372504
\end{tabular}
373505

506+
\begin{center}
507+
\resizebox{6cm}{3.5cm}{
508+
\begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm]
509+
510+
\node[symbol_node] (s_0) {$S$};
511+
\node[symbol_node] (s_1) [below =of s_0] {$S$};
512+
\node[symbol_node] (a_0) [left =of s_1] {$a$};
513+
\node[symbol_node] (b_0) [right =of s_1] {$b$};
514+
\node[symbol_node] (s_2) [right =of b_0] {$S$};
515+
\node[symbol_node] (s_3) [below =of s_2] {$S$};
516+
\node[symbol_node] (a_1) [left =of s_3] {$a$};
517+
\node[symbol_node] (b_1) [right =of s_3] {$b$};
518+
\node[symbol_node] (eps_1) [below =of s_1] {$\varepsilon$};
519+
\node[symbol_node] (eps_2) [below =of s_3] {$\varepsilon$};
520+
521+
\path[->]
522+
(s_0) edge (a_0)
523+
(s_0) edge (s_1)
524+
(s_0) edge (b_0)
525+
(s_0) edge (s_2)
526+
(s_2) edge (a_1)
527+
(s_2) edge (s_3)
528+
(s_2) edge (b_1)
529+
(s_1) edge (eps_1)
530+
(s_3) edge (eps_2)
531+
;
532+
\end{tikzpicture}
533+
}
534+
\end{center}
535+
374536
\item Ищем ячейку с координатами (S, \$), применяем продукцию из ячейки.
375537

376538
Стек: \,
@@ -384,13 +546,47 @@ \section{LL(k)-алгоритм синтаксического анализа}
384546
a & b & a & b & \textcolor{red}{\$} \\ \hline
385547
\end{tabular}
386548

549+
\begin{center}
550+
\resizebox{6cm}{3.5cm}{
551+
\begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm]
552+
553+
\node[symbol_node] (s_0) {$S$};
554+
\node[symbol_node] (s_1) [below =of s_0] {$S$};
555+
\node[symbol_node] (a_0) [left =of s_1] {$a$};
556+
\node[symbol_node] (b_0) [right =of s_1] {$b$};
557+
\node[symbol_node] (s_2) [right =of b_0] {$S$};
558+
\node[symbol_node] (s_3) [below =of s_2] {$S$};
559+
\node[symbol_node] (a_1) [left =of s_3] {$a$};
560+
\node[symbol_node] (b_1) [right =of s_3] {$b$};
561+
\node[symbol_node] (s_4) [right =of b_1] {$S$};
562+
\node[symbol_node] (eps_1) [below =of s_1] {$\varepsilon$};
563+
\node[symbol_node] (eps_2) [below =of s_3] {$\varepsilon$};
564+
\node[symbol_node] (eps_3) [below =of s_4] {$\varepsilon$};
565+
566+
\path[->]
567+
(s_0) edge (a_0)
568+
(s_0) edge (s_1)
569+
(s_0) edge (b_0)
570+
(s_0) edge (s_2)
571+
(s_2) edge (a_1)
572+
(s_2) edge (s_3)
573+
(s_2) edge (b_1)
574+
(s_2) edge (s_4)
575+
(s_1) edge (eps_1)
576+
(s_3) edge (eps_2)
577+
(s_4) edge (eps_3)
578+
;
579+
\end{tikzpicture}
580+
}
581+
\end{center}
582+
387583
\item Оказались в конце строки и на вершине стека символ конца --- завершаем разбор.
388584

389585
\end{enumerate}
390586

391587
\end{example}
392588

393-
Можно расширить данный алгоритм так, чтобы он строил дерево вывода. Дерево будет строиться сверху вниз, от корня к листьям. Для этого необходимо расширить шаги алгоритма.
589+
Дерево строится сверху вниз, от корня к листьям. Для этого выолняются следующие шаги алгоритма:
394590
\begin{itemize}
395591
\item В ситуации, когда мы читаем очередной терминал (на вершине стека и во входе одинаковые терминалы), мы создаём лист с соответствующим терминалом.
396592
\item В ситуации, когда мы заменяем нетерминал на стеке на правую часть продукции в соответствии с управляющей таблицей, мы создаём нетерминальный узел соответствующий применяемой продукции.

tex/LinearAlgebra.tex

+3-3
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ \section{Полукольцо}
320320
\section{Кольцо}
321321

322322
\begin{definition}[Кольцо]
323-
Непустое множество $R$ с двумя бинарными операциями $\oplus: R \times R \to R$ (умножение) и $\otimes: R \times R \to R$ (сложение) называется \emph{кольцом}, если выполнены следующие условия.
323+
Непустое множество $R$ с двумя бинарными операциями $\oplus: R \times R \to R$ (сложение) и $\otimes: R \times R \to R$ (умножение) называется \emph{кольцом}, если выполнены следующие условия.
324324
\begin{enumerate}
325325
\item $(R, \oplus)$~--- это абелева группа, нейтральный элемент которой~--- $\Bbbzero$.
326326
Для любых $a, b, c \in R$:
@@ -331,11 +331,11 @@ \section{Кольцо}
331331
\item для любого $a \in R$ существует $-a \in R$, такой что $a + (-a) = \Bbbzero$.
332332
\end{itemize}
333333
В последнем пункте кроется отличие от полукольца.
334-
\item $(R, \otimes)$~--- это моноид, нейтральный элемент которого~--- $\Bbbzero$.
334+
\item $(R, \otimes)$~--- это моноид, нейтральный элемент которого~--- 1.
335335
Для любых $a, b, c \in R$:
336336
\begin{itemize}
337337
\item $(a \otimes b) \otimes c = a \otimes (b \otimes c)$
338-
\item $\Bbbzero \otimes a = a \otimes \Bbbzero = a$
338+
\item $1 \otimes a = a \otimes 1 = a$
339339
\end{itemize}
340340
\item $\otimes$ дистрибутивно слева и справа относительно $\oplus$:
341341
\begin{itemize}

tex/TensorProduct.tex

+1-1
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ \section{Примеры}
417417
То есть находим ровно одну новую пару вершин, между которыми существует интересующий нас путь.
418418
Попробуйте спрогнозировать, сколько итераций нам ещё осталось сделать.
419419

420-
\textbf{Итерауия 4}.
420+
\textbf{Итерация 4}.
421421
Продолжаем. Вычисляем тензорное произведение.
422422

423423
\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag}

0 commit comments

Comments
 (0)