diff --git a/tex/GLL-based_CFPQ.tex b/tex/GLL-based_CFPQ.tex index d663728..7289ddf 100644 --- a/tex/GLL-based_CFPQ.tex +++ b/tex/GLL-based_CFPQ.tex @@ -110,6 +110,7 @@ \section{LL(k)-алгоритм синтаксического анализа} \[ \first[k](\alpha) = \{ \omega \in \Sigma^* \mid \alpha \derives{} \omega \text{ и } |\omega| < k \text{ либо } \exists \beta: \alpha \derives{} \omega \beta \text{ и } |\omega| = k \} \] , где $\alpha, \beta \in (N \cup \Sigma)^*.$ + Далее в алгоритме построения множества $\first[k]$ это наглядно показано. \end{definition} \begin{definition} @@ -155,16 +156,13 @@ \section{LL(k)-алгоритм синтаксического анализа} Пример множеств $\first$ для нетерминалов грамматики $G$: -\begin{multicols}{2} - -\columnbreak - +% \begin{multicols}{2} \begin{align*} \first(S) &= \{ a \} & \first(B) &= \{ c, \varepsilon \} \\ \first(A) &= \{ a, \varepsilon \} & \first(S') &= \{ a, b, \varepsilon \}\\ \first(A') &= \{ a, b \} \end{align*} -\end{multicols} +% \end{multicols} Пример множеств $\follow$ для нетерминалов грамматики $G$: @@ -215,7 +213,7 @@ \section{LL(k)-алгоритм синтаксического анализа} \begin{example}Пример работы LL анализатора. Рассмотрим грамматику $S \to aSbS \mid \varepsilon$ и выводимое слово $\omega = abab$. -Расмотрим пошагово работу алгоритма, будем использовать таблицу, построенную в предыдущем примере: +Расмотрим пошагово работу алгоритма c построением дерева, будем использовать таблицу, построенную в предыдущем примере: \begin{enumerate} \item Начало работы. @@ -264,6 +262,14 @@ \section{LL(k)-алгоритм синтаксического анализа} \textcolor{red}{a} & b & a & b & \$ \\ \hline \end{tabular} + \begin{center} + \resizebox{1cm}{1cm}{ + \begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm] + \node[symbol_node] (s_0) {$S$}; + \end{tikzpicture} + } + \end{center} + \item Снимаем терминал $a$ со стека и двигаем указатель. Стек: \, @@ -280,6 +286,20 @@ \section{LL(k)-алгоритм синтаксического анализа} a & \textcolor{red}{b} & a & b & \$ \\ \hline \end{tabular} + \begin{center} + \resizebox{1.5cm}{1.3cm}{ + \begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm] + + \node[symbol_node] (s_0) {$S$}; + \node[symbol_node] (a_0) [below =of s_0] {$a$}; + + \path[->] + (s_0) edge (a_0) + ; + \end{tikzpicture} + } + \end{center} + \item Ищем ячейку с координатами (S, b), применяем продукцию из ячейки. Стек: \, @@ -295,6 +315,23 @@ \section{LL(k)-алгоритм синтаксического анализа} a & \textcolor{red}{b} & a & b & \$ \\ \hline \end{tabular} + \begin{center} + \resizebox{3cm}{2cm}{ + \begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm] + + \node[symbol_node] (s_0) {$S$}; + \node[symbol_node] (a_0) [below =of s_0] {$a$}; + \node[symbol_node] (s_1) [right =of a_0] {$S$}; + \node[symbol_node] (eps_1) [below =of s_1] {$\varepsilon$}; + \path[->] + (s_0) edge (a_0) + (s_0) edge (s_1) + (s_1) edge (eps_1) + ; + \end{tikzpicture} + } +\end{center} + \item Снимаем терминал $b$ со стека и двигаем указатель. Стек: \, @@ -309,6 +346,26 @@ \section{LL(k)-алгоритм синтаксического анализа} a & b & \textcolor{red}{a} & b & \$ \\ \hline \end{tabular} + \begin{center} + \resizebox{3cm}{2cm}{ + \begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm] + + \node[symbol_node] (s_0) {$S$}; + \node[symbol_node] (s_1) [below =of s_0] {$S$}; + \node[symbol_node] (a_0) [left =of s_1] {$a$}; + \node[symbol_node] (b_0) [right =of s_1] {$b$}; + \node[symbol_node] (eps_1) [below =of s_1] {$\varepsilon$}; + + \path[->] + (s_0) edge (a_0) + (s_0) edge (s_1) + (s_0) edge (b_0) + (s_1) edge (eps_1) + ; + \end{tikzpicture} + } +\end{center} + \item Ищем ячейку с координатами (S, a), применяем продукцию из ячейки. Стек: \, @@ -326,6 +383,28 @@ \section{LL(k)-алгоритм синтаксического анализа} a & b & \textcolor{red}{a} & b & \$ \\ \hline \end{tabular} + \begin{center} + \resizebox{5cm}{3cm}{ + \begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm] + + \node[symbol_node] (s_0) {$S$}; + \node[symbol_node] (s_1) [below =of s_0] {$S$}; + \node[symbol_node] (a_0) [left =of s_1] {$a$}; + \node[symbol_node] (b_0) [right =of s_1] {$b$}; + \node[symbol_node] (s_2) [right =of b_0] {$S$}; + \node[symbol_node] (eps_1) [below =of s_1] {$\varepsilon$}; + + \path[->] + (s_0) edge (a_0) + (s_0) edge (s_1) + (s_0) edge (b_0) + (s_0) edge (s_2) + (s_1) edge (eps_1) + ; + \end{tikzpicture} + } + \end{center} + \item Снимаем терминал $a$ со стека и двигаем указатель. Стек: \, @@ -342,6 +421,30 @@ \section{LL(k)-алгоритм синтаксического анализа} a & b & a & \textcolor{red}{b} & \$ \\ \hline \end{tabular} + \begin{center} + \resizebox{6cm}{3.5cm}{ + \begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm] + + \node[symbol_node] (s_0) {$S$}; + \node[symbol_node] (s_1) [below =of s_0] {$S$}; + \node[symbol_node] (a_0) [left =of s_1] {$a$}; + \node[symbol_node] (b_0) [right =of s_1] {$b$}; + \node[symbol_node] (s_2) [right =of b_0] {$S$}; + \node[symbol_node] (a_1) [below =of s_2] {$a$}; + \node[symbol_node] (eps_1) [below =of s_1] {$\varepsilon$}; + + \path[->] + (s_0) edge (a_0) + (s_0) edge (s_1) + (s_0) edge (b_0) + (s_0) edge (s_2) + (s_2) edge (a_1) + (s_1) edge (eps_1) + ; + \end{tikzpicture} + } + \end{center} + \item Ищем ячейку с координатами (S, b), применяем продукцию из ячейки. Стек: \, @@ -357,6 +460,35 @@ \section{LL(k)-алгоритм синтаксического анализа} a & b & a & \textcolor{red}{b} & \$ \\ \hline \end{tabular} + \begin{center} + \resizebox{6cm}{3.5cm}{ + \begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm] + + \node[symbol_node] (s_0) {$S$}; + \node[symbol_node] (s_1) [below =of s_0] {$S$}; + \node[symbol_node] (a_0) [left =of s_1] {$a$}; + \node[symbol_node] (b_0) [right =of s_1] {$b$}; + \node[symbol_node] (s_2) [right =of b_0] {$S$}; + \node[symbol_node] (s_3) [below =of s_2] {$S$}; + \node[symbol_node] (a_1) [left =of s_3] {$a$}; + \node[symbol_node] (eps_1) [below =of s_1] {$\varepsilon$}; + \node[symbol_node] (eps_2) [below =of s_3] {$\varepsilon$}; + + + \path[->] + (s_0) edge (a_0) + (s_0) edge (s_1) + (s_0) edge (b_0) + (s_0) edge (s_2) + (s_2) edge (a_1) + (s_2) edge (s_3) + (s_1) edge (eps_1) + (s_3) edge (eps_2) + ; + \end{tikzpicture} + } + \end{center} + \item Снимаем терминал $b$ со стека и двигаем указатель. Стек: \, @@ -371,6 +503,36 @@ \section{LL(k)-алгоритм синтаксического анализа} a & b & a & b & \textcolor{red}{\$} \\ \hline \end{tabular} + \begin{center} + \resizebox{6cm}{3.5cm}{ + \begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm] + + \node[symbol_node] (s_0) {$S$}; + \node[symbol_node] (s_1) [below =of s_0] {$S$}; + \node[symbol_node] (a_0) [left =of s_1] {$a$}; + \node[symbol_node] (b_0) [right =of s_1] {$b$}; + \node[symbol_node] (s_2) [right =of b_0] {$S$}; + \node[symbol_node] (s_3) [below =of s_2] {$S$}; + \node[symbol_node] (a_1) [left =of s_3] {$a$}; + \node[symbol_node] (b_1) [right =of s_3] {$b$}; + \node[symbol_node] (eps_1) [below =of s_1] {$\varepsilon$}; + \node[symbol_node] (eps_2) [below =of s_3] {$\varepsilon$}; + + \path[->] + (s_0) edge (a_0) + (s_0) edge (s_1) + (s_0) edge (b_0) + (s_0) edge (s_2) + (s_2) edge (a_1) + (s_2) edge (s_3) + (s_2) edge (b_1) + (s_1) edge (eps_1) + (s_3) edge (eps_2) + ; + \end{tikzpicture} + } + \end{center} + \item Ищем ячейку с координатами (S, \$), применяем продукцию из ячейки. Стек: \, @@ -384,13 +546,47 @@ \section{LL(k)-алгоритм синтаксического анализа} a & b & a & b & \textcolor{red}{\$} \\ \hline \end{tabular} + \begin{center} + \resizebox{6cm}{3.5cm}{ + \begin{tikzpicture}[shorten >=1pt,on grid,auto,node distance=1.8cm] + + \node[symbol_node] (s_0) {$S$}; + \node[symbol_node] (s_1) [below =of s_0] {$S$}; + \node[symbol_node] (a_0) [left =of s_1] {$a$}; + \node[symbol_node] (b_0) [right =of s_1] {$b$}; + \node[symbol_node] (s_2) [right =of b_0] {$S$}; + \node[symbol_node] (s_3) [below =of s_2] {$S$}; + \node[symbol_node] (a_1) [left =of s_3] {$a$}; + \node[symbol_node] (b_1) [right =of s_3] {$b$}; + \node[symbol_node] (s_4) [right =of b_1] {$S$}; + \node[symbol_node] (eps_1) [below =of s_1] {$\varepsilon$}; + \node[symbol_node] (eps_2) [below =of s_3] {$\varepsilon$}; + \node[symbol_node] (eps_3) [below =of s_4] {$\varepsilon$}; + + \path[->] + (s_0) edge (a_0) + (s_0) edge (s_1) + (s_0) edge (b_0) + (s_0) edge (s_2) + (s_2) edge (a_1) + (s_2) edge (s_3) + (s_2) edge (b_1) + (s_2) edge (s_4) + (s_1) edge (eps_1) + (s_3) edge (eps_2) + (s_4) edge (eps_3) + ; + \end{tikzpicture} + } + \end{center} + \item Оказались в конце строки и на вершине стека символ конца --- завершаем разбор. \end{enumerate} \end{example} -Можно расширить данный алгоритм так, чтобы он строил дерево вывода. Дерево будет строиться сверху вниз, от корня к листьям. Для этого необходимо расширить шаги алгоритма. +Дерево строится сверху вниз, от корня к листьям. Для этого выолняются следующие шаги алгоритма: \begin{itemize} \item В ситуации, когда мы читаем очередной терминал (на вершине стека и во входе одинаковые терминалы), мы создаём лист с соответствующим терминалом. \item В ситуации, когда мы заменяем нетерминал на стеке на правую часть продукции в соответствии с управляющей таблицей, мы создаём нетерминальный узел соответствующий применяемой продукции. diff --git a/tex/LinearAlgebra.tex b/tex/LinearAlgebra.tex index 83345d6..010667d 100644 --- a/tex/LinearAlgebra.tex +++ b/tex/LinearAlgebra.tex @@ -320,7 +320,7 @@ \section{Полукольцо} \section{Кольцо} \begin{definition}[Кольцо] - Непустое множество $R$ с двумя бинарными операциями $\oplus: R \times R \to R$ (умножение) и $\otimes: R \times R \to R$ (сложение) называется \emph{кольцом}, если выполнены следующие условия. + Непустое множество $R$ с двумя бинарными операциями $\oplus: R \times R \to R$ (сложение) и $\otimes: R \times R \to R$ (умножение) называется \emph{кольцом}, если выполнены следующие условия. \begin{enumerate} \item $(R, \oplus)$~--- это абелева группа, нейтральный элемент которой~--- $\Bbbzero$. Для любых $a, b, c \in R$: @@ -331,11 +331,11 @@ \section{Кольцо} \item для любого $a \in R$ существует $-a \in R$, такой что $a + (-a) = \Bbbzero$. \end{itemize} В последнем пункте кроется отличие от полукольца. - \item $(R, \otimes)$~--- это моноид, нейтральный элемент которого~--- $\Bbbzero$. + \item $(R, \otimes)$~--- это моноид, нейтральный элемент которого~--- 1. Для любых $a, b, c \in R$: \begin{itemize} \item $(a \otimes b) \otimes c = a \otimes (b \otimes c)$ - \item $\Bbbzero \otimes a = a \otimes \Bbbzero = a$ + \item $1 \otimes a = a \otimes 1 = a$ \end{itemize} \item $\otimes$ дистрибутивно слева и справа относительно $\oplus$: \begin{itemize} diff --git a/tex/TensorProduct.tex b/tex/TensorProduct.tex index efcd6e1..079a542 100644 --- a/tex/TensorProduct.tex +++ b/tex/TensorProduct.tex @@ -417,7 +417,7 @@ \section{Примеры} То есть находим ровно одну новую пару вершин, между которыми существует интересующий нас путь. Попробуйте спрогнозировать, сколько итераций нам ещё осталось сделать. -\textbf{Итерауия 4}. +\textbf{Итерация 4}. Продолжаем. Вычисляем тензорное произведение. \begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag}