Опубликован: 23.07.2006 | Доступ: свободный | Студентов: 2215 / 889 | Оценка: 4.28 / 4.17 | Длительность: 21:37:00
Специальности: Системный архитектор
Лекция 4:

Теория языков

Форма Бэкуса-Наура

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

Один из наиболее распространенных способов описания синтаксиса языка - это форма Бэкуса-Наура (Backus J.W., Naur P.). Этот способ был разработан для описания Алгола-60, однако, в дальнейшем он использован для многих других языков. При записи грамматики в форме Бэкуса-Наура используются два типа объектов:

  • основные символы (или терминальные символы, в частности, ключевые слова)
  • металингвистические переменные (или нетерминальные символы), значениями которых являются цепочки основных символов описываемого языка. Металингвистические переменные изображаются словами (русскими или английскими), заключенными в угловые скобки ( <...> )
  • металингвистические связки ( ::=, | )

Пример:

<целое> ::= <целое без знака> | + <целое без знака> | - <целое без знака>
<целое без знака> ::= <цифра> | <целое без знака> <цифра>
<цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

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

Расширенная форма Бэкуса-Наура

При определении синтаксиса языков Pascal и Modula-2 Вирт использовал расширенную форму Бэкуса-Наура (EBNF):

  • Нетерминалы записываются как отдельные слова
  • Терминалы записываются в кавычках, например, " BEGIN "
  • Вертикальная черта ( | ), как и прежде, используется для определения альтернатив
  • Круглые скобки используются для группировки
  • Квадратные скобки используются для определения возможного вхождения символа или группы символов
  • Фигурные скобки используются для определения возможного повторения символа или группы символов
  • Символ равенства используется вместо символа ::=
  • Символ точка используется для обозначения конца правила
  • Комментарии заключаются между символами ( * … * )
  • \epsilon эквивалентно [ ]

Пример.

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