Федеральное агентство по образованию Государственное общеобразовательное учреждение ТГТУ Отчет по лабораторной работе №1 Тема: “ РАЗРАБОТКА ЛЕКСИЧЕСКОГО АНАЛИЗАТОРА ” Выполнила: Студентка 4 курса Специальности ПОВТ-0906 Павленко Людмила Принял: Калабин А.Л. Тверь, 2012 Отчет по лабораторной работе №1 Тема: «РАЗРАБОТКА ЛЕКСИЧЕСКОГО АНАЛИЗАТОРА» Целью данной работы является написание блока сканирования, который считывает исходную программу и представляет ее в форме файла лексем. Чтение файла в строку. Для выбора исходного файла в структуре файловой системы используется элемент управления OpenFileDialog. Метод ShowDialog() отобразит диалог выбора файла на экран, а о том, какую кнопку в диалоге нажал пользователь можно узнать, сравнив значение, возвращенное методом с константами статического класса DialogResult. При значении, равном DialogResult.OK путь к выбранному файлу в файловой системе можно получить через свойство FileName экземпляра OpenFileDialog. Это значение нужно передать в метод ReadAllText класса File. Метод вернет нам содержимое исходного файла. Запись строки в файл. Необходимо использовать метод WriteAllText класса File. В качестве параметров ему передаются имя файла и исходная строка. Широко распространенной практикой является проверка на существование файла перед записью с помощью метода Exists класса File. Посимвольное чтение из файла. Класс StreamReader предоставляет методы чтения следующего символа, строки или блока в файле. Однако на каждом шаге необходимо сохранять данные о текущей строке, текущем символе и позиции символа в строке. Довольно логичным будет реализовать статический класс-обертку над StreamReader, который обеспечил бы нам не только чтение из файла,но и хранение этих данных. Список процедур: /// <summary> /// Лексический анализатор /// </summary> /// <param name="text">входная строка</param> private void Lex_Analizing(String text) /// <summary> /// Метод, разбирающий строку на слова /// </summary> /// <param name="text">входной текст</param> private void word_Analizing(String text) /// <summary> /// Метод, разбивающий строку на слова, если в ней встречается Дефис /// </summary> /// <param name="text">входная строка</param> private void parse_Defis(String text) /// <summary> /// Метод, разбирающий строку на слова, если в ней встречается запятая /// </summary> /// <param name="text">Входная строка</param private void parse_Separator(String text) /// <summary> /// Метод для открытия файла с исходным текстом для анализа /// </summary> /// <returns></returns> private String openFile() /// <summary> /// метод для сохранения результата /// </summary> /// <param name="text"></param> private void Save_fail(String[] text) Листинг программы: public partial class Lex_analiz : Form { public Lex_analiz() { InitializeComponent(); } /// <summary> /// Лексический анализатор /// </summary> /// <param name="text">входная строка</param> private void Lex_Analizing(String text) { if (text != "") { string[] Mass = text.Split('.'); for (int i = 0; i < Mass.Length; i++) { if (Mass[i] != "") { list_lexsem1.Items.Add(Mass[i]); word_Analizing(Mass[i]); list_lexsem2.Items.Add(" "); } } } } /// <summary> /// Метод, разбирающий строку на слова /// </summary> /// <param name="text">входной текст</param> private void word_Analizing(String text) { if (text != "") { string[] Mass = text.Split(' '); for (int i = 0; i < Mass.Length; i++) { if (Mass[i] != "") parse_Defis(Mass[i].Trim()); } } } /// <summary> /// Метод, разбивающий строку на слова, если в ней встречается Дефис /// </summary> /// <param name="text">входная строка</param> private void parse_Defis(String text) { if (text != "") { string[] Mass = text.Split('-'); for (int i = 0; i < Mass.Length; i++) { if (Mass[i] != "") { parse_Separator(Mass[i]); } } } } /// <summary> /// Метод, разбирающий строку на слова, если в ней встречается запятая /// </summary> /// <param name="text">Входная строка</param> private void parse_Separator(String text) { if (text != "") { string[] Mass = text.Split(','); for (int i = 0; i < Mass.Length; i++) { if (Mass[i] != "") { word_Analizing_point(Mass[i]); } } } } private void word_Analizing_point(String text) { if (text != "") { string[] Mass = text.Split(';'); for (int i = 0; i < Mass.Length; i++) { list_lexsem2.Items.Add(Mass[i].Trim()); } } } private void analizeToolStripMenuItem_Click(object sender, EventArgs e) { list_lexsem1.Items.Clear(); list_lexsem2.Items.Clear(); if (text_input.Text != "") Lex_Analizing(text_input.Text); else MessageBox.Show("Загрузите анализируемый текст!!!"); } private void openNewToolStripMenuItem_Click(object sender, EventArgs e) { text_input.Text = openFile(); } /// <summary> /// Метод для открытия файла с исходным текстом для анализа /// </summary> /// <returns></returns> private String openFile() { OpenFileDialog ofd = new OpenFileDialog(); DialogResult result = ofd.ShowDialog(); if (result == DialogResult.OK) { String path = ofd.FileName; return File.ReadAllText(path); } return ""; } /// <summary> /// метод для сохранения результата /// </summary> /// <param name="text"></param> private void Save_fail(String[] text) { SaveFileDialog fail = new SaveFileDialog(); DialogResult result = fail.ShowDialog(); if (result == DialogResult.OK) { File.WriteAllLines(fail.FileName, text); } } private void lexcemToolStripMenuItem_Click(object sender, EventArgs e) { List<String> result = new List<string>(); for (int i = 0; i < list_lexsem1.Items.Count; i++) { result.Add(list_lexsem1.Items[i].ToString()); } Save_fail(result.ToArray()); } private void wordsToolStripMenuItem_Click(object sender, EventArgs e) { List<String> result = new List<string>(); for (int i = 0; i < list_lexsem2.Items.Count; i++) { result.Add(list_lexsem2.Items[i].ToString()); } Save_fail(result.ToArray()); } } Пример работы программы: Вывод по проделанной работе: в ходе данной работы была написана программа, выполняющая следующие функции: 1. чтение и запись текстового файла с меню, панелью инструментов; 2. разбиение текста на отдельные слова и символы и вывод их в файла; 3. выделение лексем, вывод их в файла;