Разработка синтаксического анализатора по автоматной грамматике языка цепочек условного оператора языка программирования FORTRAN 77

Автор работы: Пользователь скрыл имя, 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. ОСНОВНЫЕ ЛИСТИНГИ ПРОГРАММЫ………………………………………….

Файлы: 1 файл

Теория автоматов отчет.doc

— 507.00 Кб (Скачать файл)

Федеральное Государственное  Бюджетное общеобразовательное  учреждение высшего профессионального  образования «Самарский Государственный  Аэрокосмический Университет имени  академика С.П.Королёва (национальный исследовательский университет)»

 

Факультет информатики

Кафедра информационных систем и технологий

 

 

Отчет по лабораторной работе на тему:

«Разработка синтаксического анализатора по автоматной грамматике языка цепочек условного оператора языка программирования FORTRAN 77»

по курсу  «Теория формальных грамматик и языков»

 

 

 

 

 

 

Разработал: Носова А.Д.

Проверил: Чигарина Е. И.

“____”________________ 2013

 

 

 

Самара, 2013

 

Содержание

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 ПОСТАНОВКА ЗАДАЧИ

Написать программу  синтаксического анализа автоматного  языка вызова процедур языка Fortran - 77; цепочки языка имеют вид:

CALL <идентификатор><список фактических параметров>

<список фактических  параметров> :: = <параметр>[,<список фактических параметров>]

<константа любая> 

<параметр> :: = <константа  целая> 

<идентификатор> 

<идентификатор> 

<идентификатор> - идентификатор, начинается с буквы, включает последовательность букв, цифр, не допускает пробелы и специальные символы, ввести ограничение на длину (не более 8 символов) и не может быть зарезервированным словом (CALL, FORMAT, FOR, TO);

<константа целая> - целое число в диапазоне 1 +32767;

<константа любая> - целое число в диапазоне -32768 +32767, число с фиксированной точкой, число с плавающей точкой. Число  цифр порядка 2.

Семантика:

Построить таблицу идентификаторов  и констант с указанием номера параметра. Учесть перечисленные выше ограничения на идентификаторы и константы. Не допускать дублирование идентификаторов.

Сообщать об ошибках при анализе, указывая курсором место ошибки и ее содержание.

 

 

 

 

 

 

 

 

 

 

 

2 ГРАФ СОСТОЯНИЙ АНАЛИЗАТОРА


 CALL



 



 



 



 


 

 


 

 



  






 




 



 
3 ОПИСАНИЕ КОНТРОЛЬНЫХ ПРИМЕРОВ

3.1 Описание пользовательского интерфейса

При входе в  программу появляется окно (рис 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. ОСНОВНЫЕ ЛИСТИНГИ ПРОГРАММЫ

 

Логика анализатора  содержит два класса:

  • Основной класс Program, с которого начинается вход в программу
  • Класс Form1, содержащий основные методы программы и все используемые поля

 

 

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(object sender, EventArgs e)

        {

            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(object sender, EventArgs e)

        { 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)

                            {

                                case State.S:

                                    { if (c!=' ')if (c == 'c') { st1 = State.A; } else { st = State.E; exc = "Ошибка. Ожидается CALL"; pr = 0; } break; }

                                case State.A:

                                    { if (c == 'a') { st1 = State.B; } else { st = State.E; exc = "Ошибка. Ожидается CALL"; pr = 0; } break; }

                                case State.B:

                                    { if (c == 'l') {  st1 = State.C;} else { st = State.E; exc = "Ошибка. Ожидается CALL"; pr = 0; } break; }

                                case State.C:

                                    { if (c == 'l') { st1 = State.D; } else { st = State.E; exc = "Ошибка. Ожидается CALL"; pr = 0; } break; }

                                case State.D:

                                    { if (c == ' ') { st = State.A; st1 = State.S; } else { st = State.E; exc = "Ошибка. Ожидается CALL"; pr = 0; } break; }

                             }

                            break;

                        }

                   case State.A:

                        {// проверка идентификатора

                            switch (st1)

                            {

                                case State.S:

                                    {

                                        if (Char.IsLetter(c) == true) { st1 = State.A; pr = i - 1; dl = 1; znach[l] = "имя процедуры"; pos[l] = i - 1; l++; }

                                        else { if (c != ' ') { st = State.E; exc = "идентификатор должен \nначинаться с буквы"; pr = i-1; } }

                                        break;

                                    }

                                case State.A:

                                    {

                                        if (Char.IsLetterOrDigit(c) == true) dl++;

                                        else

                                        {

                                            if (c == ' ') st1 = State.B;

                                            else if (c == '(') { st = State.B; st1 = State.S; }

                                            else { st = State.E; exc = "в идентификаторе могут быть\n только буквы и цифры"; }

                                        }

                                        if (dl > 8) { st = State.E; exc = "длина идентификатора не должна\n превышать 8"; dl = 0; }

                                        break;

                                    }

                                case State.B:

                                    {

                                        if ((c != ' ' && c == '(' )|| i != s.Length - 1) { st = State.B; st1 = State.S; }

                                        else { pr = i-1; st = State.E; exc = "ожидается скобка либо\n конец строки"; }

                                        break;

                                    }

                            }

                            break;

                        }

                    case State.B:

                        {// список параметров

                            switch (st1)

                            {

                                case State.S:

                                    {// идентификатор или константа

                                        dlc = 0; dlt = 0; dle = 0; dl = 0;

                                        if (c != ' ')

                                            if (Char.IsDigit(c) == true) { st1 = State.A; pr = i - 1; st2 = State.A; dlc++; znach[l] = "константа"; pos[l] = i - 1; }

                                            else if (Char.IsLetter(c) == true) { st1 = State.B; pr = i - 1; dl++; st2 = State.S; pos[l] = i - 1; }

                                            else if (c == '+' || c == '-') { st1 = State.A; pr = i - 1; st2 = State.S; znach[l] = "константа"; pos[l] = i - 1; }

                                            else if (c == ')') { st = State.E; exc = "ожидается идентификатор или константа. \n или не должно быть ,"; pr = i - 1; }

                                            else { st = State.E; exc = "ожидается идентификтор или константа"; pr = i - 1; }

                                        break;

                                    }

                             case State.A:

                                    {// проверка константы

                                        switch (st2)

                                        {

                                            case State.S:

                                                {// обязательна цифра после + или-

                                                    dlc++;

                                                    if (Char.IsDigit(c) == true) { st2 = State.A; }

                                                    else { st = State.E; exc = "после + или - обязательно \nдолжна быть цифра"; }

                                                    break;

                                                }

                                            case State.A:

                                                {// наличие в константе сиволов e и .

                                                    dlc++;

                                                    if (Char.IsDigit(c)==false)

                                                        if (c == ' ') { st2 = State.H; tip[l] = "int"; l++; }

                                                        else if (c == ',') { st1 = State.S; tip[l] = "int"; l++; }

                                                        else if ((c == ')' && i == s.Length - 1) || i == s.Length) { st = State.F; tip[l] = "int"; l++; }

                                                        else if (c == 'e') { st2 = State.C; tip[l] = "double"; l++; }

                                                        else if (c == '.') { st2 = State.B; tip[l] = "double"; l++; }

                                                        else { st = State.E; exc = "ожидается константа"; }

                                                    if (dlc > 6) { st = State.E; exc = "слишком большая константа \n диапазон от -32768 до 32767"; }

                                                    break;

                                                }

                                            case State.B:

                                                { // после символа .

                                                    if (Char.IsDigit(c) == true) { st2 = State.D; dlt++; }

                                                    else { st = State.E; exc = "после символа . \nдолжна быть цифра"; }

Информация о работе Разработка синтаксического анализатора по автоматной грамматике языка цепочек условного оператора языка программирования FORTRAN 77