
- •Бэкуса-Наура формы (бнф)
- •Расширенные Бэкуса-Наура формы (рбнф)
- •Применение
- •Описание
- •Примеры конструкций
- •Описание Терминалы и нетерминалы
- •Правила
- •Выражения
- •Варианты синтаксиса
- •Примеры конструкций Формальное самоопределение рбнф
- •Число и идентификатор в рбнф
- •Рбнф и другие способы описания формальных грамматик рбнф и бнф
- •Рбнф и синтаксические диаграммы
- •Применение, достоинства и недостатки рбнф
- •Синтаксические диаграммы
Структура языка программирования
Состав языка. Обычный разговорный язык состоит из четырех основных элементов: символов, слов, словосочетаний и предложений. Язык программирования содержит подобные элементы, только слова называют элементарными конструкциями, словосочетания — выражениями, предложения — операторами. Символы, элементарные конструкции, выражения и операторы составляют иерархическую структуру, поскольку элементарные конструкции образуются из последовательности символов, выражения — это последовательность элементарных конструкций и символов, а оператор — последовательность выражений, элементарных конструкций и символов.
Описание языка есть описание четырех названных элементов. Описание символов заключается в перечислении допустимых символов языка. Под описанием элементарных конструкций понимают правила их образования. Описание выражений — это правила образования любых выражений, имеющих смысл в данном языке. Описание операторов состоит из рассмотрения всех типов операторов, допустимых в языке. Описание каждого элемента языка задастся его синтаксисом и семантикой. Синтаксические определения устанавливают правила построения элементов языка. Семантика определяет смысл и правила использования тех элементов языка, для которых были даны синтаксические определения.
Символы языка — это основные неделимые знаки, в терминах которых пишутся все тексты на языке.
Элементарные конструкции — это минимальные единицы языка, имеющие самостоятельный смысл. Они образуются из основных символов языка.
Выражение в языке программирования состоит из элементарных конструкций и символов, оно задает правило вычисления некоторого значения.
Оператор задает полное описание некоторого действия, которое необходимо выполнить. Для описания сложного действия может потребоваться группа операторов. В этом случае операторы объединяются в составной оператор, или блок.
Действия, заданные операторами, выполняются над данными. Предложения языка программирования, в которых даются сведения о типах данных, называются описаниями или неисполняемыми операторами.
Объединенная единым алгоритмом совокупность описаний и операторов образует программу на языке программирования.
Форма Бэкуса-Наура
Перейдем теперь к рассмотрению наиболее распространенных способов задания синтаксиса современных языков программирования. Естественно, наиболее часто используется какой-то вид формальных грамматик. Однако, с помощью формальной грамматики определяется только контекстно-независимая составляющая языка. Поэтому для реальных языков программирования мы не можем в общем случае сказать, что полученная с помощью такой грамматики цепочка терминалов является синтаксически правильной программой, так как правильная программа должна удовлетворять еще контекстным условиям. Один из наиболее распространенных способов описания синтаксиса языка – это форма Бэкуса-Наура (Backus J.W., Naur P.). Этот способ был разработан для описания Алгола-60, однако, в дальнейшем он использован для многих других языков. При записи грамматики в форме Бэкуса-Наура используются два типа объектов:
основные символы (или терминальные символы, в частности, ключевые слова)
металингвистические переменные (или нетерминальные символы), значениями которых являются цепочки основных символов описываемого языка. Металингвистические переменные изображаются словами (русскими или английскими), заключенными в угловые скобки (<...>)
металингвистические связки (::=, |)
Пример:
<целое>
::= <целое без знака> | + <целое без
знака> | - <целое без знака>
<целое
без знака> ::= <цифра> | <целое без
знака> <цифра>
<цифра> ::= 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Форма
Бэкуса-Наура не позволяет задавать
контекстные условия. При использовании
формы Бэкуса-Наура контекстные условия
задаются в словесной форме.
^
Расширенная форма Бэкуса-Наура
При определении синтаксиса языков Pascal и Modula-2 Вирт использовал расширенную форму Бэкуса-Наура (EBNF):
Нетерминалы записываются как отдельные слова
Терминалы записываются в кавычках, например, “BEGIN”
Вертикальная черта (|), как и прежде, используется для определения альтернатив
Круглые скобки используются для группировки
Квадратные скобки используются для определения возможного вхождения символа или группы символов
Фигурные скобки используются для определения возможного повторения символа или группы символов
Символ равенства используется вместо символа
Символ точка используется для обозначения конца правила
Комментарии заключаются между символами (* … *)
эквивалентно [ ]
Пример. ^ Integer = Sign UnsignedInteger. UnsignedInteger = digit {digit}. Sign = ["+"|"–"]. digit = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9". В 1981 году Британский институт стандартов (British Standards Institute) опубликовал стандарт EBNF. BSI стандарт получился более наглядным, чем расширенная форма Бэкуса-Наура, предложенная Виртом.
Элементы правил разделяются запятыми
Правила заканчиваются точкой с запятой
Пробелы не являются значащими
Пример. Constant Declaration = "CONST", Constant Identifier , "=", Constant Expression, ";", {Constant Identifier, "=", Constant Expression, ";"}; Constant Identifier = identifier; Constant Expression = Expression;
Бэкуса-Наура формы (бнф)
Метаязыки Хомского и Хомского-Щутценберже использовались в математической литературе при описании простых абстрактных языков. Метаязык, предложенный Бэкусом и Науром, впервые использовался для описания синтаксиса реального языка программирования Алгол 60. Наряду с новыми обозначениями метасимволов, в нем использовались содержательные обозначения нетерминалов. Это сделало описание языка нагляднее и позволило в дальнейшем широко использовать данную нотацию для описания реальных языков программирования. Были использованы следующие обозначения:
символ "::=" отделяет левую часть правила от правой;
нетерминалы обозначаются произвольной символьной строкой, заключенной в угловые скобки "<" и ">";
терминалы - это символы, используемые в описываемом языке;
каждое правило определяет порождение нескольких альтернативных цепочек, отделяемых друг от друга символом вертикальной черты "|".
Пример описания идентификатора с использованием БНФ:
<буква> :: = А|В|С|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V| W|X|Y|Z|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
<цифра> :: = 0|1|2|3|4|5|6|7|8|9
<идентификатор> ::= <буква> | <идентификатор><буква> | <идентификатор><цифра>
Правила можно задавать и раздельно:
<идентификатор> :: = <буква>
<идентификатор> :: = <идентификатор> <буква>
<идентификатор> :: = <идентификатор> <цифра>
Расширенные Бэкуса-Наура формы (рбнф)
Метаязыки, представленные выше, позволяют описывать любой синтаксис. Однако, для повышения удобства и компактности описания, целесообразно вести в язык дополнительные конструкции. В частности, специальные метасимволы были разработаны для описания необязательных цепочек, повторяющихся цепочек, обязательных альтернативных цепочек. Существуют различные расширенные формы метаязыков, незначительно отличающиеся друг от друга. Их разнообразие зачастую объясняется желанием разработчиков языков программирования по-своему описать создаваемый язык. К примерам таких широко известных метаязыков можно отнести: метаязык PL/I, метаязык Вирта, используемый при описании Модулы-2, метаязык Кернигана-Ритчи, описывающий Си. Зачастую такие языки называются расширенными формами Бэкуса-Наура (РБНФ).
В частности, РБНФ, используемые Виртом, имеют следующие особенности:
Квадратные скобки "[" и "]" означают, что заключенная в них синтаксическая конструкция может отсутствовать;
фигурные скобки "{" и "}" означают ее повторение (возможно, 0 раз);
круглые скобки "(" и ")" используются для ограничения альтернативных конструкций;
сочетание фигурных скобок и косой черты "{/" и "/}" используется для обозначения повторения один и более раз. Нетерминальные символы изображаются словами, выражающими их интуитивный смысл и написанными на русском языке.
Если нетерминал состоит из нескольких смысловых слов, то они должны быть написаны слитно. В этом случае для повышения удобства в восприятии фразы целесообразно каждое ее слово начинать с заглавной буквы или разделять слова во фразах символом подчеркивания. Терминальные символы изображаются словами, написанными буквами латинского алфавита (зарезервированные слова) или цепочками знаков, заключенными в кавычки. Синтаксическим правилам предшествует знак "$" в начале строки. Каждое правило оканчивается знаком "." (точка). Левая часть правила отделяется от правой знаком "=" (равно), а альтернативы - вертикальной чертой "|". Этот вариант РБНФ и будет использоваться для описания синтаксиса языков в лабораторной работе. В соответствии с данными правилами синтаксис идентификатора будет выглядеть следующим образом:
$ буква = "A"|"B"|"C"|"D"|"E"|"F"|"G"|"H"|"I"|"J"|"K"|"L"|"M"|"N"|"O"|"P"|"Q"|"R"| "S"|"T"|"U"|"V"|"W"|"X"|"Y"|"Z"|"a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|"i"|"j"|"k"|"l"|"m"|"n"| "o"|"p"|"q"|"r"|"s"|"t"|"u"|"v"|"w"|"x"|"y"|"z".
$ цифра = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9".
$ идентификатор = буква {буква | цифра}.
Форма Бэкуса—Наура (сокр. БНФ, Бэкуса—Наура форма) — формальная система описания синтаксиса, в которой одни синтаксические категории последовательно определяются через другие категории. БНФ используется для описания контекстно-свободных формальных грамматик.
Содержание
|