3468
.pdfopenFileDialog1.Filter = "txt files (*.txt)|*.txt|cs files (*.cs)|*.cs|All files (*.*)|*.*";
if (openFileDialog1.ShowDialog() == DialogResult.OK) { s = openFileDialog1.FileName;}
else
{
return;
}
try
{
//открытие потока для считывания файла
FS = File. Open(s, FileMode.Open, FileAccess.Read); StreamReader reader = new StreamReader(FS);
//всё содержимое файла записывается в переменную
str
string str = reader.ReadToEnd(); richTextBox1.Text = str;
//разбиваем текст по переходу на новую строку string[] fields = str.Split('\n');
reader.Close();
}
catch (Exception ex)
{
MessageBox.Show("Невозможно открыть файл");
}
finally
{
FS.Close();
}
}
//обработка нажатия кнопки "проанализировать" private void button2_Click(object sender, EventArgs e)
221
{
//обнуление значений номеров лексем al2count=0;
spec = false; number = 0; number_i = 0;
number_pr = 0; number_ao = 0;
number_sk = 0; number_kn = 0; number_vsfunk = 0;
int i_m = 0;
find = true;
string text = richTextBox1.Text;
//делим загруженный текст на части, разделенные символами ';', '{', '('
str = text.Split(';', '{', '(');
//и анализируем каждую полученную строку for (int i = 0; i < str.Length; i++)
{
//разбиваем строку на слова разделенные пробелом string[] leks = str[i].Split(' ');
//анализируем каждое слово for (int j = 0; j < leks.Length; j++)
{
if (find == true)
{
//ищем идентификаторы по ключевым словам //если найдено слово "void" то идентификатор -
процедура
if (leks[j] == "void")
{
222
element el = new element(); el.F = "процедура"; el.Type = leks[j];
//если это не функция, тогда получаем имя
процедуры
if (leks[j + 1] != "(") el.Name = leks[j + 1];
//и добавляем полученный элемент в массив идентификаторов
al.Add(el); break;
}
//аналогично выполняем проверку для остальных слов
строки
//и определяем их тип для занесения в таблицу идентификаторов
if (leks[j] == "ArrayList")
{
element el = new element(); el.F = "массив";
el.Type = "object";
//если это не функция, тогда получаем имя
процедуры
if (leks[j + 1] != "(") el.Name = leks[j + 1];
//и добавляем полученный элемент в массив идентификаторов
al.Add(el); break;
}
//тип - конструктор
if (leks[j] == "public")
{
223
element el = new element();
el.F = "конструктор"; el.Type = leks[j];
if (leks[j + 1] != "(") el.Name = leks[j + 1];
al.Add(el); break;
}
//константа
if (leks[j] == "const")
{
element el = new element(); el.F = "константа"; el.Type = leks[j + 1];
if (leks[j + 2] != "[") el.Name = leks[j + 2];
// richTextBox2.Text += el.ToString(); al.Add(el);
break;
}
//переменная, массив или функция for (int k = 0; k < keyword.Length; k++)
{
if (leks[j] == keyword[k])
{
element el = new element();
if (leks[j + 1] != "[]" && leks[j + 1] != "(")
{
el.F = "переменная"; el.Name = leks[j + 1];
mas[i_m] = el;
224
i_m++;
}
if (leks[j + 1] == "[]")
{
el.F = "массив"; el.Name = leks[j + 2];
mas[i_m] = el; i_m++;
}
el.Type = leks[j];
if (j + 2 < leks.Length)
{
if (leks[j + 2] == "(") el.F = "функция";
mas[i_m] = el; i_m++;
find = false;
}
al.Add(el); break;
}
}
}
}
find = true;
}
//проверяем полученный массив на наличие повторных записей одной и той же переменной
for (int k = 0; k < al.Count; k++)
225
{
for (int k2 = k + 1; k2 < al.Count; k2++)
{
//если имя и тип двух элементов массива
совпадают
if (((element)al[k]).Name == ((element)al[k2]).Name && ((element)al[k]).Type == ((element)al[k2]).Type)
{
//удаляем второй элемент из массива al.Remove(al[k2]);
}
}
}
text = richTextBox1.Text;
//делим текст на части, разделенные символом ; str = text.Split(';');
for (int i = 0; i < str.Length; i++)
{
//делим полученные строки на слова string[] leks = str[i].Split(' ','\n');
//проверяем каждое слово и заносим в таблицу лексем for (int j = 0; j < leks.Length; j++)
{
spec = false;
//слово является ключевым //проверка происходит при поэлементном сравнении с массивом ключевых слов
for (int k = 0; k < keyword_all.Length; k++)
{
if (leks[j] == keyword_all[k])
{
//если текущее слово совпало с ключевым
226
fl = false; spec = true;
//создаем новую лексему leksem lk = new leksem(); //записываем её
lk.Leks = leks[j]; //тип
lk.Type = "ключевое слово"; //и её значение
//проверив при этом, было ли уже это значение использовано //если да, то значение оставляем неизменным
for (int k2 = 0; k2 < al2count; k2++)
{
if (lk.Leks == al2[k2].Leks && lk.Type == al2[k2].Type)
{
lk.Zn = al2[k2].Zn; fl = true;
break;
}
}
//если такой лексемы ещё не было, //то присваиваем ей новое значение if (fl == false)
{
lk.Zn = "X" + (number + 1).ToString(); number++;
al2[al2count] = lk; al2count++;
}
//заносим лексему в таблицу на форме dataGridView1.Rows.Add(lk.Leks, lk.Type, lk.Zn); break;
}
227
}
//аналогичная проверка выполняется для каждого массива //с ключевыми словами, операциями, методами //также записывается лексема, её тип и значение
//вместе с проверкой на то было ли оно уже использовано или нет
for (int k = 0; k < keyword.Length; k++)
{
if (leks[j] == keyword[k])
{
fl = false; spec = true;
leksem lk = new leksem(); lk.Leks = leks[j];
lk.Type = "ключевое слово";
for (int k2 = 0; k2 < al2count; k2++)
{
if (lk.Leks == al2[k2].Leks && lk.Type == al2[k2].Type)
{
lk.Zn = al2[k2].Zn; fl = true;
break;
}
}
if (fl == false)
{
lk.Zn = "X" + (number + 1).ToString(); number++;
al2[al2count] = lk; al2count++;
}
dataGridView1.Rows.Add(lk.Leks, lk.Type, lk.Zn);
228
break;
}
}
for (int k = 0; k < al.Count; k++)
{
if (al[k] != null)
{
if (leks[j] == ((element)al[k]).Name)
{
fl = false; spec = true;
leksem lk = new leksem(); lk.Leks = ((element)al[k]).Name; lk.Type = "иднтификатор";
for (int k2 = 0; k2 < al2count; k2++)
{
if (lk.Leks == al2[k2].Leks && lk.Type ==
al2[k2].Type)
{
lk.Zn = al2[k2].Zn; fl = true;
break;
}
}
if (fl == false)
{
lk.Zn = lk.Leks + ":" + (number_i +
1).ToString();
number_i++; al2[al2count] = lk; al2count++;
}
229
dataGridView1.Rows.Add(lk.Leks, lk.Type, lk.Zn); break;
}
}
}
for (int k = 0; k < arifm_op.Length; k++)
{
if (leks[j] == arifm_op[k])
{
fl = false; spec = true;
leksem lk = new leksem(); lk.Leks = leks[j];
lk.Type = "знак
арифметической перации";
for (int k2 = 0; k2 < al2count; k2++)
{
if (lk.Leks == al2[k2].Leks && lk.Type == al2[k2].Type)
{
lk.Zn = al2[k2].Zn; fl = true;
break;
}
}
if (fl == false)
{
lk.Zn = "A" + (number_ao + 1).ToString(); number_ao++; al2[al2count] = lk; al2count++;
}
230