KorNet 1.5
А.В. Корочков
Система программирования на основе
языка С++ для работы с моделью
данных типа
"семантическая сеть"
("KorNet")
Описание системы (1995)
(См. также KorNet
)
5.2
Макроязык системы KorNet (часть I)
В описании макрокоманд применяются
следующие условные обозначения:
A - первый параметр,
B - второй параметр,
С - третий параметр,
и т.д.
Конкретизация типов параметров
приводится в описании макрокоманд,
например, char*.
Некоторые макрокоманды,
описываемые ниже, имеют
модификацию,
позволяющую проверить значение
переменной Result после выполнения
вызываемой в макрокоманде функции
системы. Модифицированная форма
имеет дополнительный символ
"c" в конце названия
макрокоманды и два
дополнительных параметра.
Последний в описании
модифицированной
макрокоманды параметр задает метку
оператора, к которому необходимо
перейти при наличии условия,
заданного предпоследним
параметром.
Этот параметр может принимать
значения goyes и gono. Если задано goyes,
то переход осуществляется при
Result==1, если gono - при Result==0.
Базовая и модифицированная формы
описываются совместно.
Далее в тексте выражение "сеть A
..." надо понимать как
"сеть (подсеть), начинающаяся с
узла A, ...".
abort(A)
A - char*
В зависимости от значения
переменной Result завершить работу
системы по exit(1) с выдачей в cerr
сообщения A.
abortl(A,B)
A - идентификатор
B - char*
В зависимости от значения
переменной A завершить работу
системы по exit(1) с выдачей в cerr
сообщения B.
addelem(A,B)
A - node*/fnode*
B - long/char*/node*/fnode*
Привесить узлу A безымянный атрибут
со значением B.
Пример:
defnode(Pictures); //создание нового узла
addelem(Pictures,"поле");
addelem(Pictures,"лес");
addelem(Pictures,"озеро");
Состояние участка сети до
выполнения операций addelem:
* (Pictures)
Состояние участка сети после
выполнения операций:
* (Pictures)
|
| (0)
\--------> "поле"
| (0)
\--------> "лес"
| (0)
\--------> "озеро"
allelem(A,B,C)
и firstelem(A,B,C)
A - node*/fnode*
B - long/char*/node*/fnode*
C - marker
Начать перебор безымянных
атрибутов узла A со значением типа B,
используя ранее объявленный маркер
C типа marker. Первое
найденное значение поместить в B.
Примечание.
Маркер создается и
инициализируется оператором marker A,
где A - имя переменной. Макрокоманда
firstelem и ее синоним
allelem помимо прочего инициализируют
существующий маркер.
Кроме того существующий маркер
может быть установлен в
начальное значение (для перебора с
начала) макрокомандой
initmarker(A), где A - marker.
Пример:
char* fileNumber="00";
.
.
marker markFile;
firstelem(readFiles,fileNumber,markFile);
while (Result==1)
{
.
.
.
nextelem(readFiles,fileNumber,markFile);
}
ascribe(A,B)
ascribec(A,B,C,D)
A - fnode*
B - node*
C - goyes/gono
D - метка перехода
Приписать атрибуты узла A из АСБД
узлу B в АС.
ascribea(A,B)
ascribeac(A,B,C,D)
A - char*
B - node*
C - goyes/gono
D - метка перехода
Приписать атрибуты атома A
(атомарного узла) из АСБД узлу B в АС.
atom(A,B)
и defatom(A,B)
A - char*
B - node*
Найти или образовать атом A в АС и
указатель на его атомарный узел
поместить в новую переменную с
идентификатором B. Эта переменная
будет иметь тип node*.
Пример:
atom("task",Task);
countelems(A,B)
A - node*/fnode*
B - int
Подсчитать количество безымянных
атрибутов узла A. Полученное
число поместить в существующую
переменную типа int с
идентификатором B.
declfnode(A)
A - идентификатор
Образовать новый объект класса fnode.
Указатель на него
поместить в новую переменную с
идентификатором A. Эта переменная
будет иметь тип fnode*.
Пример:
declfnode(Ready);
declnode(A)
A - идентификатор
Эквивалент описания "node* A".
Пример:
declnode(Book);
defafnode(A)
A - идентификатор
Создать новый узел в АСБД и счетчик
ссылок на него установить в
1. Указатель на него поместить в
новую переменную с иденти-
фикатором A. Эта переменная будет
иметь тип fnode*.
deffnode(A)
A - идентификатор
Создать новый узел в АСБД.
Указатель на него поместить в
новую переменную с идентификатором
A. Эта переменная будет
иметь тип fnode*.
defnode(A)
A - идентификатор
Образовать новый узел в АС и
указатель на него поместить в новую
переменную типа node* с
идентификатором A.
defnodes(A,B)
То же, что и defnode, только для двух
узлов сразу.
delattr(A,B)
delattrc(A,B,C,D)
A - node*/fnode*
B - long/char*
C - goyes/gono
D - метка перехода
Удалить атрибут B у узла A.
Пример:
atom("изобретения",Create);
delattr(Create,"двигатели");
Состояние участка сети до
выполнения операции:
| "изобретения" | ||
| * (Create) | ||
| | | ||
| | "двигатели" | ||
| \------------------> | * (узел) | |
| | | | (0) | |
| | "шасси" | \----------------> | * (узел) |
| \--------> *(узел) | | | | "фирма" |
| . | | (0) | \--------> "ferrari" |
| \----------------> | * (узел) | |
| | | | "фирма" | |
| . | | (0) | \--------> "volvo" |
| \----------------> | * (узел) | |
| | | | "фирма" | |
| . | | (0) | \--------> "reno" |
| \----------------> | * (узел) | |
| | "фирма" | ||
| . | \--------> "citroen" |
Состояние участка сети после
выполнения операции:
| "изобретения" | ||
| * (Create) | * (узел) | |
| | | | (0) | |
| | "шасси" | \----------------> | * (узел) |
| \--------> *(узел) | | | | "фирма" |
| . | | (0) | \--------> "ferrari" |
| \----------------> | * (узел) | |
| | | | "фирма" | |
| . | | (0) | \--------> "volvo" |
| \----------------> | * (узел) | |
| | | | "фирма" | |
| . | | (0) | \--------> "reno" |
| \----------------> | * (узел) | |
| | "фирма" | ||
| . | \--------> "citroen" |
| 4.1 | Интерфейсная программа TVDianet |
| 4.2 | Интерфейсная программа ClDianet |
| 4.3 | Программа создания снимка сети |
| 5.1 | Операции в сети и соответствующие им макрокоманды |
| 5.2 | Макроязык системы KorNet (часть I) |
| Макроязык системы KorNet (часть II) | |
| Макроязык системы KorNet (часть III) | |
| 5.3 | Комплектация системы |