ГОСТ Р 59791—2021
В ходе соотнесения значения терминалов, переменных и функциональных терминов в правой части правила
должны быть объединены в том порядке, в котором они записаны. Полученная в результате строка должна быть
присвоена как значение переменной в левой части правила.
Условие, которое встречается в ходе импликации, представляет собой один или комбинацию нескольких
тестов на равенство или неравенство значений двух терминов. Пустой термин, записанный как пробел, имеет в
качестве значения пустую строку. Следовательно, условие (?х?= & ?у?~= ) должно быть истинным, только если ?х?
имеет пустое значение, а ?у? — не пустое.
При импликации условия для параметров if, elif и else должны оцениваться последовательно (условие else
всегда должно выполняться.) При обнаружении первого истинного условия правила перезаписи, следующие за
этим условием, будут последовательно выполняться до следующего значения elif, else или end для этого правила.
После этого выполняется правило перезаписи, которое располагается после маркера end для этого условия (если
таковое есть).
По достижении маркера end для правила трансформации выполнение правил следует прекратить. Тогда
значение функции, указанной в заголовке, должно представлять собой последовательность значений всех вы
ходных переменных. Любая выходная переменная, которой не было присвоено значение, должна иметь значение
пустой строки. Любая выходная переменная, имеющая тот же идентификатор, что и определенная переменная в
синтаксическом правиле, должна иметь значение, присвоенное ей во входной строке. В ходе соотнесения значе ния
переменных не должны изменяться после присвоения.
Согласно этой спецификации некоторые правила трансформации могут не включать правила перезаписи.
Следующее правило, например, определяет функцию идентификации, результат которой идентичен входным
данным:
identity(?s?) -> ?t?;
identity = {character} ?t?;
end;
Входная строка s анализируется на основании синтаксического правила как строка с нулем или большим
количеством символов. Эта строка присваивается
t,
т. е. результату применения функции.
Значение, присвоенное переменной в результате синтаксического анализа, всегда является одной из под
строк входных данных. За исключением функции идентичности, выходные значения, сгенерированные правилами
перезаписи для любой синтаксической категории, часто сильно отличаются от подстрок входных данных. Напри
мер, правило трансформации «egation» переводит отрицание из расширенного формата CGIF в основной:
negation(?b?) -> ?ng?;
[comment] ?cm?, CG ?x?, [endComment] ?ecm?,
?cm?, CG(?x7), ?ecm?,
negation =
?ng? =
end;
Строки для начального комментария
cm
и конечного комментария
ест
без изменений подлежат копирова
нию из входных данных в выходные. Но вложенный CG, чья входная строка х имеет расширенный формат CGIF,
сильно отличается от выходных данных основного формата CGIF CG (х). Правила трансформации для синтакси
ческих категорий расширенного формата CGIF ведут себя как компиляторы, которые переводят входные строки
из категорий расширенного формата CGIF в выходные строки основного формата CGIF.
Б.1.4.3 Функции, используемые в правилах перезаписи
Любая функция, определенная правилом трансформации, может использоваться в правиле перезаписи. Ее
можно даже рекурсивно использовать в том же правиле трансформации, которое ее содержит. В дополнение к
функциям, определенным правилами трансформации, следующие семь функций должны быть доступны при об
работке строк или последовательностей в любом правиле перезаписи:
- first(s) должна возвращать первый или единственный элемент последовательности s. Если length(s)="0",
first(s) должна быть пустой;
- gensym() должна возвращать представляющую CGname строку, которая должна отличаться от остальных
CGname в текущем тексте. При каждом вызове gensym() возвращаемая строка также должна отличаться от всех
возвращенных ранее строк;
- length(s) должна возвращать длину последовательности s в виде строки из одного или нескольких симво
лов, представляющих десятичные цифры длины. Если s пустая, length(s) должна равняться «0». Если s — одиноч
ный элемент, length(s) должна равняться «1»;
- map(f,s) должна применять функцию /ж каждому элементу последовательности s, чтобы отобразить после
довательность значений f(x) для каждого х в s;
- second(s) должна возвращать второй элемент последовательности s. Если length(s)<"2", second(s) должна
быть пустой;
- substitute^,f,x) должна возвращать результат замены строки s для каждого экземпляра строки
t
в строке х.
Если
t
отсутствует в х, substitute^,f,x) должна равняться х;
- third(s) должна возвращать третий элемент последовательности s. Если length(s)<"3", third(s) должна быть
пустой. Английская фраза «CG пате» должна
относиться ко
всем синтаксическим токенам категории «CGname».
38