Compare commits
4 Commits
c001ccb12a
...
lab3
| Author | SHA1 | Date | |
|---|---|---|---|
| 6a95dc6c9d | |||
| 78dddbc047 | |||
| e0211cb6c5 | |||
| d61b1b7a2d |
3
lab4/cmilan/test/incdec/invalid2.mil
Normal file
3
lab4/cmilan/test/incdec/invalid2.mil
Normal file
@@ -0,0 +1,3 @@
|
||||
BEGIN
|
||||
x := --x++
|
||||
END
|
||||
BIN
lab4/report/img/result5.png
Normal file
BIN
lab4/report/img/result5.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
@@ -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>}.
|
||||
|
||||
Из достоинств реализации можно отметить минимальность вносимых изменений в существующую архитектуру компилятора и сохранение всех ранее реализованных функций. При этом реализация выполняет поставленные задачи, корректно обрабатывая возможные случаи использования операторов инкремента и декремента.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user