Выделяют два типа контекстных условий:
· отношения между синтаксическими единицами в исходном тексте. Для нашего примера они могут быть следующими:
1. Каждый идентификатор, используемый в некотором присваивании должен встречаться, по крайней мере, в одном вводе или выводе.
2. Ни один идентификатор не должен встречаться одновременно и во вводе и в выводе.
3. Идентификатор, являющийся результатом не может быть входным данным.
· отношения между синтаксическими единицами исходного текста и базой сцен.
Эти условия не могут быть формализованы в синтаксисе языка.
Для обработки контекстных условий требуется некоторое множество контекстных модулей. Эти модули формулируют контекстную информацию и проверяют ее. Модуль может быть приписан к каждой синтаксической единице. Контекстные модули подключаются при синтаксическом анализе либо обрабатывают дерево синтаксического анализа.
В приведенном примере синтаксическим единицам приписываются следующие контекстные модули:
ВХДАН – синтаксические единицы входные данные со следующими контекстными модулями:
· занесение идентификатора во входной список;
· проверка, что его нет в выходном списке;
· проверка наличия идентификатора в написанной базе данных.
ВЫХДАН – выходные данные:
· занесение идентификатора в выходной список;
· проверка, что его нет во входном списке.
РЕЗУЛЬТАТ – результат выполнения выражения:
· проверка, что идентификатора нет во входном списке.
ОПЕРАНД, ВОЗВРАТ 1
· проверка, что идентификатор содержится во входном или выходном списке.
По такому же принципу как проверка контекстных условий происходит порождение сценария. В этом случае каждой синтаксической единице приписываются порождающие модули.
Пример 6:
Пусть оператор || осуществляет слияние двух отсортированных множеств в одно, а оператор: > выбирает отсортированные данные второго операнда по критерию сортировки (второй операнд). AG осуществляет объединение взятых в скобки операндов в зависимости от их свойств.
В этом случае к синтаксической единице операнд могут быть приписаны следующие модули:
Операнд ВОЗВРАТ 1 – является ли операнд уже отсортированным. Если нет, то в базе сцен ищется подходящая сцена, в сценарий добавляется соответствующий вызов модуля.
Порождение сценария определяется не только исходным текстом, но и базой сцен, которая зависит от типа задания. Задания бывают трех типов:
· белый ящик – стратегия преобразования данных описывается полностью, т.е. с заданием всех промежуточных шагов;
· черный ящик – описываются только входные данные, данные для процесса решения и требуемые выходные данные процесса решения;
· серый ящик-тип задания промежуточный между белым и черным, здесь только некоторые шаги заданы явно.