Автор работы: Пользователь скрыл имя, 17 Декабря 2013 в 23:25, лабораторная работа
Задание:
Написать программу синтаксического анализа автоматного языка вызова процедур языка Fortran - 77; цепочки языка имеют вид:
CALL <идентификатор><список фактических параметров>
<список фактических параметров> :: = <параметр>[,<список фактических параметров>]
<константа любая>
<параметр> :: = <константа целая>
<идентификатор>
<идентификатор>
<идентификатор> - идентификатор, начинается с буквы, включает последовательность букв, цифр, не допускает пробелы и специальные символы, ввести ограничение на длину (не более 8 символов) и не может быть зарезервированным словом (CALL, FORMAT, FOR, TO);
<константа целая> - целое число в диапазоне 1 +32767;
<константа любая> - целое число в диапазоне -32768 +32767, число с фиксированной точкой, число с плавающей точкой. Число цифр порядка 2.
1 ПОСТАНОВКА ЗАДАЧИ 3
2 ГРАФ СОСТОЯНИЙ АНАЛИЗАТОРА 4
3 ОПИСАНИЕ ПРОГРАММЫ 6
3.1 Описание пользовательского интерфейса 6
3.2 Примеры правильных и неправильных цепочек 7
4. ОСНОВНЫЕ ЛИСТИНГИ ПРОГРАММЫ………………………………………….
Федеральное Государственное
Бюджетное общеобразовательное
учреждение высшего профессионального
образования «Самарский Государственный
Аэрокосмический Университет
Факультет информатики
Кафедра информационных систем и технологий
Отчет по лабораторной работе на тему:
«Разработка синтаксического анализатора по автоматной грамматике языка цепочек условного оператора языка программирования FORTRAN 77»
по курсу «Теория формальных грамматик и языков»
Разработал: Носова А.Д.
Проверил: Чигарина Е. И.
“____”________________ 2013
Самара, 2013
Содержание
Написать программу
синтаксического анализа
CALL <идентификатор><список фактических параметров>
<список фактических параметров> :: = <параметр>[,<список фактических параметров>]
<константа любая>
<параметр> :: = <константа целая>
<идентификатор>
<идентификатор>
<идентификатор> - идентификатор, начинается с буквы, включает последовательность букв, цифр, не допускает пробелы и специальные символы, ввести ограничение на длину (не более 8 символов) и не может быть зарезервированным словом (CALL, FORMAT, FOR, TO);
<константа целая> - целое число в диапазоне 1 +32767;
<константа любая> - целое число в диапазоне -32768 +32767, число с фиксированной точкой, число с плавающей точкой. Число цифр порядка 2.
Семантика:
Построить таблицу идентификаторов и констант с указанием номера параметра. Учесть перечисленные выше ограничения на идентификаторы и константы. Не допускать дублирование идентификаторов.
Сообщать об ошибках при анализе, указывая курсором место ошибки и ее содержание.
CALL
При входе в программу появляется окно (рис 3.1.1). Пункт меню «Ввод» служит для ввода строки, пункт меню «Семантика» служит для вывода семантики, пункт меню «Выход» служит для выхода из программы. Поле «Ошибки» уведомляют пользователя об ошибках, если таковые имеются. Поля «Константы» и «Идентификаторы» служат для составления соответствующих таблиц.
(рис 3.1.1)
После выбора пункта меню «Ввод» пользователю будет предложено ввести строку. После введения строки необходимо нажать кнопку «Проверка». При успешном анализе в поле «ошибки» будет выведено сообщение о том, что строка принадлежит языку. В противном случае, будет выведена ошибка и выделено соответствующее место в строке
После выбора пункта меню «Семантика», если строка принадлежит языку, поля «Константы» и «Идентификаторы» заполнятся таблицами, если строка не принадлежит языку, то в поле «Ошибки» появится соответствующее сообщение.
3.2 Примеры правильных и
При успешном анализе в поле «Ошибки» появляется сообщение о том, что строка принадлежит языку и станет возможно вывести семантику в виде таблиц констант и идентификаторов, выбрав соответствующий пункт меню (рис 3.2.1 и рис 3.2.2).
(рис 3.2.1)
(рис 3.2.2)
Если в строке содержатся ошибки, то в поле «Ошибки» появляется соответствующее сообщение, и семантика не может быть выведена.
Примеры различных ошибок:
(рис 3.2.3)
(рис 3.2.4.)
(рис 3.2.5)
(рис 3.2.6)
(рис 3.2.7)
4. ОСНОВНЫЕ ЛИСТИНГИ ПРОГРАММЫ
Логика анализатора содержит два класса:
namespace Автоматы
{
public partial class Form1 : Form
{
string s, s1;//, s2;
int i;
int pr; //начало слова в котором ошибка
int dl;// длина идентификатора
int dlc=0;//длина константы
int dlt = 0;// кол-во символов после точки
int dle = 0; // кол-во символов после e
char c; int l = 1; int j = 0; string []str2; string[] znach; string[] tip; int[] pos; string exc = ""; bool b = false;
enum State { S, A, B, C, D, G, H, I, E, F };
public Form1()
{
InitializeComponent();
label1.Text = "";
button1.Enabled = false;
richTextBox1.Enabled = false;
label2.Text = ""; label3.Text = ""; label4.Text = ""; label5.Text = ""; label6.Text = ""; label7.Text = ""; label8.Text = ""; label9.Text = ""; label10.Text = "";
}
private void вводToolStripMenuItem_Click(ob
{
richTextBox1.Enabled = true;
richTextBox1.Focus();
label1.Text = "пожалуйста, введите строку";
button1.Visible = true;
button1.Enabled = true;
dlc = 0; dle = 0; dl = 0; dlt = 0; exc = "";
label2.Text = ""; label3.Text = ""; label4.Text = ""; label5.Text = ""; label6.Text = ""; label7.Text = ""; label8.Text = "";
label9.Text = "";
label10.Text = "";
this.Width = 333;
richTextBox1.Text = "";
b = false;
}
private void выходToolStripMenuItem_Click(o
{ Application.Exit(); }
private void button1_Click(object sender, EventArgs e)
{
dlc = 0; dle = 0; dl = 0; dlt = 0; exc = ""; l = 1; b = false;
s = richTextBox1.Text.ToLower();
string[] str1 = s.Split(new Char[] { ' ', ')', '(', ',' });
str2 = new string[str1.Length];
znach = new string[str1.Length];
tip = new string[str1.Length];
pos = new int[str1.Length];
State st = State.S;
State st1=State.S;
State st2=State.S;
i = 0;
while ((st!=State.F)&&(i<s.Length))
{
c = s[i];
i++;
switch (st)// начало проверки строки
{
case State.S:
{// CALL?
switch (st1)
{
{ if (c!=' ')if (c == 'c') { st1 = State.A; } else { st = State.E; exc = "Ошибка. Ожидается CALL"; pr = 0; } break; }
{ if (c == ' ') { st = State.A; st1 = State.S; } else { st = State.E; exc = "Ошибка. Ожидается CALL"; pr = 0; } break; }
}
break;
}
case State.A:
{// проверка идентификатора
switch (st1)
{
}
}
break;
}
case State.B:
{// список параметров
switch (st1)
{
case State.A:
{
}