
- •Лабораторные работы
- •1. Порядок выполнения работы.
- •2. Содержание отчета.
- •Лабораторная работа № 1. Лабораторная работа № 1.1. Создание каркаса транслятора.
- •Лабораторная работа № 2 Лабораторная работа № 1.2. Разбор исходного файла.
- •Лабораторная работа № 3.
- •1. Порядок выполнения работы.
- •2. Содержание отчета.
- •Лабораторная работа № 5. Лабораторная работа №3.1. Синтаксический анализатор.
- •Лабораторная работа № 6. Лабораторная работа №3.2. Синтаксический анализатор.
- •Лабораторная работа № 7. Лабораторная работа №3.3. Синтаксический анализатор.
- •1. Порядок выполнения работы.
- •2. Содержание отчета.
- •Лабораторная работа №5. Разработка генератора кода
- •1. Порядок выполнения работы.
- •2. Теоретическая часть
- •Практическая часть.
- •Лабораторная работа № 9. Генератор кода 5.2.
- •4. Содержание отчета
- •5. Содержание отчета
- •Лабораторная работа № 11. Синтаксический анализатор.
- •Лабораторная работа №12. Генератор кода 5.3.
- •Варианты к лабораторным работам
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •Вариант 13
- •Вариант 14
- •Вариант 15
- •Вариант 16
- •Курсовой проект
- •Оформление
- •Пустые строки
- •Пробелы в строке
- •Локальные переменные
- •Комментарии
- •Инструкции (statements)
- •Оформление if, if-else, if-else if-else
- •Оформление for, foreach
- •Оформление while, do-while
- •Оформление switch
- •Оформление try-catch
- •Указания по оформлению псевдокода
Лабораторная работа № 2 Лабораторная работа № 1.2. Разбор исходного файла.
Методы статического класса System.IO.File для работы с файлами. Чтение, запись текстового файла. Класс System.IO.StreamReader для реализации потокового чтения из файла.
Классы C#, обеспечивающие работу с файловой системой, расположены в пространстве имен System.IO . Поэтому для доступа к этим классам в коде без указания пространства имен необходимо использовать директиву подключения namespace:
using System.IO;
Статический класс File предоставляет основные функции для работы с файлами, в том числе нужные нам чтение файла в строку и запись строки в файл.
Чтение файла в строку. Для выбора исходного файла в структуре файловой системы используется элемент управления OpenFileDialog. Метод ShowDialog() отобразит диалог выбора файла на экран, а о том, какую кнопку в диалоге нажал пользователь можно узнать, сравнив значение, возвращенное методом с константами статического класса DialogResult. При значении, равном DialogResult.OK путь к выбранному файлу в файловой системе можно получить через свойство FileName экземпляра OpenFileDialog. Это значение нужно передать в метод ReadAllText класса File. Метод вернет нам содержимое исходного файла.
Запись строки в файл. Необходимо использовать метод WriteAllText класса File. В качестве параметров ему передаются имя файла и исходная строка. Широко распространенной практикой является проверка на существование файла перед записью с помощью метода Exists класса File.
Посимвольное чтение из файла. Класс StreamReader предоставляет методы чтения следующего символа, строки или блока в файле. Однако на каждом шаге необходимо сохранять данные о текущей строке, текущем символе и позиции символа в строке. Довольно логичным будет реализовать статический класс-обертку над StreamReader, который обеспечил бы нам не только чтение из файла,но и хранение этих данных. Реализуем этот функционал в классе Reader, созданном в ходе первой лабораторной работы (файл Reader.cs) Ниже приведен псевдокод данного класса.
Reader
{
номерСтроки;
позицияСимволаВСтроке;
текущийСимвол;
StreamReader streamReader;
читатьСледующийСимвол()
{
текущийСимвол = streamReader.Read();
если( текущийСимвол == -1 )
текущийСимвол = конецФайла;
иначе если( текущийСимвол == переводСтроки )
{
номерСтроки++;
позицияСимволаВСтроке = 0;
}
иначе если( текущийСимвол == возвратКаретки или текущийСивол == табуляция )
читатьследующийСивол();
иначе
позицияСимволаВСтроке++;
}
инициализировать( путьКФайлу )
{
если файлСуществует( путьКФайлу )
{
streamReader = новый StreamReader( путьКФайлу );
номерСтроки = 1;
позицияСимволаВСтроке = 0;
читатьСледующийСимвол();
}
}
закрыть()
{
streamReader.close();
}
}
Протестировать работу класса Reader в коде формы можно, например, так:
Reader. инициализировать( путьКФайлу );
Пока ( Reader.текущийСимвол != конецФайла )
{
вывести Reader.номерСтроки;
вывести Reader. позицияСимволаВСтроке;
вывести Reader. текущийСимвол;
Reader. читатьСледующийСимвол();
}
Замечания по коду:
Все поля и методы должны быть объявлены как static;
В соответствии с принципами ООП все поля должны быть закрытыми (это замечание касается всех лабораторных работ). Для чтения полей необходимо реализовать методы-свойства. Ни одно из полей НЕ должно записываться вне класса.
Необходимо предусмотреть проблемные ситуации: указан некорректный путь к файлу, многократная инициализация класса (в этом случае необходимо закрывать streamReader перед его пересозданием).
Примеры кода:
Чтение файла в строку.
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
codeFile = openFileDialog1.FileName.ToString();
string code = System.IO.File.ReadAllText(codeFile);
}
Запись строки в файл.
if(File.Exists(codeFile))
{
File.WriteAllText(codeFile, code);
}
Посимвольное чтение из файла.
Файл Reader.cs в проекте.