Теория языков
Форма Бэкуса-Наура
Перейдем теперь к рассмотрению наиболее распространенных способов задания синтаксиса современных языков программирования. Естественно, наиболее часто используется какой-то вид формальных грамматик. Однако, с помощью формальной грамматики определяется только контекстно-независимая составляющая языка. Поэтому для реальных языков программирования мы не можем в общем случае сказать, что полученная с помощью такой грамматики цепочка терминалов является синтаксически правильной программой, так как правильная программа должна удовлетворять еще контекстным условиям.
Один из наиболее распространенных способов описания синтаксиса языка - это форма Бэкуса-Наура (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-х годов при разработке языка Algol 68 была предложена новая форма определения языка, позволяющая формулировать не только контекстно-свободный синтаксис, но и контекстные условия. Такой способ определения языка получил название грамматики ван Вейнгаардена. Основная идея заключается в том, что это так называемая двухуровневая грамматика. Синтаксис действует следующим образом: заданы множества "гиперправил" и "метаправил", из которых могут выводиться "порождающие правила". Гиперправила - это просто "заготовки" правил. С помощью метаправил задается контекстная составляющая языка.
Пример. Рассмотрим правило, определяющее присваивание.
REF to MODE NEST assignation: REF to MODE NEST destination, becomes token, MODE NEST source.
Большими буквами в этом правиле написаны метасимволы. Метасимволы REF и MODE задают тип (или, как принято говорить, вид) конструкции, причем метасимвол REF означает, что получатель присваивания (destination) должен быть переменной типа MODE . Метасимвол NEST задает контекст конструкции. Обратите внимание, что контекст получателя и источника присваивания совпадают. Из этого правила может быть выведено, например, порождающее правило:
reference to real assignation: reference to real destination, becomes token, real source
Графическое представление
Совершенно иной способ представления синтаксиса - это графическое представление . Такое представление известно как синтаксические диаграммы (syntax diagrams) или синтаксические схемы (syntax charts). Они использовались для определения синтаксиса языков Pascal, Modula-2. Они имеют форму блок-схем (flow diagram).
Пример.
Часто вместо таких синтаксических диаграмм используются другие, в которых терминалы записываются в кружочках, а нетерминалы - в прямоугольниках. Такие синтаксические диаграммы, действительно, похожи на блок-схемы.
Пример.
Литература к лекции
- А. Ахо, Дж. Ульман "Теория синтаксического анализа, перевода и компиляции", Т.1 "Синтаксический анализ", М.: Мир, 1978
- Р. Хантер "Проектирование и конструирование компиляторов", ФиС, 1984