Опубликован: 06.10.2011 | Доступ: свободный | Студентов: 1677 / 94 | Оценка: 4.67 / 3.67 | Длительность: 18:18:00
Лекция 3:

Описание синтаксиса

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

2.2. Продукции

Продукция определяет синтаксис одной категории. Она имеет следующую форму:

Construct\;\triangleq\;Definition

В левой части продукции задается определяемая категория, а в правой – ее определение, выраженное в терминах категорий (терминалов и нетерминалов) и ограничителей. В зависимости от формы определения различают три вида продукций: конкатенацию, выбор и повторение.

Конкатенация

Конкатенация – это продукция, перечисляющая последовательность из нуля и более категорий; они следуют в определенном порядке и некоторые из них, возможно, заключены в квадратные скобки, что и определяет их возможность отсутствия. Наша первая продукция для Conditional является таким примером:

Construct\;\triangleq\;if\;\;Then\_part\_list\;[Else\_part]\;end

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

Конкатенация просто означает связывание двух или более элементов в цепочку (catena в латыни). Это слово часто применяется в программировании. Мы говорим о конкатенации двух строк, когда вторая строка присоединяется к первой. Ее использование в БНФ немного претенциозно, поскольку можно было бы просто говорить о "последовательности". Но опять-таки в языке программирования мы уже задействовали этот термин, говоря о "последовательности операторов" – нашей первой структуре управления. Чтобы избежать недоразумений, мы используем термин "Последовательность", говоря о конструкциях Eiffel, и термин "Конкатенация", когда речь идет о БНФ-продукциях. Аналогичное различие существует между терминами "Выбор" и "Условный оператор", "Повторение" и "Цикл". Первый термин используется при описании БНФ, второй – при описании конструкций языка программирования.

Выбор

Продукция "Выбор" перечисляет одну или несколько категорий, разделенных метасимволом вертикальной черты. Вот пример определения категории Instruction (оператор):

Instruction\;\triangleq\;Conditional\;|\;Loop\;|\;Compound\;|\;Assignment\;|\;Call

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

Повторение

Продукция "Повторение" перечисляет две категории, стоящие справа от символа определения: одну нетерминальную, которую следует повторить, другую – обычно терминальную, используемую как разделитель. Для примера определим категорию Compound (составной оператор), которая задает последовательность операторов, разделенных символом точка с запятой:

Compound\;\triangleq\;\{Instruction\;";"\;\ldots\}*

Из этого определения следует, что образец составного оператора является последовательностью из нуля или более образцов операторов, каждый отделяется от следующего, если тот есть, символом "точка с запятой". В соответствии с этим правилом возможные образцы имеют вид:

  • пусто (ни одного оператора);
  • inst1
  • inst1; inst2
  • inst1; inst2; inst3
  • "и так далее".

Здесь inst1, inst2, inst3 являются образцами операторов.

Мы знаем, что в Eiffel точка с запятой, используемая в качестве разделителя, не является обязательной. Хотя это свойство может быть отражено грамматикой, более удобно правило грамматики оставить в приведенной здесь форме, дополнив его правилом, не использующим БНФ и устанавливающим безвредность пропуска разделителя.

В продукции использованы новые метасимволы, задающие повторение. Метасимвол * – символ, широко используемый в математике, означает "ноль или более раз". Метасимвол "многоточие" означает повторение элементов с разделителями, фигурные скобки используются для группировки элементов.

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

if some_condition then        [S1]
else
    instruction_1
    instruction_2
end
        
Листинг 2.S1.

Здесь пустая then-часть законна, поскольку синтаксически здесь стоит составной оператор, пустой в этом конкретном случае. Этот пример можно переписать в более понятной форме:

if not some_condition then    [S2]
    instruction_1
    instruction_2
end
        
Листинг 2.S2.

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

При определении некоторых категорий однократное присутствие образца обязательно, но возможно его повторение. В этом случае вместо метасимвола * (ноль или более) используется другой метасимвол, так же широко применяемый в математике для этих же целей, – символ + (один или более). Приведем теперь полное определение категории Conditional, включая определения входящих в нее категорий:

Conditional\;\triangleq\;if\;Then\_part\_list\;[Else\_part]\;end\\Then\_part\_list\;\triangleq\;\{Then\_part\;elseif\;\ldots\}^+\\Then\_part\;\triangleq\;Boolean\_expression\;then\;Compound\\Else\_part\;\triangleq\;else\;Compound

Продукция "Повторение", используемая в определении категории Then_part_list, показывает, что для образца категории допустимы такие формы:

cond1 then inst1
— Один образец Then_part
cond1 then inst1 elseif cond2 then inst2
— Два образца Then_part
cond1 then inst1 elseif cond2 then inst2 elseif cond3 then inst3
— Три образца Then_part
        

Пример можно продолжать, поскольку число образцов в этой конструкции может быть произвольно большим. Заметьте, что категория Then_part_list, задающая список, не может быть определена как возможно отсутствующая. В определении категории Conditional после if должна следовать хотя бы одна Then_part.

Правила грамматики

В БНФ – любом варианте – очевидное правило построения продукций состоит в том, что в правой части определения могут встречаться только ограничители, терминалы и нетерминалы. Для написания грамматики достаточно перечислить продукции, определяющие эти три множества, простыми соглашениями.

  1. Ограничители описывают себя сами с дополнительным соглашением, что ключевые слова появляются в БНФ так, как они пишутся, а специальные символы появляются в кавычках.
  2. Любой другой идентификатор, появляющийся в продукциях, обозначает категорию.
  3. Если категория появляется в левой части хотя бы одной продукции, то он относится к нетерминалам.
  4. В противном случае категория относится к терминалам. В этом случае ее определение должно появляться на лексическом уровне спецификации языка.

Случай 3 предполагает, что нетерминал может появляться в левой части более чем одной продукции. В БНФ-Е это не допускается, но разрешается для большинства вариантов БНФ, где две различные продукции, определяющие один нетерминал:

  • A\;\triangleq\;Def1
  • A\;\triangleq\;Def2

интерпретируются как одна продукция "Выбор":

A\;\triangleq\;Def1\;|\;Def2

Варианты БНФ допускают в одной продукции смешение различных механизмов определения продукций – конкатенации, выбора, повторения, как в этом примере:

A\;\triangleq\;B\;|\;C\;[D]\;\{E\;";"\;\ldots\}*

БНФ-Е отвергает такое смешение стилей.

Почувствуй методологию
БНФ-Е правило
  • Каждый нетерминал должен появляться в левой части только одной продукции, называемой определением нетерминала.
  • Каждая продукция должна быть одного вида: "Конкатенация", "Выбор" или "Повторение", следуя приведенным выше определениям.

Вышеприведенный пример определения категории А должен быть записан в БНФ-Е с использованием трех продукций:

A\;\triangleq\;B\;|\;Concat\\Concat\;\triangleq\;C\;[D]\;Repet\\Repet\;\triangleq\;\{E\;";"\;\ldots\}*

Вместе с несколькими нотационными соглашениями это правило стиля задает специфику БНФ- Е, отличающую ее от других вариантов.

При написании определений языков я обнаружил, что это правило ведет к введению дополнительных понятий – нетерминалов, таких как Concat и Repet в последнем примере, а ранее Then_part_list, что в конечном итоге позволяет выработать более понятное описание языка.

Оно также позволяет дать лучшую оценку размера языка. Если допустимо смешивать различные виды продукций в одной, то можно иметь сравнительно небольшое число продукций, создавая видимость простоты языка. Так как этого нельзя делать в БНФ-Е, то число продукций является хорошим индикатором синтаксической сложности языка.
< Лекция 2 || Лекция 3: 12345 || Лекция 4 >