Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add tree construction in LL(1) and some fixed typos #44

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
210 changes: 203 additions & 7 deletions tex/GLL-based_CFPQ.tex
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand Down Expand Up @@ -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$:

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

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

\begin{enumerate}
\item Начало работы.
Expand Down Expand Up @@ -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$ со стека и двигаем указатель.

Стек: \,
Expand All @@ -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), применяем продукцию из ячейки.

Стек: \,
Expand All @@ -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$ со стека и двигаем указатель.

Стек: \,
Expand All @@ -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), применяем продукцию из ячейки.

Стек: \,
Expand All @@ -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$ со стека и двигаем указатель.

Стек: \,
Expand All @@ -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), применяем продукцию из ячейки.

Стек: \,
Expand All @@ -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$ со стека и двигаем указатель.

Стек: \,
Expand All @@ -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, \$), применяем продукцию из ячейки.

Стек: \,
Expand All @@ -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 В ситуации, когда мы заменяем нетерминал на стеке на правую часть продукции в соответствии с управляющей таблицей, мы создаём нетерминальный узел соответствующий применяемой продукции.
Expand Down
6 changes: 3 additions & 3 deletions tex/LinearAlgebra.tex
Original file line number Diff line number Diff line change
Expand Up @@ -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$:
Expand All @@ -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}
Expand Down
2 changes: 1 addition & 1 deletion tex/TensorProduct.tex
Original file line number Diff line number Diff line change
Expand Up @@ -417,7 +417,7 @@ \section{Примеры}
То есть находим ровно одну новую пару вершин, между которыми существует интересующий нас путь.
Попробуйте спрогнозировать, сколько итераций нам ещё осталось сделать.

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

\begin{scaledalign}{\footnotesize}{2pt}{0.9}{\notag}
Expand Down