ГОСТ Р 59791—2021
Б.1.4 Обозначение для правил перезаписи
Б.1.4.1 Общие положения
Синтаксис как основного (см. Б.2), так и расширенного CGIF (см. Б.З) определяется в расширенной форме
Бэкуса — Наура (EBNF), как указано в [2]. Для уточнения перевода из основного CGIF в CL в Б.2 используется ком
бинация правил EBNF и математических обозначений, дополненная английским языком. Для уточнения перевода
преобразование из расширенного CGIF в основной CGIF в Б.З используется комбинация правил EBNF из Б.1.4 и
правил перезаписи из Б.1.4.2. Правила синтаксиса в приложении Б предполагают этап лексического анализа, на
котором текст разделяется на токены в соответствии ГОСТ 33707—2016 (по лексическим токенам). Следовательно,
в любой точке, где в правиле EBNF встречается запятая, во входном тексте может встретиться ноль, один или не
сколько символов пробела.
Б.1.4.2 Правила трансформации
Каждое правило преобразования должно определять функцию, которая анализирует входную строку и воз
вращает последовательность из одной или нескольких выходных строк. Правило трансформации должно состоять из
трех частей: заголовка, синтаксического правила, определенного в Б.1.3, и нуля, одного или нескольких правил
перезаписи. Первая строка в заголовке должна содержать имя функции, которое также должно быть именем нетер
минального символа, определенного синтаксическим правилом. Заголовок также должен содержать переменную со
значением входной строки, которая будет проанализирована с помощью правила, и определять последователь
ность из одной или нескольких выходных переменных. Если входная строка была успешно проанализирована с
помощью правила от начала и до конца, применяются правила перезаписи, если таковые имеются. Ниже приве
дены синтаксические правила, определяющие синтаксис правил трансформации; в качестве начального символа
выступает transRule.
transRule
header
rewriteRule
assignment
conditional
condition
test
испытание
rewriteExpr
rewriteTerm
funTerm
= header, syntaxRule, {rewriteRule}, «end», «;»;
= nonterminal, «(«, variable, «)», «->»,
variable, {«,» variable};
= assignment | conditional;
= variable, «=», rewriteExpr, «;»;
= "if’, condition, ({rewrite rule} - empty),
{"elif", condition, ({rewrite rule} - empty)},
["else", ({rewrite rule} - empty)], "end;"
= "(", test, {"&", test},")";
= rewriteTerm,
"=", rewriteTerm;
= rewriteTerm,
"=", rewriteTerm;
= rewriteTerm {"," rewriteTerm};
= terminal | variable | funTerm;
= identifer,"(", [funTerm, {"," funTerm},")";
Следующие нетерминальные символы из [2] должны быть определены аналогично Б.1.3: syntaxRule, terminal,
nonterminal, variable, identifier, empty.
Функция, которую определяет правило трансформации, должна преобразовывать входную строку в после
довательность значений выходных переменных путем копирования подстрок из входных данных и применения
правил перезаписи для трансформации таких строк. При этом подлежит применению описанная ниже процедура.
В соответствии с правилами синтаксиса для анализа входной строки может быть использован любой алго
ритм синтаксического анализа. В начале анализа всем переменным, которые встречаются в правиле трансфор
мации, следует присвоить значение пустой строки. Хотя некоторые алгоритмы могут присваивать значения пере
менным на этапе анализа, семантика не должна содержать требований об обеспечении доступности этих значений
для применения любых правил перезаписи до тех пор, пока синтаксический анализ не будет завершен
полностью.
Любая переменная х в синтаксическом правиле должна стоять сразу после определенного термина
t
в том
же правиле. Между
t
и х не должно стоять запятых и других разделяющих символов. Значение, присвоенное х,
должно представлять собой подстроку s входной строки, сопоставленной с шаблоном, указанным
t.
Если альтерна
тивный вариант, в котором встречается
t,
не был принят, или если
t
соответствует пустой строке, значение х должно
быть пустым.
Если в параметрах импликации не пропущены одно или несколько правил перезаписи, то после заверше
ния синтаксического анализа последовательно выполняются правила перезаписи, следующие за синтаксическим
правилом.
37