pavlenko

advertisement
Федеральное агентство по образованию
Государственное общеобразовательное учреждение ТГТУ
Отчет по лабораторной работе №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. выделение лексем, вывод их в файла;
Download