5, Также как и вторая цифра, записывается за уже имеющимся чис-
лом 79, т.е. по только что полученному правилу. Очевидно, что
применение этого правила можно продолжать дальше, например, для
получения числа 7952 из числа 795 и т.д.
Таким образом, начинать запись числа необходимо по первому
правилу, а продолжать - по второму. Если оба правила объединить
в одно, то получим:
- 5 -
<целое положительное число>::=<десятичная цифра>│
<целое положительное число><десятичная цифра>
Здесь мы использовали известные значения определяемого по-
нятия для получения его новых значений. Поэтому название опре-
деляемого понятия одновременно присутствует как в левой, так и
в правой частях правила. Такие правила и даваемые ими определе-
ния называются рекурсивными.
Известные значения определяемого понятия можно использо-
вать и по-другому, достраивая их не справа, а слева. При этом,
формирование числа в нашем примере будет начинатья с последней
цифры:
5 --> 95 --> 795
а соответствующее рекурсивное правило примет вид:
<целое положительное число>::=<десятичная цифра>│
<десятичная цифра><целое положительное число>
Таким образом, для определения цепочек переменной длины
необходимо использовать рекурсивные правила. Они могут строить-
ся по одной из схем:
= <Y> ::= <X > │ <Y><X>
- 0
или
= <Y> ::= <X > │ <X><Y>
- 0
=где <X > - "базовое понятие", значения которого всегда входят в
- 0
определяемое понятие, а <X> - понятие, значения которого допи-
сываются справа или слева от предыдущего значения понятия <Y>
при очередном применении правила.
В зависимости от положения определяемого понятия в альтер-
нативе правой части правила различают левую и правую рекурсию.
Так, правило
= <Y> ::= <X > │ <Y><X>
- 0
является леворекурсивным и определяет цепочку, растущую вправо,
а правило
= <Y> ::= <X > │ <X><Y>
- 0
является праворекурсивным и определяет цепочку, растущую влево.
Альтернативы в правой части правила можно менять местами:
совокупность значений, определяемых правилом, от этого не изме-
няется. Действительно, перестановка местами альтернатив в пра-
- 6 -
вой части правила для определения целого положительного числа
ничего не изменит, поскольку применение правила может начинать-
ся только с альтернативы <десятичная цифра>, а продолжаться
только по альтернативе <целое положительное число><десятичная
цифра>. В то же время перестановки внутри одной альтернативы
могут оказаться недопустимыми (например, в рассматриваемом пра-
виле приведут к изменению левой рекурсии на правую).
Поскольку использование рекурсивных правил вызывает труд-
ности при анализе синтаксической правильности предложений язы-
ка, рекурсию часто заменяют итерацией, т.е. явным указанием
повторения некоторой компоненты определяемой конструкции. Для
этого повторяющийся фрагмент правой части правила заключают в
фигурные "{ }" или квадратные "[ ] " скобки и ставят знак мно-
готочия "...". Причем, фигурные скобки указывают на обязатель-
ное использование заключенного в них фрагмента, квадратные
скобки - необязательное. В результате получается метаязык, час-
то называемый расширенным метаязыком БНФ.
С учетом сказанного, правило для определения целого поло-
жительного числа примет вид:
<целое положительное число>::=
<десятичная цифра>[<десятичная цифра>]...
Вообще же, соответствие между правилами для определения
одного и того же понятия с использованием рекурсии и итерации
следующее:
= <Y> ::= <X > │ <Y><X> <==> <Y> ::= <X >[<X>]...
- 0 0
= <Y> ::= <X > │ <X><Y> <==> <Y> ::= [<X>]...<X >
- 0 0
Добавление скобок вносит некоторую избыточность в метая-
зык, что используется для другой формы указания альтернатив,
заключающейся в записи альтернатив внутри квадратных или фигур-
ных скобок в столбик без разделяющих знаков "│". Например, пра-
вило для имени языка Бейсик может быть переписано в следующем
виде:
Ш1
│ <буква> │
<имя>::=
│ <буква><цифра> │
Ш1.5
Кроме того, появляется возможность выносить общие части альтер-
натив за скобки, причем, если некоторая альтернатива полностью
выносится за скобки, то вместо нее необходимо записать <пусто>:
- 7 -
Ш1
│ <пусто> │
<имя>::= <буква>
Ш1.5
│ <цифра> │
А поскольку это означает необязательность данной альтернативы,
то после этого все пустые альтернативы удаляются, а скобки, ес-
ли они были фигурными, заменяются на квадратные скобки, как по-
казано ниже:
<имя>::=<буква>[<цифра>]
Таким образом, возможны следующие способы определения по-
нятий языка:
- перечислением возможных вариантов значения понятия;
- определением через совокупность более простых понятий;
- использованием рекурсии;
- использованием итерации.
Кроме того, как было показано, допускаются различные сочетания
перечисленных приемов, за исключением, возможно, двух послед-
них.
