Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

XVYggbpFw2

.pdf
Скачиваний:
2
Добавлен:
15.04.2023
Размер:
2.31 Mб
Скачать

L = {anbn | n 0 }

В соответствии с классификацией грамматик классифицируются и языки. Например, язык называется контекстно-свободным (КС-языком), если он определяется какой-то КС-грамматикой, язык называется регулярным, если он определяется какой-то регулярной грамматикой.

3. ПРЕДСТАВЛЕНИЕ О НАЗНАЧЕНИИ И СТРУКТУРЕ ЯЗЫКА БЭКУСА-НАУРА

Чтобы описать алгоритм трансляции какого-то языка (например, языка программирования высокого уровня Паскаль), прежде всего надо строго определить, что именно подается на вход транслятора.

Речь идет о языке, посредством которого можно описать язык программирования. Обычного русского языка тут не хватает, т.к. он оказывается слишком многозначным. В сложных ситуациях, как не старайся определить все тонкости и конструкции, все равно остаются двусмысленные или неоговоренные места. Языки для описания языков естественно называть метаязыками (надязыками). Нужда в трансляторах вызывает нужду в этих метаязыках, как средстве совершенно точного описания языка программирования.

В данном параграфе дается представление об одном из важнейших метаязыков этой области – так называемой Форме Бэкуса-Наура (БНФ). Фрагментарно этот язык знаком каждому программисту по отрывкам спецификаций (описаний) различных программ и синтакcических конструкций. Например в системе помощи Borland C++ Builder для ключевого слова __property без труда найдем:

<property declaration> ::=

__property <type> <id> [ <prop dim list> ] = "{" <prop attrib

list> "}"

<prop dim list> ::= "[" <type> [ <id> ] "]" [ <prop dim list> ] <prop attrib list> ::= <prop attrib> [ , <prop attrib list> ]

<prop attrib> ::=

read = <data/function id>

<prop attrib> ::=

write = <data/function id>

<prop attrib> ::=

stored = <data/function id>

<prop attrib> ::=

stored = <boolean constant>

<prop attrib> ::=

default = <constant>

<prop attrib> ::=

nodefault

<prop attrib> ::=

index = <const int expression>

Конечно, подобное описание того, что такое __property (свойство) неподготовленному человеку ничего не говорит. Но если сказать, что __property - это такая своеобразная синтаксичечкая конструкция внутри описания класса, которая, как правило, объединяет пару методов этого класса, например в виде:

__property TColor ColorLine={read = GetColorLine ,write = SetColorLine};

то уже можно кое о чем догадаться.

Например, <type> - это какой-то тип языка (базовый или определенный программистом). Вообще, выражение в скобках <> означает некую

сущность – смысловую едининицу БНФ. Внутри скобок можно писать все, что угодно. Это будет просто пояснением для человека. Так <data/function id> обозначает данное класса или метод класса.

Символ ::= можно на человеческий язык перевести как “это”. Квадратные скобки [ и ] заключают в себя необязательную часть –

может быть, а может и не быть. Это не касается "[" или "]" – тут скобки обозначают самих себя.

Фигурные скобки { и } заключают в себя фрагмент, который можно повторять сколько угодно раз или вообще не использовать.

Все, что в указанные скобки не входит – это литеры, которые пишутся как есть.

Язык Бэкуса-Наура использует еще один символ, о котором пока не говорилось. Это знак “|”, означающий союз “или”. Как правило он используется для того, чтобы несколько высказываний вида

<Объект>::=Определение1 <Объект>::=Определение2 <Объект>::=Определение3

Заменить одним <Объект>::=Определение1| Определение2| Определение3

Но его можно использовать также внутри квадратных или фигурных скобок. Например,

<Буква> ::= a|b|c|…|z|_|A|B|C|…|Z <Цифра> ::= 0|1|2|3|4|5|6|7|8|9

<Идентификатор> ::= <Буква>{<Цифра>|<Буква>}

Таким образом язык Бэкуса-Наура представляет собой ряд высказываний вида

<Объект> ::= Определение объекта

Если у нас есть описание на БНФ, допустим, языка Паскаль и надо доказать, что какая-то последовательность литер является правильно написанной программой, то мы должны суметь “логически” вывести этот факт из утверждений описания.

Например, цепочка литер _aa2 является идентификатором потому,

что

<Идентификатор> ::= <Буква>{<Цифра>|<Буква>} => <Идентификатор> ::= <Буква><Буква><Буква><Цифра> =>

_aa2 – это <Идентификатор>

Что собственно за логика здесь используется? Просто подстановки. Раз есть правила

<Буква> ::= _

<Буква> ::= a <Цифра> ::= 2

<Идентификатор> ::= <Буква><Буква><Буква><Цифра>, То заменив в последнем утверждении <Буква><Буква><Буква> на

_aa, а <Цифра> - на 2, получим, что _aa2 – также <Идентификатор>. С точки зрения строгой логики каждое высказывание БНФ вида

<Объект> ::= Определение

надо понимать как суждение “Любое выражение вида “Определение” принадлежит классу выражений, поименованных как Объект”.

Какая связь между языком Бэкуса-Наура и грамматиками из предыдущего параграфа? Самая непосредственная. БНФ – это то же самое, что контекстно-свободная грамматика (тип 2). Точнее, КС-грамматика – это строгая математическая модель языка Бэкуса-Наура.

Слова вида <Понятие> в БНФ играют роль нетерминалов. Литеры – это терминалы. Значок “::=” – это “ ”.

Конструкция с квадратными скобками, например [B] может быть с помощью добавления для нее нового нетерминала C переделана в обычную: всюду [B] заменим на C, и добавим правила:

C B C

Конструкция с фигурными скобками, например {B}, может быть с помощью добавления нового нетерминала C переделана в обычную: всюду {B} заменим на C, и добавим правила:

C

B

C

CB

C

 

Таким образом грамматики класса 2 (контекстно-свободные, КСграмматики) будут играть главную роль в дальнейшем изложении. Центральным объектом при рассмотрении любой грамматики является порожденный ею язык. Он в определенном смысле более важен, чем грамматика. Грамматика существует для обслуживания языка. Но она не всегда устроена так, что с ней удобно работать. Поэтому важное значение имеют способы преобразования грамматик в эквивалентные (т.е. с тем же языком), но более удобные формы.

Упражнения

3.1.Алфавит исчисления высказываний (ИВ) состоит из символов:

X,|,&, , , ,(,). Слова X, X|, X||,… называются переменными и обозначаются как X0, X1, X2,… . Формула ИВ – это слово, которое может быть построено по правилам: 1) любая переменная

есть формула; 2) если слова ,- формулы, то слова ( & ), ( ), ( ) – формулы; 3) если слово - формула, то слово

- формула.

Написать в нотации БНФ определение формулы исчисления высказываний.

3.2.Числа с плавающей запятой – это числа вида ±67,4555e±457, что означает ±67,4555∙10±457 . Написать в нотации БНФ определение всех таких чисел.

3.3.На языке Бэкуса-Наура определить множество натуральных чисел как цепочек знаков {0,1,...,9}, у которых первый знак – не ноль.

3.4.На языке Бэкуса-Наура определить множество целых чисел как цепочек знаков {-,0,1,...,9}, с естественными ограничениями. Например, 00, 01, -023 – неправильные.

4. ИСКЛЮЧЕНИЕ БЕСПОЛЕЗНЫХ СИМВОЛОВ

Определение 4.1. Пусть дана произвольная КС-грамматика G. Нетерминал A этой грамматики называется продуктивным, если существует такая терминальная цепочка (возможно пустая), что A .. В

противном случае нетерминал называется непродуктивным.

Теорема 4.1. Каждая КС-грамматика эквивалентна КСграмматике без непродуктивных нетерминалов.

Доказательство. Пусть G – произвольная КС-грамматика. Приведение грамматики к нужному виду делается вычислением множества всех непродуктивных нетерминалов и последующим выкидыванием всех правил, в которых встречаются такие нетерминалы.

Но сначала надо вычислить продуктивные нетерминалы. Для этого составляется их список, расширяющийся в процессе вычисления. На первом шаге в список заносим все такие нетерминалы A, что в правилах G

есть продукция вида A

, где - терминальная цепочка. Ясно,

что все

они продуктивны.

 

 

Допустим теперь, что в правилах G есть продукция вида A

и все

нетерминалы, которые встречаются в цепочке , занесены в уже построенный список. Тогда и нетерминал A добавляем в список. Он, очевидно, также будет продуктивным.

Процесс повторяется после каждого расширения списка. Когда новые нетерминалы перестанут добавляться, построение заканчивается.

Легко показать, что все нетерминалы, не попавшие в список, являются непродуктивными. Очевидно и то, что в выводе терминальной цепочки не может быть слова с непродуктивными нетерминалами. Поэтому, если из грамматики выкинуть все правила, у которых в правой или левой части имеются непродуктивные нетерминалы, полученная грамматика будет эквивалентна исходной. Она и будет искомой.

Определение 4.2. Нетерминал A грамматики G называется достижимым, если существует такая цепочка , содержащая A, что S . В противном случае нетерминал называется недостижимым.

Теорема 4.2. Каждая КС-грамматика эквивалентна КСграмматике без недостижимых нетерминалов.

Доказательство. Подобно рассуждению в доказательстве предыдущей теоремы, приведение грамматики к нужному виду делается вычисле-

нием множества всех недостижимых нетерминалов и последующим выкидыванием всех правил, в которых встречаются такие нетерминалы.

Но сначала вычисляются достижимые нетерминалы. Для этого составляется их список, расширяющийся в процессе вычисления. На первом шаге в список заносим Стартовый нетерминал S. Он, понятно, достижим.

Допустим теперь, что в правилах G есть продукция вида Aи нетерминал A занесен в уже построенный список. Тогда и к списку добавляем все нетерминалы, имеющиеся в записи слова . Они, очевидно, также будут достижимыми.

Процесс повторяется после каждого расширения списка. Когда новые нетерминалы перестанут добавляться, построение заканчивается.

Легко показать, что все нетерминалы, не попавшие в список, являются недостижимыми. Очевидно и то, что в выводе терминальной цепочки не может быть слова с недостижимым нетерминалом. Поэтому, если из грамматики выкинуть все правила, у которых в правой или левой части имеются недостижимые нетерминалы, полученная грамматика будет эквивалентна исходной. Она и будет искомой.

Нетерминальный символ в КС-грамматике называется бесполезным (или лишним), если он либо недостижим, либо непродуктивен.

Теорема 4.3. Каждая КС-грамматика эквивалентна КСграмматике, в которой нет бесполезных нетерминалов.

Доказательство. По предыдущим теоремам мы можем вычислить непродуктивные нетерминалы и выкинуть, содержащие их правила. В новой грамматике можно вычислить недостижимые нетерминалы и опять выкинуть содержащие их правила. Этот процесс можно повторить несколько раз, пока все нетерминалы станут одновременно и продуктивными и достижимыми. В результате и получится требуемый результат.

Пример. Устраним бесполезные символы в грамматике

S aC | A; A cAB; B b ; C a .

Шаг 1. Строим множество достижимых символов: {S} {S, C, A} {S, C, A, B}. Все нетерминалы достижимы. Недостижимых нет грамматика не меняется.

Шаг 2. Строим множество продуктивных символов: { C, B} {S, C, B}. Получаем, что A— не продуктивен. Выкидываем его и все правила с ним из грамматики. Получим

S aC ; B b ; C a .

Шаг 3. Строим множество достижимых символов новой грамматики: {S} {S, C}. Получаем, что B недостижим. Выкидываем его и все правила с

ним из грамматики. Получим

S aC ; C a .

Это — окончательный результат.

Упражнения

4.1.Доказать, что если для данной КС-грамматики сделать следующие два шага:

1)исключить непродуктивные нетерминалы;

2)исключить недостижимые нетерминалы;

то в результате сразу получится грамматика, в которой нет бесполезных нетерминалов.

Указание. Будем говорить, что нетерминал B достижим из нетерминала A, если существует такая цепочка , содержащая B, что A . Надо

доказать, что отношение “B достижим из A” транзитивно и воспользоваться этим обстоятельством.

4.2.Исключить бесполезные нетерминалы следующих грамматик:

a)S SccDb|a|C|bCGb A bFcG

B dEGB|S C

D BF E

F c|dDA|S|cCaaa G cG

b)S bb|ABcS|GCFd A bAFA

B G|c| |EA C ac

D daACD|ad E cSaF

F

G EacBc| |ca|dC

c)S Da|cScA|aFC|EBA A GSA

B

C a|dGbCa| D b| |DCcb E cACB

F AEB|c|A G

d)S EScB|AdScc| A Ba|a|EcAaS

B DAACB

C|CGF|a|EGF

DC

ESFDS

FESG

G|CA

5. -СВОБОДНЫЕ ГРАММАТИКИ

Лемма 5.1. Пусть G - контекстно-свободная грамматика и пусть в G выводимо A для некоторых нетерминала A и цепочки . Тогда

добавление к правилам грамматики G еще одного правила A никак не изменит языка грамматики.

Доказательство. Лемма очевидна.

Определение 5.1. Грамматика G называется –свободной, если она либо не содержит правил, либо содержит единственное правило S , причем в этом последнем случае любая непустая цепочка из языка G может быть выведена без использования этого –правила.

Теорема 5.1. Любая КС-грамматика эквивалентна некоторой – свободной КСграмматике.

Доказательство. Пусть G – произвольная КС-грамматика. Допустим, что среди правил G содержатся правила вида A . Добавим к правилам G любое правило, которое можно получить из имеющегося B зачеркиванием в одного из нетерминалов A. В результате получится новая грамматика, из которой, тем не менее, выводятся те же самые терминальные цепочки. К полученной грамматике применяется та же самая процедура. Это повторение делается до тех пор, пока не перестанут появляться новые правила. Это рано или поздно произойдет, т.к. возможно только конечное число вариантов для добавляемых правил. Полученная грамматика, очевидно, эквивалентна G и именно ее мы далее обозначаем

этой буквой G. Искомая G1

получается вычеркиванием из G всех правил

кроме правила S

(если оно там встречается).

 

 

 

Докажем, что G и G1

эквивалентны и что G1 является –свободной.

Допустим, что

L(G) и рассмотрим самый короткий вывод этой цепоч-

ки с помощью таким образом расширенного множества продукций.

 

 

 

 

S

 

 

 

 

 

Допустим, что в выводе использовалось какое-то

правило A

.

 

S

 

1 A 2

1

2

 

 

Проследим момент появления символа A. Если только 1 A 2

не есть

начальное слово S, то

 

 

 

 

 

 

 

 

S

 

1A 2

1A 2

1 2

 

Здесь 1

1 и

2

 

2, а слово

1A 2 образовалось применени-

ем какой-то продукции B

,

содержащей в правой части нетерминал A.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]