DIPLOM (663709), страница 8
Текст из файла (страница 8)
{
unsigned int type; // тип блока
int x; // координата блока по оси x
int y; // координата блока по оси y
char *text; // текст блока
int true_x; // переход по ИСТИНЕ по оси x на планшете
int true_y; // переход по ИСТИНЕ по оси y на планшете
int false_x; // переход по ЛЖИ по оси x на планшете
int false_y; // переход по ЛЖИ по оси y на планшете
struct BLOCK *next; // указатель на следующий элемент схемы
bool StopRun; // признак точки входа в программу
bool ErrorFlag; // признак наличия ошибок в данном блоке
bool RunBlock; // признак выполнения блока в текущий момент
struct SVERTKA* Poliz; // полиз текста блока
};
Файл схемы представляет собой последовательность следующих записей:
struct BLOCK
{
unsigned int type; // тип блока
int x; // координата блока по оси x
int y; // координата блока по оси y
char *text; // текст блока
int true_x; // переход по ИСТИНЕ по оси x на планшете
int true_y; // переход по ИСТИНЕ по оси y на планшете
int false_x; // переход по ЛЖИ по оси x на планшете
int false_y; // переход по ЛЖИ по оси y на планшете
};
Таблица переменных образованна следующим образом: она состоит из списка структур следующего вида:
struct VARIABLE
{
AnsiString Hint; // подсказка при индексации
char* name; // имя переменной
char type; // тип переменной
unsigned int Size; // размерность массива, если Size == 0,
// то это переменная
unsigned int* SizeN;// массив значений размерностей,
// если это переменная то SizeN == NULL
char* ready; // признак готовности к работе переменной
int* __int; // значение переменной типа int
long int* __long_int;// значение переменной типа long int
char* __char; // значение переменной типа char
float* __float; // значение переменной типа float
double* __double; // значение переменной типа double
struct VARIABLE* next;// указатель на следующий элемент таблицы
// переменной
};
Таблица констант также представлена списком структур следующего вида:
struct CONSTANTA
{
unsigned char type; // тип константы
int __long_int; // константа типа long int
int __int; // константа типа int
char __char; // константа типа char
float __float; // константа типа float
double __double; // константа типа double
char* __string; // константа типа string
struct CONSTANTA* next;// указатель на следующий элемент таблицы
};
Последовательность текста блока, как уже говорилось ранее, при трансляции переводится на внутренний язык транслятора. В данной системе это список сверток, которые имеют следующую структуру:
struct SVERTKA
{
unsigned char type; // тип свертки
unsigned char intype; // подтип свертки (номер операции, функции,
// процедуры в списке функций)
struct VARIABLE* variable;// если это не переменная то variable==NULL
// если переменной не существует в таблице
// переменных то variable == NULL
struct CONSTANTA* constanta;//указатель на таблицу констант
// если это не константа то constanta==NULL
// если такой константы не существует в таблице
// констант то constanta == NULL
struct SVERTKA* next; // указатель на следующий элемент свертки
int result; // счетчик числа операндов операций или функции
};
Заключение
Данная работа представляет собой транслятор с языка блок схем.
Система состоит из оболочки, графического редактора блок-схем, встроенного текстового редактора, интерпретатора, пошагового отладчика и конвертора на язык Си.
Система отлажена и протестирована на серии примеров. Система реализована в двух вариантах:
-
Под операционную систему MS-Dos,
-
Под операционные системы Windows NT, Windows 95, Windows 98.
Размер исполняемого файла в среде MS-Dos 300 Кбайт, в среде Windows 900 Кбайт.
Результаты данной работы были представлены на 6ой международной научно-практической конференции “Новые информационные технологии в университетском образовании”, которая проходила в городе Новосибирске с 17 по 19 марта 1999 года. На конференции был сделан доклад (тезисы опубликованы).
Система создавалась с целью обучения студентов первого курса ФПМиК основам программирования. Предполагается её активное использование.
Литература
-
Лебедев В.Н. Введение в системы программирования. - М: Статистика, 1975.-315с.
-
Грис Д. Конструирование компиляторов для цифровых вычислительных машин, - М: Мир, 1975.-544с.
-
Касьянов В.Н. , Поттосин И.В. Методы построения трансляторов.- Новосибирск: Наука, 1986. -343с.
-
Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиляции в 2-х томах. - М: Мир, 1978.
-
Соловьёв А.С. Интерпретатор языка блок-схем. // Материалы научно-практической конференции “Новые информационные технологии в университетском образовании”. - Новосибирск: Издательство ИДМИ, 1999.-227с.
-
Демин А.Ю., Гусев А.В. Визуальное программирование программ на основе блок-схем. // Материалы научно-практической конференции “Новые информационные технологии в университетском образовании” Новосибирск: Издательство ИДМИ, 1999.-227с.
-
Паронджанов В.Д. Язык программирования “ДРАКОН” // Программирование. – 1995. - №3.
-
Паронджанов В.Д. Учись рисовать ясные блок-схемы. - М: “Радио и связь”, 1995.
-
Рейсдорф Кент, Хендерсон Кен Освой самостоятельно Borland C++Builder. - Москва: ЗАО “Издательство БИНОМ”, 1998.-704с.
-
Lee C.Y. An algorithm for path connetion and its applications. // “IRE Trans.”, V.EC-10 - № 3.
Приложение
Приложение 1: Примеры блок-схем
MS-Dos версия:
Windows версия:
Пример 1. Нахождение максимума из двух чисел.
Пример 2. Сортировка методом пузырька (Windows версия).
Пример3. Вычислительная программа (MS-Dos версия)
Приложение 2: Матрицы переходов анализаторов
Матрица лексического анализатора (сканера)
0 | ( | ) | + | - | / | * | < | > | = | ^ | | | ! | [ | ] | , | ; | & | . | | 0 | ‘’ | ‘ | “ | |
0 | 1 | 2 | 22 | 22 | 9 | 12 | 14 | 15 | 17 | 24 | 14 | 18 | 23 | 22 | 22 | 22 | 22 | 22 | 3 | -9 | E | 0 | 4 | 6 |
1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | -1 | -1 | 0 | -1 | -1 |
2 | -1 | 2 | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | 0 | 0 | 0 | 0 | 3 | -1 | -1 | 0 | -1 | -1 |
3 | -1 | 3 | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | 0 | 0 | 0 | 0 | -1 | -1 | -1 | 0 | -1 | -1 |
4 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
5 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 7 | -1 |
6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | -1 | 6 | 6 | 8 |
7 | -1 | -1 | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | 0 | -1 | 0 | 0 | -1 | -1 | 0 | -1 | -1 |
8 | -1 | -1 | -1 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | 0 | -1 | -1 | -1 | -1 | 0 | -1 |
9 | 0 | 0 | 0 | -1 | 10 | -1 | -1 | -1 | -1 | -1 | 11 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | -1 | 0 | -1 |
10 | -1 | -1 | -1 | 0 | -1 | -1 | 0 | 0 | 0 | 0 | -1 | 0 | 0 | 0 | -1 | 0 | 0 | 0 | 0 | -1 | -1 | -1 | 0 | -1 |
11 | 0 | 0 | 0 | -1 | -1 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | -1 | 0 | 0 |
12 | 0 | 0 | 0 | -1 | -1 | 13 | -1 | -1 | -1 | -1 | 11 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | -1 | 0 | 0 |
13 | -1 | -1 | -1 | -1 | 0 | -1 | 0 | 0 | 0 | 0 | -1 | 0 | 0 | 0 | -1 | 0 | 0 | 0 | 0 | -1 | -1 | -1 | 0 | -1 |
14 | 0 | 0 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 11 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | -1 | 0 | 0 |
15 | 0 | 0 | 0 | -1 | -1 | 0 | -1 | -1 | 16 | 0 | 11 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | -1 | 0 | 0 |
16 | 0 | 0 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 11 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | -1 |
17 | 0 | 0 | 0 | -1 | -1 | 0 | -1 | -1 | -1 | 16 | 11 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | -1 | 0 | 0 |
18 | 0 | 0 | 0 | -1 | -1 | 0 | -1 | -1 | -1 | -1 | 11 | -1 | 19 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | -1 | 0 | 0 |
19 | 0 | 0 | 0 | -1 | -1 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | -1 | 0 | 0 |
20 | 0 | 0 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 11 | -1 | -1 | 0 | -1 | -1 | -1 | -1 | 21 | 0 | -1 | -1 | 0 | 0 |
21 | 0 | 0 | 0 | -1 | -1 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | -1 | 0 | 0 |
22 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
23 | 0 | 0 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 11 | -1 | -1 | 0 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | -1 | 0 | 0 |
24 | 0 | 0 | 0 | -1 | -1 | 0 | -1 | -1 | -1 | -1 | 11 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | -1 | 0 | 0 |
Матрица синтаксических переходов блока “НАЧАЛО”
состояние | Идентификатор | Константа | Int | Long | Char | Float | Double | , | ; | [ | ] | NULL | |
0 | -30 | -31 | 2 | 1 | 2 | 2 | 2 | -32 | -32 | -32 | -32 | Е | -32 |
1 | -30 | -31 | 2 | -30 | -30 | -30 | -30 | -32 | -32 | -32 | -32 | -32 | -32 |
2 | 3 | -33 | -33 | -33 | -33 | -33 | -33 | -32 | -32 | -32 | -32 | -32 | -32 |
3 | -32 | -32 | -32 | -32 | -32 | -32 | -32 | 2 | 0 | 4 | -32 | -32 | -32 |
4 | -34 | 5 | -34 | -34 | -34 | -34 | -34 | -34 | -34 | -34 | -34 | -34 | -34 |
5 | -34 | -34 | -34 | -34 | -34 | -34 | -34 | 4 | -34 | -34 | 6 | -34 | -34 |
6 | -34 | -34 | -34 | -34 | -34 | -34 | -34 | 2 | 0 | -34 | -34 | -34 | -34 |
Матрица синтаксических переходов блока “ВВОД”
Состояние | идентификатор | [ | , | ; | | NULL |
0 | 1 | -35 | -35 | -35 | -35 | -35 |
1 | -35 | 1 \ 0 \-36 | 0 | 2 | -35 | -35 |
2 | 1 | -35 | -35 | -35 | -35 | Выход |
Матрица синтаксических переходов индексации массивов 1
состояние | Идентификатор | Константа | Любая конст. | [ | ] | , | + | - | ~ | # | * | / | ^ | Mod | Div | ( | ) | | NULL |
0 | 1 | . | 2 | . | . | . | . | . | 4 | 4 | . | . | . | . | . | 1\1 | . | . | . |
1 | . | . | . | 2\0 | . | . | 3 | 3 | . | . | 3 | 3 | 3 | 3 | 3 | . | Е | . | . |
2 | . | . | . | . | . | . | 3 | 3 | . | . | 3 | 3 | 3 | 3 | 3 | . | Е | . | . |
3 | 1 | . | 2 | . | . | . | . | . | . | . | . | . | . | . | . | 1\1 | . | . | . |
4 | 1 | . | 2 | . | . | . | . | . | . | . | . | . | . | . | . | 1\1 | . | . | . |
Матрица синтаксических переходов индексации массивов 2
состояние | Идентификатор | Константа | Любая конст. | [ | ] | , | + | - | ~ | # | * | / | ^ | Mod | Div | ( | ) | | NULL |
0 | 1 | . | 2 | . | . | . | . | . | 4 | 4 | . | . | . | . | . | 1\1 | . | . | . |
1 | . | . | . | 2\0 | Е | 0 | 3 | 3 | . | . | 3 | 3 | 3 | 3 | 3 | . | . | . | . |
2 | . | . | . | . | Е | 0 | 3 | 3 | . | . | 3 | 3 | 3 | 3 | 3 | . | . | . | . |
3 | 1 | . | 2 | . | . | . | . | . | . | . | . | . | . | . | . | 5\1 | . | . | . |
4 | 1 | . | 2 | . | . | . | . | . | . | . | . | . | . | . | . | 5\1 | . | . | . |
5 | . | . | . | . | Е | 0 | 3 | 3 | . | . | 3 | 3 | 3 | 3 | 3 | 5\1 | . | . | . |
Матрица синтаксических переходов функции strlen
состояние | Идентифи-катор | [ | ) | | NULL | ( | Константа |
0 | . | . | . | . | . | 2 | . |
1 | . | 3 \ 0 | Выход | . | . | . | . |
2 | 1 | . | . | . | . | . | 4 |
3 | . | . | Выход | . | . | . | . |
4 | . | . | Выход | . | . | . | . |
Матрица синтаксических переходов блока “ВЫВОД”
состояние | Константа str | Константа | 1 | 2 | 5 | Clock | Strlen | , | ( | [ | ; | Идентификатор | | NULL | ) |
0 | 1 | 2 | 5 | . | 4 | 6 | 2\2 | . | 2\3 | . | . | 9 | . | . | . |
1 | . | . | . | . | . | . | . | 0 | . | . | 10 | . | . | . | . |
2 | . | . | . | 3 | . | . | . | 0 | . | . | 10 | . | . | . | . |
3 | . | 2 | . | . | 4 | 6 | 2\2 | . | 2\3 | . | . | 9 | . | . | . |
4 | . | . | . | . | . | . | . | . | 2\3 | . | 10 | . | . | . | . |
5 | . | 2 | . | . | 4 | 6 | 2\2 | . | 2\3 | . | . | 9 | . | . | . |
6 | . | . | . | . | . | . | . | . | 7 | . | . | . | . | . | . |
7 | . | . | . | . | . | . | . | . | . | . | . | . | . | . | 8 |
8 | . | . | . | 3 | . | . | . | 0 | . | . | 10 | . | . | . | . |
9 | . | . | . | 3 | . | . | . | 0 | . | 2\0 | 10 | . | . | . | . |
10 | 1 | 2 | 5 | . | 4 | 6 | 2\2 | . | 2\3 | . | . | 9 | . | Е | . |
Матрица синтаксических переходов блока “Автоматические действия”
Состояние | Константа str | Константа | Идентифик. | ( | [ | ; | 1 | 2 | 3 | 5 | Clock | Getch | Kbhit | Strlen | ) | | NULL |
0 | . | . | 1 | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
1 | . | . | . | 2\0 | . | . | . | 3 | . | . | . | . | . | . | . | . | . |
2 | . | . | . | . | . | . | . | 3 | . | . | . | . | . | . | . | . | . |
3 | . | 4 | 5 | 4\3 | . | . | 6 | . | . | 8 | 13 | 10 | 13 | 4\2 | . | . | . |
4 | . | . | . | . | . | 9 | . | 7 | . | . | . | . | . | . | . | . | . |
5 | . | . | . | . | 4\0 | 9 | . | 7 | . | . | . | . | . | . | . | . | . |
6 | . | 4 | 5 | 4\3 | . | . | . | . | . | 8 | 13 | . | 13 | 4\2 | . | . | . |
7 | . | 4 | 5 | 4\3 | . | . | . | . | . | 8 | 13 | . | 13 | 4\2 | . | . | . |
8 | . | . | . | 4\3 | . | . | . | . | . | . | . | . | . | . | . | . | . |
9 | . | . | 1 | . | . | . | . | . | . | . | . | . | . | . | . | . | Е |
10 | . | . | . | 11 | . | . | . | . | . | . | . | . | . | . | . | . | . |
11 | . | . | . | . | . | . | . | . | . | . | . | . | . | . | 12 | . | . |
12 | . | . | . | . | . | 9 | . | . | . | . | . | . | . | . | . | . | . |
13 | . | . | . | 14 | . | . | . | . | . | . | . | . | . | . | . | . | . |
14 | . | . | . | . | . | . | . | . | . | . | . | . | . | . | 4 | . | . |
Матрица синтаксических переходов математического выражения
состояние | идентификатор | Константа str | Константа | 1 | 2 | 5 | Clock | Strlen | ( | [ | ) | | NULL |
0 | 1 | . | 3 | 4 | . | 5 | 6 | 3\2 | 3\3 | . | . | . | . |
1 | . | . | . | . | 2 | . | . | . | . | 3\0 | Е | . | . |
2 | 1 | . | 3 | . | . | 5 | 6 | 3\2 | 3\3 | . | . | . | . |
3 | . | . | . | . | 2 | . | . | . | . | . | Е | . | . |
4 | 1 | . | 3 | . | . | 5 | 6 | 3\2 | 3\3 | . | . | . | . |
5 | . | . | . | . | . | . | . | . | 3\3 | . | . | . | . |
6 | . | . | . | . | . | . | . | . | 7 | . | . | . | . |
7 | . | . | . | . | . | . | . | . | . | . | 3 | . | . |
Матрица синтаксических переходов блока “Подпрограмма”
Состояние | Константа str | идентификатор | [ | ; | , | 2 | Programm | | NULL |
0 | . | 1 | . | . | . | . | 4 | . | . |
1 | . | . | 2 \ 0 | . | . | 3 | . | . | . |
2 | . | . | . | . | . | 3 | . | . | . |
3 | . | . | . | . | . | . | 4 | . | . |
4 | 6 | 5 | . | . | . | . | . | . | . |
5 | . | . | . | . | 4 | . | . | . | . |
6 | . | . | . | 7 | . | . | . | . | . |
7 | . | . | . | . | . | . | . | . | Выход |
Матрица синтаксических переходов блоков “Метка” и “Безусловный переход”
Состояние | Константа | ; | | NULL |
0 | 1 | . | . | . |
1 | . | 2 | . | . |
2 | . | . | . | Выход |
Матрица синтаксических переходов блока “Ветвление по условию”
состояние | Константа str | Константа | Идентификатор | ( | [ | ! | 4б | ; | | NULL |
0 | . | 1 | 2 | 3 \ 4 | . | 4 | . | . | . | . |
1 | . | . | . | . | . | . | 5 | 6 | . | . |
2 | . | . | . | . | 3 \ 0 | . | 5 | 6 | . | . |
3 | . | . | . | . | . | . | 5 | 6 | . | . |
4 | . | . | 2 | . | . | . | . | . | . | . |
5 | . | 1 | 2 | 1 \ 4 | . | 4 | . | . | . | . |
6 | . | . | . | . | . | . | . | . | . | Выход |
Вспомогательная матрица синтаксических переходов блока