1.2. Описание входного языка транслятора

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

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

Исторически первым метасинтаксическим языком, который использовался на практике для описания синтаксиса языков программирования (в частности Алгола-60), являются нормальные формы Бэкуса, сокращенно обозначают БНФ – бэкусова нормальная форма или бэкусо-науровская форма. Основное назначение форм Бэкуса состоит в представлении в сжатом и компактном виде строго формальных и однозначных правил написания основных конструкций описываемого языка программирования.

Формальное определение синтаксиса языка программирования обычно называется грамматикой.

В форме Бэкуса описываются два класса объектов:

• во-первых, основные символы языка программирования,

• во-вторых, имена конструкций описываемого языка, или, так называемые, металингвистические переменные.

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

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

• Далее следует металингвистическая связка ::=, означающая «определяется как» или «есть».

• В правой части формулы указывается один или несколько вариантов построения конструкции, определяемой в левой части. Для построения конструкции, которая определяется формулой, нужно выбрать некоторый вариант ее построения из правой части формулы и подставить вместо каждой металингвистической переменной некоторые цепочки основных символов. Варианты правой части формулы разделяются металингвистической связкой |, имеющей смысл «или».

Сами металингвистические переменные обозначаются словами, поясняющими смысл описываемой конструкции, и заключаются в угловые скобки < >.

В качестве примера БНФ приведем определение десятичного целого числа:

1) < десятичное целое число > ::= < число без знака > |

+ < число без знака > | — < число без знака >

2) < число без знака > ::= < цифра > | < число без знака > < цифра >

3) < цифра > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 .

Например, число +294 выводится по формулам следующим образом:

< десятичное целое число >,

+ < число без знака >,

+ < число без знака > < цифра >,

+ < число без знака > 4

+ < число без знака > < цифра > 4,

+ < число без знака > 94,

+ < цифра > 94,

+ 294.

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

На практике для описания синтаксиса языков программирования применяются и другие металингвистические языки. Одна из целей их использования – устранить некоторую неестественность представления в БНФ общих синтаксических конструкций для необязательных, альтернативных и повторяющихся элементов правил. Так, для описания синтаксиса таких языков, как КОБОЛ и ПЛ/1, использовалась следующая нотация, являющаяся расширением БНФ:

· Необязательный элемент внутри правила заключается в квадратные скобки […].

· Альтернативные элементы обозначаются вертикальным списком, заключенным в фигурные скобки {…}.

· Необязательные альтернативные варианты обозначаются вертикальным списком вариантов, заключенным в квадратные скобки […].

· Повторяющийся элемент обозначается списком из одного элемента (заключенного, если это необходимо, в фигурные или квадратные скобки) со следующим за ним обычным многоточием…

· Обязательные ключевые слова подчеркиваются, а необязательные шумовые слова – нет.

Приводимое ранее описание БНФ десятичного числа в данной нотации будет иметь вид:

Такое описание более компактно и естественно. Однако оба описания эквивалентны, т.е. любое правило, записанное на этом языке, может быть однозначно представлено в виде одной или нескольких форм Бэкуса, и наоборот.

Формы Бэкуса представляют более формальное описание языка. Они позволили внедрить математические средства для системного описания и исследования языков программирования, использование математического аппарата как основы для синтаксического анализа в трансляторах.

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