Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Средства описания языков.doc
Скачиваний:
2
Добавлен:
12.08.2019
Размер:
68.61 Кб
Скачать

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

│ <цифра> │

А поскольку это означает необязательность данной альтернативы,

то после этого все пустые альтернативы удаляются, а скобки, ес-

ли они были фигурными, заменяются на квадратные скобки, как по-

казано ниже:

<имя>::=<буква>[<цифра>]

Таким образом, возможны следующие способы определения по-

нятий языка:

- перечислением возможных вариантов значения понятия;

- определением через совокупность более простых понятий;

- использованием рекурсии;

- использованием итерации.

Кроме того, как было показано, допускаются различные сочетания

перечисленных приемов, за исключением, возможно, двух послед-

них.