4 Commits

3 changed files with 32 additions and 11 deletions

View File

@@ -0,0 +1,3 @@
BEGIN
x := --x++
END

BIN
lab4/report/img/result5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -18,7 +18,7 @@
\usepackage{afterpage}
\usepackage{longtable}
\usepackage{float}
\usepackage{fancyvrb}
% \usepackage[paper=A4,DIV=12]{typearea}
@@ -150,7 +150,7 @@
\addcontentsline{toc}{section}{Введение}
Лабораторная №4 заключается в доработке компилятора языка MiLan согласно варианту работы.
\textit{Вариант 8}: В компилятор необходимо добавить поддержку операций инкремента и декремента, как постфиксных, так и префиксных: \texttt{++i}, \texttt{--i}, \texttt{i++}, \texttt{i--}. С точки зрения действия на операнд i между префиксными и постфиксными операциями разницы нет. Если эти выражения являются частью более сложного выражения, то при префиксной форме сначала изменяется операнд i, и уже измененный результат используется в выражении. При постфиксной форме операторов инкремента или декремента сначала операнд i используется в выражении, а потом уже изменяется.
\textit{Вариант 8}: В компилятор необходимо добавить поддержку операций инкремента и декремента, как постфиксных, так и префиксных: \texttt{++i}, \texttt{\textminus{}\textminus{}i}, \texttt{i++}, \texttt{i\textminus{}\textminus{}}. С точки зрения действия на операнд i между префиксными и постфиксными операциями разницы нет. Если эти выражения являются частью более сложного выражения, то при префиксной форме сначала изменяется операнд i, и уже измененный результат используется в выражении. При постфиксной форме операторов инкремента или декремента сначала операнд i используется в выражении, а потом уже изменяется.
\newpage
@@ -164,7 +164,7 @@
Программа может содержать комментарии, которые могут быть многострочными. Комментарий начинается символами \texttt{/*} и заканчивается символами \texttt{*/}. Вложенные комментарии не допускаются.
В данной лабораторной рассматривается добавление поддержки операций инкремента и декремента, как постфиксных, так и префиксных: \texttt{++i}, \texttt{--i}, \texttt{i++}, \texttt{i--}. С точки зрения действия на операнд i между префиксными и постфиксными операциями разницы нет. Если эти выражения являются частью более сложного выражения, то при префиксной форме сначала изменяется операнд i, и уже измененный результат используется в выражении. При постфиксной форме операторов инкремента или декремента сначала операнд i используется в выражении, а потом уже изменяется.
В данной лабораторной рассматривается добавление поддержки операций инкремента и декремента, как постфиксных, так и префиксных: \texttt{++i}, \texttt{\textminus{}\textminus{}i}, \texttt{i++}, \texttt{i\textminus{}\textminus{}}. С точки зрения действия на операнд i между префиксными и постфиксными операциями разницы нет. Если эти выражения являются частью более сложного выражения, то при префиксной форме сначала изменяется операнд i, и уже измененный результат используется в выражении. При постфиксной форме операторов инкремента или декремента сначала операнд i используется в выражении, а потом уже изменяется.
\subsection{Лексический анализ}
В реальных трансляторах языков программирования (ЯП) первой фазой является так называемый лексический анализ входной программы — предварительная
@@ -263,7 +263,7 @@
Грамматика языка Милан, расширенная операцией инкремента и декремента, в форме Бэкуса-Наура приведена ниже:
\begin{verbatim}
\begin{Verbatim}[commandchars=\\\{\}]
<program> ::= begin <statementList> end
<statementList> ::= <statement> ; <statementList>
| epsilon
@@ -279,10 +279,10 @@
| ( <expression> )
| read
| - <factor>
| <ident> ++
| <ident> --
| ++ <ident>
| -- <ident>
\textcolor{green!60!black}{| <ident> ++}
\textcolor{green!60!black}{| <ident> --}
\textcolor{green!60!black}{| ++ <ident>}
\textcolor{green!60!black}{| -- <ident>}
<relation> ::= <expression> <cmpi> <expression>
<addop> ::= +|-
<mulop> ::= *|/
@@ -291,7 +291,7 @@
<ident> ::= <letter> {<letter> | <digit>}
<letter> ::= a|b|c | ...| z|A|B|C | ...| Z
<digit> ::= 0|1|2|3|4|5|6|7|8|9
\end{verbatim}
\end{Verbatim}
Изменения коснулись только правила \texttt{<factor>}, в котором были добавлены 4 новые продукции, описывающие операции постфиксного и префиксного инкремента и декремента.
@@ -928,13 +928,31 @@ END
\label{fig:result4}
\end{figure}
\subsection*{Программа №5}
Исходный код программы представлен в листинге~\ref{lst:program5}.
\begin{lstlisting}[caption=Исходный код программы №5, label=lst:program5]
BEGIN
x := --x++
END
\end{lstlisting}
Результат запуска компилятора для данной программы представлен на Рис.~\ref{fig:result5}.
\begin{figure}[h!]
\centering
\includegraphics[width=0.5\linewidth]{img/result5.png}
\caption{Результат запуска компилятора для программы №5.}
\label{fig:result5}
\end{figure}
\newpage
\section*{Заключение}
\addcontentsline{toc}{section}{Заключение}
В ходе выполнения лабораторной работы была успешно реализована поддержка операций инкремента и декремента в компиляторе языка MiLan. Были добавлены как префиксные (\texttt{++i}, \texttt{--i}), так и постфиксные (\texttt{i++}, \texttt{i--}) операторы с корректной семантикой их выполнения. Модификации затронули как лексический анализатор (добавление новых токенов \texttt{T\_INC} и \texttt{T\_DEC}), так и синтаксический анализатор (расширение метода \texttt{factor()} для обработки новых конструкций).
В ходе выполнения лабораторной работы была успешно реализована поддержка операций инкремента и декремента в компиляторе языка MiLan. Были добавлены как префиксные (\texttt{++i}, \texttt{\textminus{}\textminus{}i}), так и постфиксные (\texttt{i++}, \texttt{i\textminus{}\textminus{}}) операторы с корректной семантикой их выполнения. Модификации затронули как лексический анализатор (добавление новых токенов \texttt{T\_INC} и \texttt{T\_DEC}), так и синтаксический анализатор, использующий метод рекурсивного спуска (расширение метода \texttt{factor()} для обработки новых конструкций).
Расширенная грамматика языка MiLan сохранила свойство LL(1), что позволило избежать значительных изменений в существующей архитектуре компилятора. Было добавлено лишь несколько новых правил в определение нетерминала \texttt{<factor>}.
Расширенная грамматика языка MiLan осталась контекстно-свободной и сохранила свойство LL(1), что позволило избежать значительных изменений в существующей архитектуре компилятора. Было добавлено лишь несколько новых правил в определение нетерминала \texttt{<factor>}.
Из достоинств реализации можно отметить минимальность вносимых изменений в существующую архитектуру компилятора и сохранение всех ранее реализованных функций. При этом реализация выполняет поставленные задачи, корректно обрабатывая возможные случаи использования операторов инкремента и декремента.