Реферат: Построение формального языка L
WHILE(
, ...])>];
WHILE
- входной
терминальный
символ
- параметры
функции, которые
тоже могут
отсутствовать Пример
правильного
синтаксиса: WHILE(A>44 A>44 clrscr()
- функция,
без параметров Любая
грамматика,
к примеру G[Z],
содержит
следующие
базисные элементы
Vt,
Vn,
Z, P,
где: Vt
- словарь
терминальных
символов Vn
- словарь
нетерминальных
символов Z
- начальный
нетерминальный
символ P
- множество
правил вывода
G[<оператор>]: <Оператор>
а
while( <ЦБЗ>
а
Ц{Ц}
<Функция>
а
{, }])
а
G[<оператор>]: <Оператор>
а
while( <ЦБЗ>
а
Ц{Ц} <Функция>
а
{, }])
а
Сделаем
замену
нетерминальных
символов: <Оператор>
а
Z <Функция
>
а
D <ЦБЗ>
а
F
а
G Сделаем
замену
терминальных
символов: WHILE
а
a (
а
b )
а
c ;
а
d Ц
а
f Б
а
g ,
а
h
G[Z]: Z
а
abAc[D]d Aа
B|A B|A <= B |A >= B |A != B B
а
C | B*C | B**C | B+C | B-C | B/C C
а
bAc | E |
F
E
а
g{g|f} F
а
f{f} D
а
Eb[G{hG}]c G
а
E | F |
к Вывод
: G[Z]
- контекстно-свободная
грамматика.
Хотя однозначность
в общем случае
для контекстно-зависимых
грамматик не
доказана, ее
использование
возможно для
грамматик в
которых однозначность
очевидна. Наиболее
хорошо разработанным
методом анализа,
для данного
типа грамматик
является, метод
рекурсивного
спуска.
Разработанный
алгоритм относится
к общеизвестному
методу синтаксического
разбора, предложенный
Айронсом.
Основная
идея метода
состоит в том,
что по контексту
без возврата
отбрасываются
те символы,
которые привели
в тупиковую
ситуацию и
разбор продолжается.
Приведем
пример синтаксического
разбора:
While
(A > ) cls();
Z
а
abAc[D]d Aа
B|A B|A <= B |A >= B |A != B B
а
C | B*C | B**C | B+C | B-C | B/C C
а
bAc | E |
F
E
а
g{g|f} F
а
f{f} D
а
Eb[G{hG}]c 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 ESC 27 #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]; int position;
// Номер текущей
страницы int cur_y=3;
// положение
куpсоpа на экpане int x,y;
// Текущая
позиция при
компиляции
в строчке int f=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,"Обрабатываем
строчку - %s\n",TEXT[x]); scan();
//вызывает
сканер для
разбора строки
fprintf(fl_t,"\n Найденные
ошибки в строке
%s\n",TEXT[x]);
for(i=0;i<=15;i++)
if(mistake_number[i] == 1)
{
gotoxy(4,xx++);
printf("%s ",mistake[i]);
fprintf(fl_t," %s\n",mistake[i]);
if(i==10 && mistake_number[i] == 1)
{
printf(" %s",strange);
fprintf(fl_t," %s\n",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ИВЕРСИТЕТ\n\r\r");
cprintf(" Куpсовая
pабота по дисциплине
СИСТЕМHОЕ
ПРОГРАММИРОВАHИЕ\n\r\r");
cprintf(" Синтаксический
pаспознаватель\n\n\r\r\r");
cprintf(" Используемые
клавиши:\r\n");
cprintf(" F1 - данный
HELP.\r\n");
cprintf(" F2 - гpамматика
языка.\r\n");
cprintf(" F3 - язык
оператора.\r\n");
cprintf(" Esc - выход из
программы.\r\n");
cprintf(" Alt-X - выход из
программы.\r\n\n\n");
cprintf(" (c) 1997 Стариков
Дмитрий Александрович");
} if(n ==
2)
{
cprintf("\n ГРАММАТИКА
ЯЗЫКА\n\n\r\r");
cprintf(" 1. <оператор>
-> WHILE (
cprintf(" 2.
cprintf(" 3. T -> O | T+O | T-O | T*O | T/O | T**O\n\r\r\r");
cprintf(" 4. O ->(
cprintf(" 5.
cprintf(" 6. <ЦБЗ> -> Ц{Ц}\r\n");
cprintf(" 7. {, }])\r\n");
cprintf(" 8. ->
} if(n ==
3)
{
cprintf("\n ЯЗЫК
ОПЕРАТОРА\n\n\n\r\r");
cprintf(" WHILE(AB) [FUNCTION([PAR,PAR,...])];\r\n\n");
cprintf(" AB - Выражение
\r\n");
cprintf(" FUNCTION - функция\r\n");
cprintf(" PAR - параметры
функции, могут
быть цифры или
текст \r\n");
cprintf(" количество
их не ограничено\r\n\n");
cprintf(" Пробелы
между символами
недопустимы\r\n\n\n");
}
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
проверка началась
с символа -
%c\n",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,"Проверка
на AB\n"); 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,"Проверка
на TERM\n"); 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,"Проверка
на O\n");
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, текущий
символ - %c\n",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,"Проверка
на ЦБЗ, текущий
символ - %c\n",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, текущий
символ - %c\n",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, текущий
символ - %c\n",TEXT[x][y]);
if(IDENT() == 0)
if(ZBZ() == 0)
{
mistake_number[13]=1;
return(0);
}
return(1); } Д.
Грис Конструирование
компиляторов
для цифровых
вычислительных
машин. М., Мир,
1975. Лебедев
В.Н. Введение
в системы
программирования.
М., «Статистика»,
1975. Шорников
Ю.В., Шегал Б.Р.
Методическое
пособие для
выполнения
курсовой работы
по системному
программированию.
Новосибирск,
1992.
Подбор
грамматики
G[Z]
по
языку
L
Классификация
G[Z]
Выбор
метода анализа
Диагностика
и нейтрализация
ошибок
Тестирование
на цепочках
Листинг
программы
Список
литературы: