Правки и программа в одном файле

This commit is contained in:
2025-05-20 19:32:48 +03:00
parent a60d2a9db7
commit 5bd140cd39
4 changed files with 737 additions and 28 deletions

View File

@@ -153,6 +153,104 @@
Простое прошедшее время в немецком языке называется \textit{Претерит} или \textit{Претеритум} (нем. \textit{Präteritum} или нем. \textit{Imperfekt}). Это время не требует образования сложных конструкций, что позволяет относить его к простым формам.
\newpage
\section{Грамматика немецкого претеритума}
\subsection{Общая характеристика претеритума}
Претеритум (Präteritum, Imperfekt) является одной из двух основных форм прошедшего времени в немецком языке, наряду с перфектом (Perfekt). В отличие от перфекта, претеритум представляет собой простую (синтетическую) форму, образуемую без вспомогательных глаголов, путём изменения основной формы глагола.
Претеритум используется преимущественно в письменной речи, особенно в художественной литературе, исторических текстах и формальных документах. В разговорной речи он встречается редко, за исключением глаголов \textit{sein} (быть), \textit{haben} (иметь), модальных глаголов, а также в некоторых диалектах северной Германии.
\subsection{Структура предложений в претеритуме}
Структура предложений в претеритуме соответствует общим правилам построения немецких предложений. Основные типы структур:
\begin{enumerate}
\item \textbf{Прямой порядок слов} (главное предложение):
\begin{center}
\textit{Подлежащее} + \textit{глагол в претеритуме} + \textit{дополнения и обстоятельства}
\end{center}
Например: \textit{Der Mann las ein Buch.} (Мужчина читал книгу.)
\item \textbf{Обратный порядок слов} (инверсия):
\begin{center}
\textit{Обстоятельство} + \textit{глагол в претеритуме} + \textit{подлежащее} + \textit{другие члены предложения}
\end{center}
Например: \textit{Gestern las der Mann ein Buch.} (Вчера мужчина читал книгу.)
\item \textbf{Придаточное предложение}:
\begin{center}
\textit{..., союз} + \textit{подлежащее} + \textit{второстепенные члены} + \textit{глагол в претеритуме}
\end{center}
Например: \textit{Ich wusste, dass der Mann ein Buch las.} (Я знал, что мужчина читал книгу.)
\end{enumerate}
\subsection{Образование форм претеритума}
\subsubsection{Слабые (правильные) глаголы}
Образуются по формуле: основа глагола + суффикс \textit{-te} + личное окончание:
\begin{center}
\begin{tabular}{|l|l|}
\hline
\textbf{Лицо} & \textbf{Окончание (machen - делать)} \\
\hline
ich & mach\textbf{te} \\
du & mach\textbf{test} \\
er/sie/es & mach\textbf{te} \\
wir & mach\textbf{ten} \\
ihr & mach\textbf{tet} \\
sie/Sie & mach\textbf{ten} \\
\hline
\end{tabular}
\end{center}
\subsubsection{Сильные (неправильные) глаголы}
Образуются путём изменения корневой гласной без добавления суффикса \textit{-te}:
\begin{center}
\begin{tabular}{|l|l|}
\hline
\textbf{Лицо} & \textbf{Окончание (lesen - читать)} \\
\hline
ich & \textbf{las} \\
du & \textbf{las}st \\
er/sie/es & \textbf{las} \\
wir & \textbf{las}en \\
ihr & \textbf{las}t \\
sie/Sie & \textbf{las}en \\
\hline
\end{tabular}
\end{center}
\subsubsection{Смешанные глаголы}
Сочетают особенности сильных и слабых глаголов: меняют корневую гласную и получают суффикс \textit{-te}.
Например: \textit{bringen} (приносить) \textit{brachte}, \textit{kennen} (знать) \textit{kannte}.
\subsection{Отрицание в претеритуме}
Отрицание в предложениях с претеритом образуется с помощью отрицательной частицы \textit{nicht}, которая обычно ставится после глагола и перед дополнениями:
\textit{Der Mann las nicht ein Buch.} (Мужчина не читал книгу.)
При отрицании всего предложения \textit{nicht} ставится в конце:
\textit{Der Mann las ein Buch nicht.} (Мужчина не читал книгу [а что-то другое].)
Размещение \textit{nicht} в конце предложения также часто используется в разговорной речи и может указывать на отрицание всего действия или ситуации в целом:
\textit{Er kam gestern nicht.} (Он вчера не приходил.)
\textit{Das Kind spielte draußen nicht.} (Ребенок не играл на улице.)
\subsection{Особенности использования претеритума}
В немецком языке выбор между претеритумом и перфектом часто определяется:
\begin{itemize}
\item \textbf{Стилем повествования:} претеритум более характерен для литературного стиля
\item \textbf{Типом текста:} в биографиях, исторических текстах, сказках преимущественно используется претеритум
\item \textbf{Региональными особенностями:} в Северной Германии претеритум используется чаще
\item \textbf{Типом глагола:} для глаголов \textit{sein}, \textit{haben} и модальных глаголов претеритум используется даже в разговорной речи
\end{itemize}
В рамках данной работы мы рассматриваем формализованную грамматику, учитывающую основные структурные особенности предложений в претеритуме, без полного описания всех лексических и морфологических особенностей немецкого языка.
\newpage
\section {Математическое описание}
@@ -167,10 +265,10 @@
\item Рассматриваются три вида обстоятельств: обстоятельства времени, места и образа действия. В реальных предложениях языка могут встречаться и другие виды, но перечисленные являются наиболее часто встречающимися.
\end{itemize}
\subsection{Грамматика в виде списка продукций}
\subsection{Пораждающая грамматика Хомского}
\label{subsec:grammar}
Формально можно описать грамматику в виде списка продукций:
Формально пораждающую грамматику Хомского можно задать списком продукций:
\begin{verbatim}
Предложение -> Повествовательное "."
@@ -415,7 +513,7 @@ class Grammar:
Метод принимает ссылку на объект класса Grammar и строку text типа str, содержащую текстовое представление грамматики.
Метод не возвращает значений, но заполняет словарь productions и устанавливает переменную start\_symbol в объекте класса.
Метод не возвращает значений явно, но заполняет словарь productions и устанавливает переменную start\_symbol в объекте класса.
\begin{lstlisting}[caption={Код метода \texttt{\_parse\_productions}.}, label={lst:parse_productions}]
def _parse_productions(self, text: str):
@@ -450,7 +548,7 @@ def _parse_productions(self, text: str):
Метод принимает ссылку на объект класса Grammar.
Метод не возвращает значений, но заполняет словарь first\_sets в объекте класса.
Метод не возвращает значений явно, но заполняет словарь first\_sets в объекте класса.
\begin{lstlisting}[caption={Код метода \texttt{\_calculate\_first\_sets}.}, label={lst:calculate_first_sets}]
def _calculate_first_sets(self):
@@ -503,7 +601,7 @@ def _calculate_first_sets(self):
Метод принимает ссылку на объект класса Grammar.
Метод не возвращает значений, но заполняет словарь follow\_sets в объекте класса.
Метод не возвращает значений явно, но заполняет словарь follow\_sets в объекте класса.
\begin{lstlisting}[caption={Код метода \texttt{\_calculate\_follow\_sets}.}, label={lst:calculate_follow_sets}]
def _calculate_follow_sets(self):
@@ -602,7 +700,7 @@ def _first_of_sequence(self, sequence):
Метод принимает ссылку на объект класса Grammar.
Метод не возвращает значений, но заполняет словарь lookup\_table в объекте класса или вызывает исключение, если грамматика не является LL(1).
Метод не возвращает значений явно, но заполняет словарь lookup\_table в объекте класса или вызывает исключение, если грамматика не является LL(1).
\begin{lstlisting}[caption={Код метода \texttt{\_fill\_lookup\_table}.}, label={lst:fill_lookup_table}]
def _fill_lookup_table(self):
@@ -976,7 +1074,7 @@ def main():
\addcontentsline{toc}{section}{Заключение}
В ходе выполнения лабораторной работы была построена контекстно-свободная грамматика для подмножества немецкого языка, описывающая простое прошедшее время Претерит. На основе разработанной грамматики была реализована программа, которая проверяет принадлежность входной строки заданному языку и генерирует случайные корректные предложения. Для анализа предложений использовался алгоритм LL(1)-разбора, основанный на построении множеств FIRST и FOLLOW для всех нетерминалов грамматики и создании таблицы синтаксического анализа.
Из достоинств выполнения лабораторной работы можно выделить возможность задания грамматики в отдельном текстовом файле, что позволяет легко изменять и расширять её без модификации программного кода. Использование объектно-ориентированного подхода в реализации обеспечило хорошую структуру кода. Вся логика работы с грамматикой реализована в классе Grammar, а обработка пользовательского ввода вынесена в функцию main.
Из достоинств выполнения лабораторной работы можно выделить возможность задания грамматики в отдельном текстовом файле, что позволяет легко изменять и расширять её без модификации программного кода. Также программа автоматически проверяет, что введенная грамматика является LL(1)-грамматикой. В противном случае, программа выводит сообщение об ошибке, в указывается на конкретные правила грамматики, между выбором которых возникает неоднозначность.
К недостаткам текущей реализации можно отнести ограниченность словарного запаса, что сужает разнообразие генерируемых предложений. Также алгоритм генерации не контролирует длину предложений, что может приводить к избыточно длинным или коротким конструкциям. В текущей версии система не учитывает некоторые грамматические особенности немецкого языка, например, склонение прилагательных и согласование артиклей с родом существительных.