
Лекция № 7
Формы Бэкуса Наура.
Формы Бэкуса Наура (БНФ) являются языком для выражения синтаксиса других языков. Для того, что ввести БНФ, воспользуемся описанием цифр, констант и упрощенных арифметических выражений.
То, что единица является цифрой, выражается в БНФ следующим образом:
< цифра > :: =1 (*)
Чтобы отметить, что понятие цифра не может встречаться в предложениях описываемого языка, а используется лишь для того, чтобы понять, описать эти предложения, это понятие заключается в угловые скобки ‘< … >’. Такое понятие является синтаксическим и называется нетерминалом (нетерминальным символом). Символ, который может встречаться в предложениях описываемого языка, называется терминалом (терминальным символом). Запись (*) называется продукцией или правилом (заменой). Левая часть правила – нетерминальный символ, а правая часть – непустая конечная цепочка нетерминальных и/или терминальных символов.
Символ ‘ ::= ’ читается как «может состоять из».
Если понятие, выраженное нетерминальными символами, включает набор терминальных символов, то используется символ ‘ | ’, который читается как «или».
Полное описание понятия «цифра» будет выглядеть следующим образом:
< цифра > :: = 0 |1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ,
т.е. нетерминальный символ выражен через все терминальные символы.
Введем понятие константы целого типа. Константа целого типа – это конечная последовательность не менее чем из одной цифры.
Тогда константы целого типа могут быть следующим образом рекурсивно определены:
< константа > :: = < цифра >
< константа > :: = < константа > < цифра >
< цифра > :: = 0 |1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Приведенное правило образует грамматику для языка констант.
Предложениями этого языка являются те последовательности терминальных символов, которые могут быть выделены из нетерминальных символов. Вывод производится следующим образом: начинаем с последовательности, состоящей из нетерминального символа, последовательно заменяем один из нетерминальных символов текущей последовательности на соответствующую правую часть правила до тех пор, пока не получается последовательность, состоящая лишь из терминальных символов в предложении.
Например, выведем предложение «325»:
< константа > => < константа > < цифра > => < константа > 5 =>
=> < константа > < цифра > 5 => < константа > 25 => 325
Символ ‘=>’ обозначает одну замену, непосредственный вывод.
Грамматика упрощенных арифметических выражений:
< выражение > :: = < выражение > + < выражение >
< выражение > :: = < выражение > - < выражение >
< выражение > :: = < выражение > * < выражение >
< выражение > :: = (< выражение >)
< выражение > :: = < константа >
< константа > :: = < цифра >
< константа > :: = < константа > < цифра >
< цифра > :: = 0 |1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Пример: представление предложения (1+2)*4 методом выбора:
< выражение > => < выражение > * < выражение > => ( < выражение >) * < выражение > => ( < выражение > + < выражение > ) * < выражение > => ( < константа > + < выражение > ) * < выражение > => ( < цифра > + < выражение > ) * < выражение > => ( 1 + < выражение > ) * < выражение > => ( 1 + < константа > ) * < выражение > => ( 1 + < цифра >) * < выражение > => ( 1 + 2 ) * < выражение > => ( 1 + 2 ) * < константа > => ( 1 + 2 ) * < цифра > => ( 1 + 2 ) * 4
Замена может производиться, начиная либо с последнего нетерминала, либо с первого, и так до получения терминала, но с учетом того, что в каждой итерации выполняется только одна замена.
Дерево разбора.



< выражение >
< выражение > * < выражение >
( < выражение > ) < константа >


< выражение > + < выражение > < цифра >
< константа > < константа > 4
< цифра > < цифра >
1 2
Это дерево соответствует тем правилам замены, которые исполнялись ранее (см. пример выше). Каждая ветка дерева разбора продолжается до тех пор, пока не закончится терминальным символом.
Главное различие между выбором и деревом разбора в том, что дерево разбора не фиксирует порядка, в котором были сделаны некоторые шаги выводов. Выводы, соответствующие одному дереву разбора, считаются эквивалентными.
Для грамматики упрощенных арифметических выражений появляется следующая опасность:
Пример: < выражение > => < выражение > + < выражение > * < выражение >
< выражение >



< выражение > + < выражение >


< выражение > * < выражение >
или
< выражение >
< выражение > * < выражение >
< выражение > + < выражение >
Грамматика, в которой имеется более одного дерева разбора для некоторого предложения, называется неоднозначной.
Можно написать однозначную грамматику, в которой говорится, что умножение имеет приоритет над сложением (кроме того случая, когда для преодоления приоритет используются скобки). Для этого вводятся нетерминальные символы <слагаемое> и <множитель>:
<выражение>::=<слагаемое> | <выражение> + <слагаемое> | <выражение>- <слагаемое>
<слагаемое>::=<множитель> | <слагаемое>*<множитель>
<множитель>::== < константа > | (< выражение >)
< константа > :: = < константа > < цифра >
< цифра > :: = 0 |1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Также для БНФ вводятся фигурные скобки ‘{…}’ для облегчения понимания и записи.