Разработка синтаксического анализатора по автоматной грамматике языка цепочек условного оператора языка программирования 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 Кб (Скачать файл)

                                                    break;

                                                }

                                            case State.C:

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

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

                                                        else if (c == '+' || c == '-') { st2 = State.I; }

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

                                                        break;

                                                    }

                                            case State.D:

                                                    {//  все еще после .

                                                        dlt++;

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

                                                            if (c == ' ') { st2 = State.G; dlt--; }

                                                            else if (c == 'e') { st2 = State.C; dlt--; }

                                                            else if (c == ',') { st1 = State.S; dlt--; }

                                                            else if ((c == ')' && i == s.Length - 1) || i == s.Length) { st = State.F; }

                                                            else { st = State.E; exc = "недопустимый символ в константе\n ожидаются цифры или знаки ./e/+/-"; }

                                                        if (dlt > 16) { st = State.E; exc = "слишком много цифр после .\n должно быть не больше 15"; }

                                                        break;

                                                    }

                                            case State.G:

                                                    { // все еще после e

                                                        dle++;

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

                                                            if (c == ' ') { st2 = State.G; dle--; }

                                                            else if (c == ',') { st1 = State.S; dle--; }

                                                            else if ((c == ')' && i == s.Length - 1)||i==s.Length) { st = State.F; }

                                                            else { st = State.E; exc = "недопустимый символ в константе\n ожидаются цифры или знаки ./e/+/-"; }

                                                        if (dle > 2) { st = State.E; exc = "слишком много цифр после e\n должно быть не больше 2"; }

                                                        break;

                                                    }

                                            case State.H:

                                                    {

                                                        if (c!=' ')

                                                            if (c == ',') { st1 = State.S; }

                                                            else if ((c == ')' && i == s.Length - 1) || i == s.Length) { st = State.F; }

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

                                                        break;

                                                    }

                                            case State.I:

                                                    {

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

                                                        else { st = State.E; exc = "ошибка в константе"; }

                                                        break;

                                                    }

                                        }

                                        break;

                                    }// конец проверки константы

                                 case State.B:

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

                                        switch (st2)

                                        {

                                            case State.S:

                                                {

                                                    dl++;

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

                                                        if (c == ' ') { st2 = State.A; }

                                                        else if (c == '(') { st1 = State.C; st2 = State.S; znach[l] = "массив"; l++; }

                                                        else if (c == ',') { st1 = State.S; st2 = State.S; znach[l] = "идентификатор"; l++; }

                                                        else if ((c == ')' && i == s.Length - 1) || i == s.Length) { st = State.F; znach[l] = "идентификатор"; l++; }

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

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

                                                    break;

                                                }

                                            case State.A:

                                                {

                                                    if (c != ' ')

                                                        if (c == '(') { st1 = State.C; st2 = State.S; znach[l] = "массив"; l++; }

                                                        else if (c == ',') { st1 = State.S; st2 = State.S; znach[l] = "идентификатор"; l++; }

                                                        else if ((c == ')' && i == s.Length - 1) || i == s.Length) { st = State.F; znach[l] = "идентификатор"; l++; }

                                                        else { st = State.E; exc = "ожидается , либо )"; pr = i - 1; }

                                                    break;

                                                }

                                        }

                                        break;

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

                               case State.C:

                                    {// проверка идентификатор или константа в скобках как счетчик

                                        switch (st2)

                                        {

                                            case State.S:

                                                {

                                                    if (c!=' ')

                                                        if (Char.IsDigit(c) == true) { st2 = State.A; pr = i - 1; znach[l] = "индекс"; tip[l] = "int"; pos[l] = i - 1; l++; }

                                                        else if (Char.IsLetter(c) == true) { st2 = State.B; pr = i - 1; znach[l] = "индекс"; pos[l] = i - 1; l++; }

                                                        else if (c == '+' || c == '-') { st2 = State.G; pr = i - 1; znach[l] = "индекс"; tip[l] = "int"; pos[l] = i - 1; l++; }

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

                                                    break;

                                                }

                                            case State.A:

                                                {

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

                                                        if (c == ' ') { st2 = State.C; }

                                                        else if (c == ')') { st2 = State.D; }

                                                        else if (c == ',') { st = State.E; exc = "ожидается закрывающая скобка"; pr = i - 1; }

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

                                                    break;

                                                }

                                            case State.B:

                                                {

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

                                                        if (c == ' ') { st2 = State.C; }

                                                        else if (c == ')') { st2 = State.D; }

                                                        else if (c == ',') { st = State.E; exc = "ожидается закрывающая скобка"; pr = i - 1; }

                                                        else { st = State.E; exc = "ожидается идентификатор, содержащий \n только буквы и цифры"; }

                                                    break;

                                                }

                                            case State.C:

                                                {

                                                    if (c!= ' ')

                                                     if (c == ')') { st2 = State.D; }

                                                    else if (c == ',') { st = State.E; exc = "ожидается закрывающая скобка"; pr = i - 1; }

                                                    break;

                                                }

                                            case State.D:

                                                {

                                                    if (c != ' ')

                                                        if (c == ',') { st1 = State.S; st2 = State.S; }

                                                        else if ((c == ')' && i == s.Length - 1) || i == s.Length) { st = State.F; }

                                                    break;

                                                }

                                            case State.G:

                                                {

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

                                                    else { st = State.E; exc = "недопустимый символ в константе\n ожидаются цифры или знаки +/-"; }

                                                    break;

                                                }

                                        }

                                        break;

                                    }// конец проверки в скобках

                            }

                            break;

                        }//конец списка параметров

                   

                    case State.E:

                        { // ошибка

                            label1.Text = exc;

                            richTextBox1.Focus();

                            richTextBox1.SelectionStart = pr;

                            return;

                        }

                 }// конец проверки строки

            }// конец цикла while

            if (st==State.E)

                        {

                            label1.Text = exc;

                            richTextBox1.Focus();

                            richTextBox1.SelectionStart = pr;

                            return;

                        }

            if (st == State.F || i == s.Length)

            {

                if (s == "") { label1.Text = "Ошибка. Строка не может быть пустой"; return; }

                else

                {

                    s1 = System.Text.RegularExpressions.Regex.Replace(s, " +", " ");

                    str1 = s.Split(new Char[] { ' ', ')', '(', ',' });

                    int m = 0;

                    for (int k = 0; k < str1.Length; k++)

                    {

                        if (str1[k] != "" && k != str1.Length)

                        {

                            str2[m] = str1[k];

                            m++;

                        }

                    }

                    for (int j = 1; j < str2.Length; j++)

                    {

                        for (int k = 1; k < str2.Length; k++)

                        {

                            if (str2[j] == str2[k])

                            {

                                if (j != k && str2[k] != null)

                                {

                                    if (Char.IsLetter(str2[j][0]) == true)

                                    {

                                        label1.Text = "это имя занято. \n попробуйте ввести другое";

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