Разработка синтаксического распознавателя вычисляемого оператора перехода языка FORTRAN

Министерство науки, высшей школы и технической политики Российской Федерации.Новосибирский Государственный Технический Университет FORTRAN. Факультет . Кафедра . Группа -513. Студент . Преподаватель . Ассистент . Дата 19 1997 . Отметка о защите 1997. Язык оператора. Язык вычисляемого оператора перехода языка FORTRAN. GOTO МЕТКАКОНСТАНТААРИФМЕТИЧЕСКОЕ ВЫРАЖЕНИЕ МЕТКА Идентификатор КОНСТАНТА ЦЕЛОЕ БЕЗ ЗНАКА АРИФМЕТИЧЕСКОЕ ВЫРАЖЕНИЕ ВЫРАЖЕНИЕ, СОДЕРЖАЩЕЕ В СЕБЕ ОПЕРАЦИИ А ТАКЖЕ . ВОЗВЕДЕНИЕ В СТЕПЕНЬ. Грамматика языка.

G ОПЕРАТОР 1. ОПЕРАТОР GOTO ВЫРАЖЕНИЕ 2. ВЫРАЖЕНИЕ Т ВЫРАЖЕНИЕ Т ВЫРАЖЕНИЕ Т 3. Т О ТО ТО ТО 4. О ВЫРАЖЕНИЕ ИДЕНТИФИКАТОР ДБЗ 5. ИДЕНТИФИКАТОР ББ Ц 6. ДБЗ ЦЦ.ЦЦ Т ТЕРМО ОПЕРАНДБ БУКВАЦ ЦИФРАДБЗ ДРОБНОЕ БЕЗ ЗНАКА КОНЕЦ СТРОКИ пусто ВОЗВЕДЕНИЕ В СТЕПЕНЬ Классификация грамматики.Данная грамматика G ОПЕРАТОР , согласно классификации Хомского, является контекстно-свободной, так как правая часть каждой редукции начинается либо с терминального символа, либо с нетерминального, принадлежащего объединнному словарю.

A a, AVn, aV. Грамматика G ОПЕРАТОР не является автоматной, так как не все е редукции начинаются с терминального символа. По этой же причине данная грамматика не является S - грамматикой. Метод анализа. Для данной грамматики реализован разбор методом рекурсивного спуска, поскольку она относится к классу контекстно-свободных.Идея метода состоит в том, что каждому нетерминальному символу ставится в соответствие определнная программная единица функция, которая распознат цепочку, порождаемую этим нетерминалом.

Эти процедуры и функции вызываются в соответствии с правилами грамматики и иногда вызывают сами себя. Данный метод реализован на языке C, поскольку он обладает рекурсивными возможностями. Диагностика и нейтрализация ошибок. Для данной грамматики производится только диагностика и нейтрализация ошибок.Исправление ошибок не производится.

Нейтрализация ошибок осуществляется по методу Айронса, то есть, спускаясь по синтаксическому дереву без возврата по контексту, при обнаружении тупиковой ситуации отбрасываются те литеры символы, которые привели в тупиковую ситуацию и разбор продолжается. Тестирование. Протокол работы синтаксического распознавателя вычисляемого оператора перехода языка FORTRAN. GOTO AB-DDCC2334RYC AB - Проверка на Арифметическое Выражение. SCAN - Сканирование.Текущий символ A с кодом 65. T - Проверка на Терм. O - Проверка на Операнд.

IDENT - Проверка на Идентификатор с символа A. SCAN - Сканирование. Текущий символ с кодом 43. AB - Проверка на Арифметическое Выражение. SCAN - Сканирование. Текущий символ B с кодом 66. T - Проверка на Терм. O - Проверка на Операнд. IDENT - Проверка на Идентификатор с символа B. SCAN - Сканирование. Текущий символ - с кодом 45. AB - Проверка на Арифметическое Выражение. SCAN - Сканирование.Текущий символ D с кодом 68. T - Проверка на Терм. O - Проверка на Операнд.

IDENT - Проверка на Идентификатор с символа D. SCAN - Сканирование. Текущий символ D с кодом 68. SCAN - Сканирование. Текущий символ с кодом 42. SCAN - Сканирование. Текущий символ с кодом 42. SCAN - Сканирование. Текущий символ с кодом 40. T - Проверка на Терм. O - Проверка на Операнд. AB - Проверка на Арифметическое Выражение. SCAN - Сканирование.Текущий символ C с кодом 67. T - Проверка на Терм. O - Проверка на Операнд.

IDENT - Проверка на Идентификатор с символа C. SCAN - Сканирование. Текущий символ C с кодом 67. SCAN - Сканирование. Текущий символ с кодом 47. SCAN - Сканирование. Текущий символ с кодом 40. T - Проверка на Терм. O - Проверка на Операнд. AB - Проверка на Арифметическое Выражение. SCAN - Сканирование. Текущий символ 2 с кодом 50. T - Проверка на Терм. O - Проверка на Операнд.IDENT - Проверка на Идентификатор с символа 2. FLOAT - Проверка на Дробное Без Знака с цифры 2. SCAN - Сканирование. Текущий символ 3 с кодом 51. SCAN - Сканирование. Текущий символ с кодом 43. AB - Проверка на Арифметическое Выражение.

SCAN - Сканирование. Текущий символ 3 с кодом 51. T - Проверка на Терм. O - Проверка на Операнд.IDENT - Проверка на Идентификатор с символа 3. FLOAT - Проверка на Дробное Без Знака с цифры 3. SCAN - Сканирование. Текущий символ 4 с кодом 52. SCAN - Сканирование. Текущий символ с кодом 42. SCAN - Сканирование. Текущий символ с кодом 42. SCAN - Сканирование. Текущий символ R с кодом 82. T - Проверка на Терм. O - Проверка на Операнд.

IDENT - Проверка на Идентификатор с символа R. SCAN - Сканирование.Текущий символ с кодом 41. SCAN - Сканирование. Текущий символ с кодом 41. SCAN - Сканирование. Текущий символ с кодом 43. AB - Проверка на Арифметическое Выражение.

SCAN - Сканирование. Текущий символ Y с кодом 89. T - Проверка на Терм. O - Проверка на Операнд. IDENT - Проверка на Идентификатор с символа Y. SCAN - Сканирование. Текущий символ с кодом 42. SCAN - Сканирование. Текущий символ с кодом 40. T - Проверка на Терм. O - Проверка на Операнд. AB - Проверка на Арифметическое Выражение.SCAN - Сканирование.

Текущий символ с кодом 40. T - Проверка на Терм. O - Проверка на Операнд. AB - Проверка на Арифметическое Выражение. SCAN - Сканирование. Текущий символ C с кодом 67. T - Проверка на Терм. O - Проверка на Операнд. IDENT - Проверка на Идентификатор с символа C. SCAN - Сканирование. Текущий символ с кодом 41. SCAN - Сканирование. Текущий символ с кодом 41. SCAN - Сканирование. Текущий символ NULL с кодом 0. GOTO A AB - Проверка на Арифметическое Выражение. SCAN - Сканирование.Текущий символ A с кодом 65. T - Проверка на Терм. O - Проверка на Операнд.

IDENT - Проверка на Идентификатор с символа A. SCAN - Сканирование. Текущий символ NULL с кодом 0. Листинг программы. FILE KURSOVIK.CPP. ВАРИАHТ 3. Оператор перехода вычисляемый языка FORTRAN. Кафедра АСУ. Группа А-513. Студент Борзов Андрей Hиколаевич. Преподаватели кандидат технических наук, доцент Шорников Юрий Владимирович, ассистент Панова Вера Борисовна.Дата 29 апреля 1997г. Подключаемые файлы. include string.h include conio.h include stdio.h include dos.h include stdlib.h include ctype.h include time.h includekeyboard.h Макроопределения. define ERROR 0 Код ошибки. define COLSTR 20 Максимальное количество строк. define STRLEN 35 Длина строки. define MAXSTRLEN 255 Максимальная длина строки. define FILENAME TEST.TXT Имя файла, открываемого по умолчанию. define YES 1 define NO 2 define OK 3 define TEST Определено, если включен отладочный режим. Прототипы функций. int IReadKeyvoid Опрос клавиатуры. void Welcomevoid Экран при старте программы. void Menuvoid Меню. void Helpvoid Помощь. void MyExitint0 Корректный выход из программы. void Beepint500,int100 Звуковой сигнал. void Usagevoid Использование программы. int OpenFilevoid Открытие файла. void DrawBoxint,int,int,int,char Рисует рамку с заголовком. void PrintTextvoid Печатает основной текст. void Screenvoid Перерисовка экрана. void Compilevoid Компиляция. void Messageint Вывод сообщений об ошибках. void MyPutschar,int Аналог putschar. void Languagevoid Язык оператора. void Grammarvoid Грамматика языка. void GetFilenamevoid Запрос имени файла для открытия. int ScanStrchar Поиск GOTO. int Scanerchar Обработка строки. void Scanvoid Сканирование следующего символа. void Delspacechar Удаление ненужных пробелов в строке. int ABvoid Реализация нетерминала АВ . int Tvoid Реализация нетерминала Т . int Ovoid Реализация нетерминала О . int IDENTvoid Реализация нетерминала IDENT . int FLOATvoid Реализация нетерминала FLOAT . void Errorint0,char Обработка ошибки.

Глобальные переменные. char filenameMAXSTRLEN Имя файла. char textCOLSTR1 Массив указателей на строки текста. char screen4096 Буфер под копию экрана. char mes212080 Массив под сообщения об ошибках. char nx Текущий символ. int pos Текущая позиция в строке. char STR80 Сканируемая строка. int ERR1 Счетчик страниц в массиве ошибок. int ERR2 Счетчик строк в массиве ошибок.

FILE errors Дескриптор файла.

Функция MAIN. void mainint argc,char argv textcolorLIGHTGRAY textbackgroundBLACK setcursortypeNOCURSOR clrscr ifargc 2 Usage MyExit ifargc2 strcpyfilename,argv1 else Welcome gettext20,7,60,17,screen GetFilename whileOpenFile puttext20,7,60,17,screen GetFilename Menu Вывод сообщений об ошибках. void Messageint j window42,3,79,23 textcolorBLUE textbackgroundCYAN clrscr forint i0i COLSTR mesji0NULLi cprintf-30srn,mesji Гpамматика языка. void Grammarvoid window1,25,80,25 textattr112 MyPuts F1 Help F2 Grammar F3 Language F9 Compile F10 Quit Alt-X Quit Esc Quit,DARKGRAY window10,5,70,20 textcolorWHITE textbackgroundMAGENTA clrscr DrawBox2,1,60,16,Гpамматика языка window12,6,78,19 textcolorYELLOW cputsrn cputs 1. Опеpатоp - GOTO Выpажение rn cputs 2. Выpажение - T Выpажение T Выpажение -Trn cputs 3. T - O TO TO TOrn cputs 4. O - Выpажение Идентификатоp ДБЗ rn cputs 5. Идентификатоp - ББЦrn cputs 6. ДБЗ - ЦЦ.ЦЦrnn cputs T - Теpмrn cputs O - Опеpандrn cputs Б - Букваrn cputs Ц - Цифpаrn cputs ДБЗ - Дробное Без Знакаrn cputs - возведение в степень.

IReadKey Язык оператора. void Languagevoid window1,25,80,25 textattr112 MyPuts F1 Help F2 Grammar F3 Language F9 Compile F10 Quit Alt-X Quit Esc Quit,DARKGRAY window20,8,60,18 textcolorWHITE textbackgroundGREEN clrscr DrawBox2,1,40,11,Язык оператора window22,9,58,17 textcolorBLACK cputsrn cputs GOTO CONST VAR АВrnn cputs CONST - Дробное без знака,rn cputs VAR - идентификатоp,rn cputs АВ - аpифметическое выpажение.

IReadKey Компиляция. void Compilevoid static int compile0 window1,25,80,25 textattr112 MyPuts F1 Help F2 Grammar F3 Language F9 Compile F10 Quit Alt-X Quit Esc Quit,DARKGRAY window20,8,60,18 textcolorWHITE textbackgroundRED clrscr DrawBox2,1,40,11,Компиляция window22,9,58,17 textcolorYELLOW cputsrn ifcompile 0 cputs Текст УЖЕ откомпилирован Beep900,1000 return errorsfopenPROTOCOL.TXT,wt cputs Идет компиляция.rnn Пожалуйста, подождите ifdef TEST window1,1,80,25 textattr78 clrscr endif fprintferrors,n fprintferrors, n fprintferrors, Протокол работы синтаксического распознавателя вычисляемого n fprintferrors, оператора перехода языка FORTRAN. n fprintferrors, n forint i0texti NULLi Scanertexti fprintferrors, n fprintferrors, КОНЕЦ. n fprintferrors, n fprintferrors,n Beep900,100 compile Обработка строки. int Scanerchar string char tmpstrSTRLEN strcpytmpstr,string Delspacetmpstr ScanStrtmpstr return 0 Поиск в строке оператора GOTO. int ScanStrchar string int j int i0 int k0 static int a0 char tmp80 char labelNO strcpySTR,string fprintferrors, n fprintferrors,sn,string fprintferrors, n do tmp0NULL j0 whileisspacestringk stringk-1NULL tmpjstringk-1 tmpjNULL ifstrcmptmp,GOTO 0 isdigittmp0 ifdef TEST cprintfНе определен идентификатор s.rn,tmp endif ERR1a ERR2i i Error5,tmp else ifisdigittmp0 labelYES ERR1a ERR2i posk whileABOK break whilestringk NULL iflabelNO ifdef TEST cprintfНе найден оператор GOTO.rnСтрока разбору не подлежит.rn endif Error6 a returnOK Удаление в строке пробелов. void Delspacechar string char strSTRLEN int j0 int i0 whileisspacestringi stringi NULL i forstringi NULLi ifislowerstringi stringitoupperstringi strjstringi strjNULL sprintfstring,s,str stringj-1NULL ifdef TEST textattr30 clreol cputsstring textattr78 cputsrn endif Реализация нетерминала Арифметическое Выражение . int ABvoid ifdef TEST cprintfAB - Проверка на Арифметическое Выражение.rn endif fprintferrors,AB - Проверка на Арифметическое Выражение.n Scan T ifnx AB else ifnx- AB ifnxNULL returnOK else ifnx nx nx Error1 returnYES Реализация нетерминала Терм . int Tvoid ifdef TEST cprintfT - Проверка на Терм.rn endif fprintferrors,T - Проверка на Терм.n O ifnx Scan T else ifnx Scan ifnx Scan T else T ifnxNULL returnOK else ifnx nx- nx Error2 returnOK Реализация нетерминала Операнд . int Ovoid ifdef TEST cprintfO - Проверка на Операнд.rn endif fprintferrors,O - Проверка на Операнд.n ifnx AB ifnx Error3 else Scan returnOK else ifIDENT NO ifFLOAT NO Error4 returnOK Реализация нетерминала Идентификатор . int IDENTvoid ifdef TEST cprintfIDENT - Проверка на Идентификатор с символа c.rn,nx getch endif fprintferrors,IDENT - Проверка на Идентификатор с символа c.n,nx ifisalphanx whileisalphanx isdigitnx Scan returnYES returnNO Реализация нетерминала Дробное Без Знака . int FLOATvoid ifdef TEST cprintfFLOAT - Проверка на Дробное Без Знака с цифры c.rn,nx getch endif fprintferrors, FLOAT - Проверка на Дробное Без Знака с цифры c.n,nx ifisdigitnx whileisdigitnx Scan ifnx. Scan whileisdigitnx Scan returnYES returnNO Сканирование следующего символа из строки. void Scanvoid ifdef TEST cprintfSCAN - Сканирование.

Текущий символ c с кодом d.rn,STRpos,STRpos getch endif fprintferrors,SCAN - Сканирование. Текущий символ c с кодом d.n,STRpos,STRpos nxSTRpos pos Обработка ошибок. void Errorint num,char s char E40 Ожидается или Ожидается , или , Ожидается , Ожидается идентификатор или Дробное без знака, Не определен идентификатор , Не найден оператор GOTOrnСтрока разбору не подлежит, NULL sprintfmesERR1ERR2,ss, Enum-1,s fprintferrors, n fprintferrors,Error - Ошибка строка d, ошибка d.n,ERR1,ERR2 ifdef TEST cprintfError - Ошибка строка d, ошибка d.rn,ERR1,ERR2 cprintfsrn,mesERR1ERR2 Beep1000,200 getch endif fprintferrors,sn,mesERR1ERR2 fprintferrors, n ERR2 mesERR1ERR20NULL Подключаемый файл. includeintface.h Файл с функциями интерфейса. 1997 Борзов Андрей Hиколаевич. E-mail ANDREYRedHouse.nstu.nsk.su. Литература. 1. Курс лекций по системному программированию. 2. Герберт Шилдт C для профессиональных программистов.