Построение формального языка L

Сдавался/использовался1. НГТУ, 1997
Загрузить архив:
Файл: 240-1675.zip (20kb [zip], Скачиваний: 23) скачать

Построение формального языка L

WHILE( ) [,

, ...])>];

WHILE -входной терминальный символ

- условное выражение

- некоторая функция, которая может отсутствовать

- параметры функции, которые тоже могут отсутствовать

Пример правильного синтаксиса:

WHILE(A>44

A>44

clrscr() - функция, без параметров

Подбор грамматикиG[Z]по языкуL

          Любая грамматика, к примеру G[Z],содержит следующие базисные элементы Vt, Vn, Z, P,где:

Vt - словарь терминальных символов

Vn - словарь нетерминальных символов

Z- начальный нетерминальный символ

P - множество правил вывода

G[<оператор>]:

1. <Оператор>àwhile( ) [<Функция>];

2. àT| < T| > T|<= T | >= T | != T

3. àO | T*O | T**O | T+O | T-O | T/O

4. à() | | <ЦБЗ>

5. àБ{Б|Ц}

6. <ЦБЗ> àЦ{Ц}

7. <Функция>à ([

{,

}])

8.

à | <ЦБЗ>| Ω

Классификация G[Z]

G[<оператор>]:

1. <Оператор>àwhile( ) [<Функция>];

2. àT| < T| > T|<= T | >= T | != T

3. àO | T*O | T**O | T+O | T-O | T/O

4. à() | | <ЦБЗ>

5. àБ{Б|Ц}

6. <ЦБЗ> àЦ{Ц}

7. <Функция>à ([

{,

}])

8.

à | <ЦБЗ>| Ω

Сделаем заменунетерминальных символов:

<Оператор> àZ

           àA

               à B

              àC

<Функция > à D

      à E

<ЦБЗ>           àF

           à G

Сделаем заменутерминальных символов:

WHILE àa

(          àb

)          àc

;           àd

Ц          à   f

Б            àg

,àh

G[Z]:

1. ZàabAc[D]d

2. Aà B|A B|A <= B |A >= B |A != B

3. B àC | B*C | B**C | B+C | B-C | B/C

4. C àbAc | E | F 

5. E à g{g|f}

6. F à f{f}

7. D à Eb[G{hG}]c

8. G à E | F | Ω

Вывод : G[Z] - контекстно-свободная грамматика.

Выбор метода анализа

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

Диагностика и нейтрализация ошибок

Разработанный алгоритм относится к общеизвестному методу синтаксического разбора, предложенный Айронсом.

Основная идея метода состоит в том, что по контексту без возврата отбрасываются те символы, которые привели в тупиковую ситуацию и разбор продолжается.

Приведем пример синтаксического разбора:

While (A > ) cls();

1. ZàabAc[D]d

2. Aà B|A B|A <= B |A >= B |A != B

3. B àC | B*C | B**C | B+C | B-C | B/C

4. C àbAc | E | F 

5. E à g{g|f}

6. F à f{f}

7. D à Eb[G{hG}]c

8. G à E | F | Ω

                             Z


a        b                 A              c          D

                   B                 A       E              

                  

                   C                 B       g{g} b       G       c

                  

                   E                 C                          Ω

                  

                   g                 E

                                     

                                      g

While (       A          >                )   cls   (                 );

                   тупиковая ситуация

Тестирование на цепочках

Протокол работы синтаксического распознавателя оператора цикла while языка С.

_____________________________________________________________________

Обрабатываем строчку - While(a>)cls();

Найден While проверка началась с символа - (

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - a

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - )

Проверка на ЦБЗ,   текущий символ - )

Проверка на FUNC,текущий символ - c

Проверка на IDENT, текущий символ - c

Найденные ошибки в строке While(a>)cls();

Предупреждение: Отсутствует условие ()

Не найден идентификатор или ЦБЗ

_____________________________________________________________________

Обрабатываем строчку - while(1<(3*(43+5*(3-4-(4<454)))) ;

Найден While проверка началась с символа - (

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 1

Проверка на ЦБЗ,   текущий символ - 1

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 3

Проверка на ЦБЗ,   текущий символ - 3

Проверка на TERM

Проверка на O

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 4

Проверка на ЦБЗ,   текущий символ - 4

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 5

Проверка на ЦБЗ,   текущий символ - 5

Проверка на TERM

Проверка на O

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 3

Проверка на ЦБЗ,   текущий символ - 3

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 4

Проверка на ЦБЗ,   текущий символ - 4

Проверка на TERM

Проверка на O

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 4

Проверка на ЦБЗ,   текущий символ - 4

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 4

Проверка на ЦБЗ,   текущий символ - 4

Проверка на FUNC,текущий символ - ;

Проверка на IDENT, текущий символ - ;

Найденные ошибки в строке while(1<(3*(43+5*(3-4-(4<454)))) ;

Отсутствует )

Предупреждение: отсутствует имя функции

_____________________________________________________________________

Обрабатываем строчку - 435 4 whilei>>3t*(ewqw++()*we) rscr(456,345,rtgrt,345444rtr,,,)

Найден While проверка началась с символа - i

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - i

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 3

Проверка на ЦБЗ,   текущий символ - 3

Проверка на TERM

Проверка на O

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - e

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - +

Проверка на ЦБЗ,   текущий символ - +

Проверка на TERM

Проверка на O

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - w

Проверка на FUNC,текущий символ - r

Проверка на IDENT, текущий символ - r

Проверка на PAR,   текущий символ - 4

Проверка на IDENT, текущий символ - 4

Проверка на ЦБЗ,   текущий символ - 4

Проверка на PAR,   текущий символ - 3

Проверка на IDENT, текущий символ - 3

Проверка на ЦБЗ,   текущий символ - 3

Проверка на PAR,   текущий символ - r

Проверка на IDENT, текущий символ - r

Проверка на PAR,   текущий символ - 3

Проверка на IDENT, текущий символ - 3

Проверка на ЦБЗ,   текущий символ - 3

Проверка на PAR,   текущий символ - ,

Проверка на IDENT, текущий символ - ,

Проверка на ЦБЗ,   текущий символ - ,

Найденные ошибки в строке 435 4 whilei>>3t*(ewqw++()*we) rscr(456,345,rtgrt,345444rtr,,,)

Отсутствует (

Отсутствует )

Предупреждение: Отсутствует условие ()

Отсутствует ; после функции

Параметр функции не может начинатся с цифры

Неизвестный идентификатор(ы) -

                    435, 4,

Не найден идентификатор или ЦБЗ

Идентификатор не может начинаться с цифры

Не найден или не верный параметр

Неизвестная знаковая конструкция

_____________________________________________________________________

Обрабатываем строчку - whiLE(43-(sss<233)fewfew) sd(we)

Найден While проверка началась с символа - (

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 4

Проверка на ЦБЗ,   текущий символ - 4

Проверка на TERM

Проверка на O

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - s

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 2

Проверка на ЦБЗ,   текущий символ - 2

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - f

Проверка на FUNC,текущий символ -

Проверка на IDENT, текущий символ - s

Проверка на PAR,   текущий символ - w

Проверка на IDENT, текущий символ - w

Найденные ошибки в строке whiLE(43-(sss<233)fewfew) sd(we)

Отсутствует ; после функции

Пропущено / или * или ** или + или -

_____________________________________________________________________

Обрабатываем строчку - while(i>344>(5445<<2323*343243+2343*(w))>23*232) clrscr(,)

Найден While проверка началась с символа - (

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - i

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 3

Проверка на ЦБЗ,   текущий символ - 3

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 5

Проверка на ЦБЗ,   текущий символ - 5

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 2

Проверка на ЦБЗ,   текущий символ - 2

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 3

Проверка на ЦБЗ,   текущий символ - 3

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 2

Проверка на ЦБЗ,   текущий символ - 2

Проверка на TERM

Проверка на O

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - w

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 2

Проверка на ЦБЗ,   текущий символ - 2

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 2

Проверка на ЦБЗ,   текущий символ - 2

Проверка на FUNC,текущий символ -

Проверка на IDENT, текущий символ - c

Проверка на PAR,   текущий символ - ,

Проверка на IDENT, текущий символ - ,

Проверка на ЦБЗ,   текущий символ - ,

Найденные ошибки в строке while(i>344>(5445<<2323*343243+2343*(w))>23*232) clrscr(,)

Отсутствует ; после функции

Не найден или не верный параметр

Неизвестная знаковая конструкция

_____________________________________________________________________

Обрабатываем строчку - while(u>r+erhgeerg(e>=rwe+++r+788erwe++)) scr(eee,qee<)

Найден While проверка началась с символа - (

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - u

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - r

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - e

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - e

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - r

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - r

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 7

Проверка на ЦБЗ,   текущий символ - 7

Проверка на FUNC,текущий символ -

Проверка на IDENT, текущий символ - s

Проверка на PAR,   текущий символ - e

Проверка на IDENT, текущий символ - e

Проверка на PAR,   текущий символ - q

Проверка на IDENT, текущий символ - q

Проверка на PAR,   текущий символ - <

Проверка на IDENT, текущий символ - <

Проверка на ЦБЗ,   текущий символ - <

Найденные ошибки в строке while(u>r+erhgeerg(e>=rwe+++r+788erwe++)) scr(eee,qee<)

Отсутствует ; после функции

Пропущено / или * или ** или + или -

Идентификатор не может начинаться с цифры

Не найден или не верный параметр

_____________________________________________________________________

Обрабатываем строчку - while(i>77777u777) clrscr(,...,)

Найден While проверка началась с символа - (

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - i

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 7

Проверка на ЦБЗ,   текущий символ - 7

Проверка на FUNC,текущий символ -

Проверка на IDENT, текущий символ - c

Проверка на PAR,   текущий символ - ,

Проверка на IDENT, текущий символ - ,

Проверка на ЦБЗ,   текущий символ - ,

Найденные ошибки в строке while(i>77777u777) clrscr(,...,)

Отсутствует ; после функции

Идентификатор не может начинаться с цифры

Не найден или не верный параметр

_____________________________________________________________________Обрабатываем строчку - while(4545>>445--- ;

Найден While проверка началась с символа - (

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 4

Проверка на ЦБЗ,   текущий символ - 4

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 4

Проверка на ЦБЗ,   текущий символ - 4

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ -

Проверка на ЦБЗ,   текущий символ -

Проверка на FUNC,текущий символ - ;

Проверка на IDENT, текущий символ - ;

Найденные ошибки в строке while(4545>>445--- ;

Отсутствует )

Предупреждение: отсутствует имя функции

Не найден идентификатор или ЦБЗ

Неизвестная знаковая конструкция

_____________________________________________________________________

Обрабатываем строчку - while(i>=0);

Найден While проверка началась с символа - (

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - i

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 0

Проверка на ЦБЗ,   текущий символ - 0

Проверка на FUNC,текущий символ - ;

Проверка на IDENT, текущий символ - ;

Найденные ошибки в строке while(i>=0);

Предупреждение: отсутствует имя функции

_____________________________________________________________________

Обрабатываем строчку - while(i>=0) 544();

Найден While проверка началась с символа - (

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - i

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 0

Проверка на ЦБЗ,   текущий символ - 0

Проверка на FUNC,текущий символ -

Проверка на IDENT, текущий символ - 5

Найденные ошибки в строке while(i>=0) 544();

Отсутствует ; после функции

Предупреждение: отсутствует имя функции

_____________________________________________________________________

Обрабатываем строчку - whilei>=0) clrscr();13

Найден While проверка началась с символа - i

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - i

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 0

Проверка на ЦБЗ,   текущий символ - 0

Проверка на FUNC,текущий символ -

Проверка на IDENT, текущий символ - c

Найденные ошибки в строке whilei>=0) clrscr();13

Отсутствует (

Предупреждение: Отсутствует условие ()

_____________________________________________________________________

Обрабатываем строчку - whilertt<=243+++344-23!=345 wwqwq;

Найден While проверка началась с символа - r

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - r

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 2

Проверка на ЦБЗ,   текущий символ - 2

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 3

Проверка на ЦБЗ,   текущий символ - 3

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 2

Проверка на ЦБЗ,   текущий символ - 2

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - =

Проверка на ЦБЗ,   текущий символ - =

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 3

Проверка на ЦБЗ,   текущий символ - 3

Проверка на FUNC,текущий символ - w

Проверка на IDENT, текущий символ - w

Найденные ошибки в строке whilertt<=243+++344-23!=345 wwqwq;

Отсутствует (

Отсутствует )

Не найден идентификатор или ЦБЗ

Не найден или не верный параметр

_____________________________________________________________________

Обрабатываем строчку - while(dd>>3432*23432)

Найден While проверка началась с символа - (

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - d

Проверка на AB

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 3

Проверка на ЦБЗ,   текущий символ - 3

Проверка на TERM

Проверка на O

Проверка на IDENT, текущий символ - 2

Проверка на ЦБЗ,   текущий символ - 2

Проверка на FUNC,текущий символ -

Проверка на IDENT, текущий символ -

Найденные ошибки в строке while(dd>>3432*23432)

Отсутствует ; после функции

Предупреждение: отсутствует имя функции

Неизвестная знаковая конструкция

Листинг программы

ВАРИАHТ # 10                                  

Синтаксический распознователь оператора цикла While               

                   Файл программы                   - А513.cpp

                 с текстом для распознования - test.513

                      с протоколом работы         - error.513          

Кафедpа       : АСУ                                                      

Гpуппа        : А-513                                                   

Студент       : Стариков Дмитрий Александрович                          

Пpеподаватели : кандидат технических наук, доцент                       

                                  Шоpников Юpий Владимиpович,            

                   ассистент      Панова   Веpа Боpисовна                

Дата          : 30 мая 1997г.                                           

//----------------------------------------------------------------------------

// Заголовочные файлы.

//----------------------------------------------------------------------------

#include

#include

#include

#include

#include

#include

#define UP      72      // стрелка вверх

#define DOWN    80      // стрелка вниз

#define ALTX    45      // выход

#define F1   59

#define F2   60

#define F3   61

#define ESC27

#define FL_NAME "test.513"

#define FL_TEST "error.513"

void open_fl(void);              // откpыть файл

void work_space(void);           // упpавляет pабочей областью

void print_page(void);           // печатает текст на экpан

void help_line(void);// текст с помощью нижняя стpочка

void help(int);

int scan();                      // Делает разбор строки

int my_while();                  // опеpатоp

int AB();                        // арифметическое выражение

int TERM();                      // Терм

int O();                         // Операнд

int IDENT();                     // Идентификатор

int ZBZ();                       // Целое без знака

int FUNC();                      // Функция

int PAR();                       // Параметр

char TEXT[22][80];

intposition;                   // Номер текущей страницы

intcur_y=3;                    // положение куpсоpа на экpане

intx,y;                        // Текущая позиция при компиляции в строчке

intf=0;                        // При f=1 ошибки для функции

char screen[4096];               // Сохpаняет полную копию экpана

char screen1[4096];              // Сохpаняет часть экpана

char *mistake[]={"Ошибок нет!!!",                                //0

                 "Опеpатоp while не найден",                     //1

                 "Отсутствует (",                                //2

                 "Отсутствует )",                                //3

                 "Предупреждение: Отсутствует условие ()",       //4

                 "Отсутствует ; после функции",                  //5

                 "Предупреждение: отсутствует имя функции",      //6

                 "Пропущено / или * или ** или + или - ",        //7

                 "",                                             //8

                 "Параметр функции не может начинатся с цифры",//9

                 "Неизвестный идентификатор(ы) - ",              //10

                 "Не найден идентификатор или ЦБЗ",              //11

                 "Идентификатор не может начинаться с цифры",    //12

                 "Не найден или не верный параметр",             //13

                 "Неизвестная знаковая конструкция",             //14

                 ""};                                            //15

FILE *fl_t;

int mistake_number[15]; //массив хранящий коды ошибок (0 или 1)

                        //где 1-ошибка присутсвует, 0 в противном случае

                        //mistake_number[i], где i номер ошибки из mistake

char strange[100];       //перечень неизвестных идентификаторов

                        //найденых в строке во время разбора

int s=0;                //текущая позиция в strange

void    main()

        {

        open_fl();

        help_line();

        print_page();

        work_space();

        }

//----------------------------------------------------------------------------

// Открытие файла

//----------------------------------------------------------------------------

void open_fl(void)

        {

        FILE *fl;

        int i;

        window(1,1,80,25);

        textbackground(BLACK);

        textcolor(WHITE);

        clrscr();

      _setcursortype(_NOCURSOR);

        if((fl_t= fopen(FL_TEST,"w"))== NULL) exit(1);

        if ((fl = fopen(FL_NAME,"r"))==NULL)

                {

                window(18,10,60,16);

                textbackground(GREEN);

                textcolor(BLACK);

                clrscr();

                gotoxy(5,2);cprintf(" Немогу найти файл test.513");

                gotoxy(5,3);cprintf("Проверте его наличие на диске");

                gotoxy(5,4);cprintf("     или создайте новый");

                gotoxy(3,6);cprintf("Для продолжения нажмите любую клавишу");

                getch();

                exit(0);

                }

        for(i=0;i<25;i++)

                {

                window(40-i,12-i/5,40+i,12+i/5);

                textbackground(GREEN);

                textcolor(BLACK);

                clrscr();

                delay(7);

                }

        textcolor(WHITE);

        gotoxy(12,2);cprintf("Чтение строк для разбора");

        gotoxy(12,3);cprintf("    произведеное из");

        gotoxy(12,4);cprintf("        файла ");

        gotoxy(12,5);cprintf("      test.513 ");

        gotoxy(7,8);cprintf(" Для продолжения нажмите любую клавишу");

        getch();

        for (i=0; i<20; i++)

                {

                if (fgets(TEXT[i],78,fl)==NULL) break;// читать строку файла

                }

        TEXT[i][0]=NULL;

        position=0;                    //обнуление позиции сдвига стpаниц

        fclose(fl);

        }

//----------------------------------------------------------------------------

// Рабочая область

//----------------------------------------------------------------------------

void work_space(void)

        {

        char c;

        while(1)

                {

                gotoxy(1,cur_y);

                c=getch();

                switch(c)

                        {

                        case UP:

                                if(cur_y!=3)

                                        {

                                        cur_y--;

                                        print_page();

                                        }

                                else

                                        {

                                        if(position!=0)

                                                {

                                                position--;

                                                print_page();

                                                cur_y=3;

                                                }

                                        }

                                break;

                        case DOWN:

                                if(cur_y!=7)

                                        {

                                        cur_y++;

                                        if(TEXT[cur_y+position-3][0]==NULL) cur_y--;

                                        print_page();

                                        }

                                else

                                        {

                                        cur_y=7;

                                        if(TEXT[cur_y+position-2][0]!=NULL)

                                                {

                                                position++;

                                                print_page();

                                                }

                                        }

                                break;

                        case F1:

                                help(1);

                                break;

                        case F2:

                                help(2);

                                break;

                        case F3:

                                help(3);

                                break;

                        case ALTX:

                                window(1,1,80,25);

                                textbackground(BLACK);

                                textcolor(WHITE);

                                fclose(fl_t);

                                clrscr();

                                exit(1);

                        case ESC:

                                window(1,1,80,25);

                                textbackground(BLACK);

                                textcolor(WHITE);

                                clrscr();

                                fclose(fl_t);

                                exit(1);

                        }

                }

        }

//----------------------------------------------------------------------------

// Распечатывает текст, выводит на экран ошибки, найденные в обрабатываемой

// (текущей) строке

//----------------------------------------------------------------------------

void print_page()

        {

        int i,xx=10;

        puttext(1,1,80,25,screen);

        for(i=0;i<=15;i++)//очистка массива ошибок

                mistake_number[i] = 0;

        strange[0]=NULL;

        s=0;

        x=cur_y+position-3;

        y=0;

        f=0;

        fprintf(fl_t,"______________________________________________________________________________n");

        fprintf(fl_t,"Обрабатываем строчку - %sn",TEXT[x]);

        scan();                    //вызывает сканер для разбора строки

        fprintf(fl_t,"n Найденные ошибки в строке %sn",TEXT[x]);

        for(i=0;i<=15;i++)

        if(mistake_number[i] == 1)

                {

                gotoxy(4,xx++);

                printf("%s ",mistake[i]);

                fprintf(fl_t,"%sn",mistake[i]);

                if(i==10 && mistake_number[i] == 1)

                        {

                        printf(" %s",strange);

                        fprintf(fl_t,"                    %sn",strange);

                        }

                }

        if(xx == 10)               //ошибок нет, т.к. координаты строки

                {                  //неизменились (xx)

                gotoxy(4,xx++);

                printf("%s ",mistake[0]);

                }

        textbackground(BLACK);

        textcolor(WHITE);

        if(TEXT[0][0]!=NULL)

                {

                for (i=1;i<6;i++)

                        {

                        if(TEXT[i-1+position][0]==NULL) break;

                        gotoxy(1,i+2);

                        puts(TEXT[i-1+position]);

                        }

                }

        gotoxy(1,cur_y);

        textbackground(RED);

        clreol();

        puts(TEXT[cur_y+position-3]);

        }

//----------------------------------------------------------------------------

// Выводит на экран текст с помощью

//----------------------------------------------------------------------------

void help_line(void)

        {

        window(1,1,80,25);

        textbackground(BLACK);

        clrscr();

        textbackground(GREEN);

        textcolor(BLACK);

        gotoxy(1,1);

        clreol();

        printf("          Borland C++      Веpсия только для опеpатоpа WHILE");

        gotoxy(1,25);

        textbackground(LIGHTCYAN);

        clreol();

        cprintf(" F1 - Помощь   F2 - ГрамматикаF3 - Язык оператора                 ALT+X-Выход");

        gotoxy(1,2);

        textbackground(LIGHTCYAN);

        clreol();

        printf("------------------------------- CОДЕРЖИМОЕ ФАЙЛА -------------------------------");

        gotoxy(1,8);

        textbackground(LIGHTCYAN);

        clreol();

        printf("------------------------------ СООБЩЕНИЯ ОБ ОШИБКАХ ----------------------------");

        gotoxy(1,9);

        gettext(1,1,80,25,screen);

        gettext(1,9,80,24,screen1);

        }

//----------------------------------------------------------------------------

// Выводит на экран текст, в зависимости от значения n

//----------------------------------------------------------------------------

void help(int n)

        {

        char string[4096];

        gettext(1,8,80,22,string);

        window(1,8,80,22);

        textbackground(CYAN);

        textcolor(BLACK);

        clrscr();

        gotoxy(1,1);

        if(n ==1)

                {

                cprintf("n         HОВОСИБИРСКИЙ ГОСУДАРСТВЕHHЫЙ ТЕХHИЧЕСКИЙ УHИВЕРСИТЕТnrr");

                cprintf("         Куpсовая pабота по дисциплине СИСТЕМHОЕ ПРОГРАММИРОВАHИЕnrr");

                cprintf("               Синтаксический pаспознавательnnrrr");

                cprintf("                 Используемые клавиши:rn");

                cprintf("   F1     - данный HELP.rn");

                cprintf("   F2     - гpамматика языка.rn");

                cprintf("   F3     - язык оператора.rn");

                cprintf("   Esc    - выход из программы.rn");

                cprintf("   Alt-X  - выход из программы.rnnn");

                cprintf("   (c) 1997 Стариков Дмитрий Александрович");

                }

        if(n == 2)

                {

                cprintf("n                 ГРАММАТИКА ЯЗЫКАnnrr");

                cprintf(" 1. <оператор> -> WHILE ()[];nrr");

                cprintf(" 2. -> T| >T | <=T | >=T | !=Tnrrr");

                cprintf(" 3. T -> O | T+O | T-O | T*O | T/O | T**Onrrr");

                cprintf(" 4. O ->() | | <ЦБЗ>nrrr");

                cprintf(" 5. -> Б{Б|Ц}rrrrn");

                cprintf(" 6. <ЦБЗ> -> Ц{Ц}rn");

                cprintf(" 7. -> ([

{,

}])rn");

                cprintf(" 8.

-> | <ЦБЗ> rn");

                }

        if(n == 3)

                {

                cprintf("n         ЯЗЫК ОПЕРАТОРАnnnrr");

                cprintf("   WHILE(AB) [FUNCTION([PAR,PAR,...])];rnn");

                cprintf("   AB       - Выражение rn");

                cprintf("   FUNCTION - функцияrn");

                cprintf("   PAR      - параметры функции, могут быть цифры или текст rn");

                cprintf("              количество их не ограниченоrnn");

                cprintf("   Пробелы между символами недопустимыrnnn");

                }

        getch();

        puttext(1,8,80,22,string);

        window(1,1,80,25);

        }

//----------------------------------------------------------------------------

// Сканирует до появления While

//----------------------------------------------------------------------------

int scan()

        {

        int k,j,w;      //счетчики

        mistake_number[1]=1;

        for(j=0;;j++)

                {

                if(TEXT[x][j] == NULL) break;

                if(TEXT[x][j] == 'W')

                        {

                        y=j;                    //если нашли W или w

                        if(my_while() == 1) break; //то вызываем

                        }                        //my_while

                if(TEXT[x][j] == 'w')

                        {

                        y=j;

                        if(my_while() == 1) break;

                        }

                if(TEXT[x][j] != ' ')

                        {

                        strange[s++]=TEXT[x][j];

                        mistake_number[10]=1;

                        }

                 if(TEXT[x][j] == ' ')

                        {

                        strange[s++]=',';

                        strange[s++]=' ';

                        }

                }

        strange[s]=NULL;

        return(1);

        }

//----------------------------------------------------------------------------

// Обрабатывает While и вызывает обработку функций

//----------------------------------------------------------------------------

int my_while()

        {

        char str[10];

        int k,j,w;                             //счетчики

        for(w=0;w<5;w++)

                {

                if(TEXT[x][y] == NULL) break;

                str[w]=toupper(TEXT[x][y++]); //Toupper - переводит

                }                            //все буквы в заглавные

        str[w]=NULL;

        if(strcmp(str,"WHILE") == 0)     //Если While найден то производим

                {                        // дальнейший разбор

                fprintf(fl_t,"Найден While проверка началась с символа - %cn",TEXT[x][y]);

                if(TEXT[x][y] != '(') mistake_number[2]=1;

                        else y++;

                AB();

                if(TEXT[x][y] != ')') mistake_number[3]=1;

                y++;

                mistake_number[1]=0;

                FUNC();

                return(1);

                }

        else return(0);

        }

//----------------------------------------------------------------------------

// Обработка выражения

//----------------------------------------------------------------------------

int AB()

        {

        char signal[4]=">

        int z;

        fprintf(fl_t,"Проверка на ABn");

        TERM();

        if(TEXT[x][y] == '<')

                {

                y++;

                if(TEXT[x][y] == '=') y++;

                for(z=0;z<4;z++)

                        if(TEXT[x][y] == signal[z])   //Если слишком

                                {                     //сложная знаковая

                                mistake_number[14]=1; //конструкция

                                y++;                  //то ошибка

                                z=0;

                                }

                AB();

                return(1);

                }

        if(TEXT[x][y] == '>')

                {

                y++;

                if(TEXT[x][y] == '=') y++;

                for(z=0;z<4;z++)

                        if(TEXT[x][y] == signal[z])

                                {

                                mistake_number[14]=1;

                                y++;

                                z=0;

                                }

                AB();

                return(1);

                }

        if(TEXT[x][y] == '=')

                {

                y++;

                if(TEXT[x][y] == '=')

                        {

                        y++;

                        }

                for(z=0;z<4;z++)

                        if(TEXT[x][y] == signal[z])

                                {

                                mistake_number[14]=1;

                                y++;

                                z=0;

                                }

                AB();

                return(1);

                }

       if(TEXT[x][y] == '!')

                {

                y++;

                for(z=0;z<3;z++)

                        if(TEXT[x][y] == signal[z])

                                {

                                mistake_number[14]=1;

                                y++;

                                z=0;

                                }

                if(TEXT[x][y+1] == '=')

                        {

                        y++;

                        }

                AB();

                return(1);

                }

        if(TEXT[x][y] == NULL) return(1);

        return(1);

        }

//----------------------------------------------------------------------------

// Обработка терма

//----------------------------------------------------------------------------

int TERM()

        {

        fprintf(fl_t,"Проверка на TERMn");

        O();

        if(TEXT[x][y] == '/')

                {

                y++;

                TERM();

                }

        else if(TEXT[x][y] == '*')

                {

                y++;

                if(TEXT[x][y] == '*') y++;

                TERM();

                }

        else if(TEXT[x][y] =='+')

                {

                y++;

                if(TEXT[x][y] == '+' && TEXT[x][y+1] == ')' )

                        {                  //возможна обработка выражения

                        y++;               //типа y++

                        return(0);         //или y+++e

                        }

                if(TEXT[x][y] == '+'&& TEXT[x][y+1] == '+') y+=2;

                TERM();

                }

        else if(TEXT[x][y] =='-')

                {

                y++;

                if(TEXT[x][y] == '-' && TEXT[x][y+1] == ')' )

                        {                  //для y--

                        y++;

                        return(0);

                        }

                if(TEXT[x][y] == '-'&& TEXT[x][y+1] == '-') y+=2;

                TERM();

                }

        else if(TEXT[x][y] ==NULL ) return(1);

        else if(TEXT[x][y] != '+' && TEXT[x][y]!='*' && TEXT[x][y]!=')' && TEXT[x][y] != '/' && TEXT[x][y]!='-' && TEXT[x][y] != '<' && TEXT[x][y]!='>' && TEXT[x][y]!='!' && TEXT[x][y]!=' '&& TEXT[x][y]!='=')

                {

                mistake_number[7]=1;

                AB();

                }

        return(1);

        }

//----------------------------------------------------------------------------

// Обработка операнда

//----------------------------------------------------------------------------

int O()

        {

        fprintf(fl_t,"Проверка на On");

        if(TEXT[x][y] == '(')

                {

                y++;

                if(TEXT[x][y] == ')')

                        {

                        mistake_number[4]=1;

                        y++;

                        }

                else

                        {

                        AB();

                        if(TEXT[x][y] == '(')

                                {

                                AB();

                                }

                        if(TEXT[x][y] != ')')

                                {

                                mistake_number[3]=1;

                                y++;

                                }

                        else y++;

                        }

                }

        else

                {

                if(IDENT() == 0)

                        if(ZBZ() == 0)

                                if(f==0) mistake_number[11]=1;

                return(0);

                }

        return(0);

        }

//----------------------------------------------------------------------------

// Обработка идентификатора

//----------------------------------------------------------------------------

int IDENT()

        {

        fprintf(fl_t,"Проверка на IDENT, текущий символ - %cn",TEXT[x][y]);

        if((isalpha(TEXT[x][y])) != NULL)

                {

                while(isalpha(TEXT[x][y]) || isdigit(TEXT[x][y]))

                        y++;

                return(1);

                }

        else return(0);

        }

//----------------------------------------------------------------------------

// Целое без знака

//----------------------------------------------------------------------------

int ZBZ()

        {

        fprintf(fl_t,"Проверка на ЦБЗ,   текущий символ - %cn",TEXT[x][y]);

        if((isdigit(TEXT[x][y])) != NULL)

                {

                y++;

                while(1)

                        {

                        if((isalpha(TEXT[x][y])) != NULL)

                                {

/*Если найден идентификатор,*/   if(f==0) mistake_number[12]=1;

/*начинающийся с цифры, */       else mistake_number[9]=1;

/*то ошибка:             */      while(isalpha(TEXT[x][y]) || isdigit(TEXT[x][y]))

/*если f=0 то в идентификаторе*/ y++;

/*если f=1 то в параметре */     return(1);

/*              функции */       }

                        if((isdigit(TEXT[x][y]))== NULL) break;

                        y++;

                        }

                return(1);

                }

        else return(0);

        }

//----------------------------------------------------------------------------

// Обработка функции

//----------------------------------------------------------------------------

int FUNC()

        {

        f=1;

        fprintf(fl_t,"Проверка на FUNC,текущий символ - %cn",TEXT[x][y]);

        for(;;y++)

                if(TEXT[x][y] != ' ') break;

        if(IDENT()==0)

                {

                mistake_number[6]=1;

                while(isalpha(TEXT[x][y]) || isdigit(TEXT[x][y]))

                        y++;

                }

        if(mistake_number[6] ==0)

        if(TEXT[x][y] =='(')

                {

                y++;

                if(TEXT[x][y] == ')')

                        {

                        mistake_number[4]=1;

                        y++;

                        }

                else while(6)

                        {

                        if(PAR() != 0)

                                {

                                if(TEXT[x][y] == ')')

                                        {

                                        y++;

                                        break;

                                        }

                                if(TEXT[x][y] == ';')break;

                                if(TEXT[x][y] == ',')y++;

                                }

                        else

                                {

                                mistake_number[13]=1;

                                break;

                                }

                        }

                }

        else

                {

                mistake_number[2]=1;

                mistake_number[13]=1;

                }

        if(mistake_number[13]==1)

                {

                for(;;y++)

                        {

                        if(TEXT[x][y] == NULL)

                                {

                                mistake_number[5]=1;

                                mistake_number[3]=1;

                                break;

                                }

                        if(TEXT[x][y] == ';')

                                {

                                mistake_number[3]=1;

                                break;

                                }

                        if(TEXT[x][y] == ')')

                                {

                                y++;

                                break;

                                }

                        }

                }

        if(TEXT[x][y] != ';') mistake_number[5]=1;

        return(1);

      }

//----------------------------------------------------------------------------

// Обработка параметров функции

//----------------------------------------------------------------------------

int PAR()

        {

        fprintf(fl_t,"Проверка на PAR,   текущий символ - %cn",TEXT[x][y]);

        if(IDENT() == 0)

                if(ZBZ() == 0)

                        {

                        mistake_number[13]=1;

                        return(0);

                        }

        return(1);

        }

Список литературы:

1. Д. Грис Конструирование компиляторов для цифровых вычислительных машин. М., Мир, 1975.

2. Лебедев В.Н. Введение в системы программирования. М., «Статистика», 1975.

3. Шорников Ю.В., Шегал Б.Р. Методическое пособие для выполнения курсовой работы по системному программированию. Новосибирск, 1992.