private void OpenGrammar(string filename)
        {
            LastLibrarySettings = null;

            if (!File.Exists(filename))
            {
                MessageBox.Show("Указанный файл не найден", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);

                Grammar_RecentGrammars.Items.Remove(filename);
                Grammar_RecentGrammars.SelectedIndex = -1;
                Grammar_RecentPreprocs.SelectedIndex = -1;

                OpenedGrammarFilename        = null;
                Grammar_Editor.Text          = String.Empty;
                Grammar_SaveButton.IsEnabled = true;

                return;
            }

            OpenedGrammarFilename = filename;

            using (var stream = new StreamReader(filename, GetEncoding(filename)))
            {
                Grammar_Editor.Text     = stream.ReadToEnd();
                Grammar_Editor.Encoding = stream.CurrentEncoding;
            }

            Grammar_SaveButton.IsEnabled = false;
            RecentItems_SetAsCurrentElement(Grammar_RecentGrammars, filename, RecentItems_SelectionChanged);
        }
        private void Grammar_GetLibraryButton_Click(object sender, RoutedEventArgs e)
        {
            var librarySettings = new LibrarySettingsWindow();

            librarySettings.Input_Namespace.Text = !String.IsNullOrEmpty(OpenedGrammarFilename)
                                ? Path.GetFileNameWithoutExtension(OpenedGrammarFilename)
                                : null;
            librarySettings.Input_OutputDirectory.Text = DOCUMENTS_DLL_DIRECTORY;

            if (librarySettings.ShowDialog() == true)
            {
                /// Для генерации подписанной библиотеки понадобятся права администратора
                if (librarySettings.Input_IsSignedAssembly.IsChecked == true)
                {
                    var pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
                    if (!pricipal.IsInRole(WindowsBuiltInRole.Administrator))
                    {
                        Grammar_StatusBar.Background   = LightRed;
                        Grammar_StatusBarLabel.Content =
                            "Для генерации строго именованной сборки необходимы права администратора";
                        return;
                    }
                }

                var messages = new List <Message>();
                var success  = BuilderBase.GenerateLibrary(
                    ParsingLL.IsChecked ?? false ? GrammarType.LL : GrammarType.LR,
                    Grammar_Editor.Text,
                    librarySettings.Input_Namespace.Text,
                    librarySettings.Input_OutputDirectory.Text,
                    librarySettings.Input_IsSignedAssembly.IsChecked == true
                                                ? String.IsNullOrWhiteSpace(librarySettings.Input_KeysFile.Text)
                                                        ? Path.Combine(librarySettings.Input_OutputDirectory.Text, $"{librarySettings.Input_Namespace.Text}.snk")
                                                        : librarySettings.Input_KeysFile.Text
                                                : null,
                    messages
                    );

                Grammar_LogList.Text           = String.Join(Environment.NewLine, messages.Where(m => m.Type == MessageType.Trace).Select(m => m.Text));
                Grammar_ErrorsList.ItemsSource = messages.Where(m => m.Type == MessageType.Error || m.Type == MessageType.Warning);

                if (!success)
                {
                    Grammar_StatusBarLabel.Content = "Не удалось сгенерировать библиотеку";
                    Grammar_StatusBar.Background   = LightRed;
                }
                else
                {
                    Grammar_StatusBarLabel.Content = "Библиотека успешно сгенерирована";
                    Grammar_StatusBar.Background   = Brushes.LightGreen;
                }
            }
        }