Лабораторная работа N2
Средства описания алгоритмических языков
Цель работы: Ознакомление с методами описания алгоритми-
ческих языков. Приобретение навыков использо-
вания грамматик в форме метаформул БНФ и син-
таксических диаграмм для порождения и
распознавания конструкций алгоритмических
языков.
1. Теоретическое введение
Каждый алгоритмический язык включает три составляющие: ал-
фавит, синтаксис и семантику.
_Алфавит . - это фиксированный для данного языка набор основ-
ных символов, т.е. "букв алфавита", из которого должен состоять
любой текст на этом языке - никакие другие символы не допуска-
ются.
_Синтаксис . определяет состав допустимых конструций языка и
форму их сочетаний при записи алгоритма решения задачи.
_Семантика . - система правил, приписывающих конструкциям
языка определенный смысл.
Для описания алгоритмического языка, в свою очередь, тре-
буется некоторый дополнительный "надъязык". Таким языком мог бы
служить естественный (русский) язык. Однако, его удается ис-
пользовать только для описания семантики языка. Для описания же
синтакса естественный язык не подходит, поскольку не обеспечи-
вает однозначного толкования определяемых понятий алгоритмичес-
кого языка. Поэтому, для строгого и точного описании синтаксиса
алгоритмических языков используются специальные формальные язы-
ки, называемые _метаязыками ..
Описание синтаксиса представляет собой набор определений
всех понятий языка, которые могут приводиться как в аналитичес-
кой, так и в графической формах.
- 2 -
1.1. Аналитический метаязык
Из аналитических метаязыков наиболее распрастранен язык,
предложенный Бэкусом и Науром. На нем каждое понятие определя-
ется с помощью правила, имеющего вид
< Y > ::= X
В левой части правила в угловых скобках указывается название
определяемого понятия Y. Далее ставится знак "::=", означающий
"по определению есть", и, наконец, записывается само определе-
ние X в виде совокупности возможных символов языка и названий
более простых понятий. Предполагается, что символы "<", ">" и
"::=" не принадлежат алфавиту определяемого языка, т.е. являют-
ся метасимволами.
Поскольку такие определения понятий напоминают математи-
ческие формулы, то правила также называют металингвистическими
формулами, а метаязык - языком металингвистических формул Бэку-
са-Наура (БНФ). При такой интерпретации правил определяемые по-
нятия рассматриваются как металингвистические переменные, а
правые части правил - как описание множества принимаемых ими
значений. Кроме переменных в метаязыке имеются и металингвисти-
ческие константы, в качестве которых выступают буквы алфавита и
составленные из них конкретные слова.
В простейшем случае метапеременную, также как и в матема-
тике, можно определить перечислением возможных ее "значений".
На языке БНФ эти "значения", называемые также альтернативами,
записывают в правой части правила, разделяя метасимволами "│",
означающими "или". Так, понятие "десятичная цифра" можно опре-
делить следующим образом:
<десятичная цифра>::=0│1│2│3│4│5│6│7│8│9
В данном случае 0,1,...,9 есть "значения" понятия "десятичная
цифра". Аналогично, правило
<буква>::=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
означает, что понятие "буква" может принимать 26 различных зна-
чений, каждым из которых является заглавная буква латинского
алфавита.
Может показаться, что с помощью перечисления определяются
только односимвольные конструкции языка. Очевидно, что это не-
верно, поскольку в правой части правила перечисляются варианты
- 3 -
значения понятия, т.е. металингвистические константы, к кото-
рым, в частности, относятся и слова языка, составленные из букв
алфавита. Для примера приведем определение знака отношения, ис-
пользуемое в языках программирования
<знак отношения>::=<│>│=│<=│>=│<>
В этом определении три последних знака двухсимвольные, так как
на клавиатуре дисплея ПЭВМ отсутствуют соответствующие матема-
тические знаки. По той же причине односимвольные математические
знаки логических операций в языках программирования переопреде-
ляются как следующие слова
<знак логической операции>::=not│and│or
Кроме констант в правой части можно записывать и перемен-
ные, т.е. ранее определенные понятия, как в следующем правиле
для шестнадцатеричной цифры:
<шестнадцатеричная цифра>::=<десятичная цифра>│A│B│C│D│E│F
Очевидно, прием перечисления полезен для определения лишь
простейших понятий языка. Далее, приняв их в качестве первич-
ных, необходимо определить более сложные понятия, через них
следующие и т.д.
Одним из способов определения новой конструкции языка яв-
ляется представление ее в виде последовательности из некоторого
числа более простых конструкций. Так, например конструкцию
"дробное число" можно представить как целую часть, точку и
дробную часть, следующих друг за другом в указанном порядке.
Язык БНФ предоставляет удобный способ опрделения такой конс-
трукции языка: в правой части правила необходимо просто выпи-
сать в заданной последовательности те понятия, через которые
определяется новое понятие. Так, правило для дробного числа
должно иметь вид
<дробное число>::=<целая часть>.<дробная часть>
При чтении правой части правила между ее элементами, являющими-
ся металингвистическими переменными и константами, вставляется
союз "и", имеющий смысл "за которым(ой) следует". Поэтому, при-
веденное правило читается следующим образом: "дробное число по
определению есть целая часть и точка, и дробная часть".
Описанный прием может использоваться в сочетании с приемом
перечисления, когда необходимо в одном правиле указать несколь-
ко варианов построения новой конструкции языка. Покажем это на
- 4 -
примере правила для имени переменной, которое в ранних версиях
языка Бейсик определялось как буква, за которой могла следовать
цифра. Данное определение переформулируем так, чтобы явно выде-
лились два способа образования имени. В результате получим:
"имя по определению есть буква или буква, за которой следует
цифра". Если в полученном определении часть предложения ", за
которой следует" заменить на союз "и", то получим определение
"имя по определению есть буква или буква и цифра", по которому
можно восстановить соответсвующее правило:
<имя>::=<буква>│<буква><цифра>
Расмотренные приемы позволяют определять понятия, значени-
ями которых являются цепочки символов конечной длины.
Перейдем к рассмотрению принципов построения металингвис-
тических формул для определения понятий, значениями которых
являются цепочки переменной длины. С этой целью возьмем такое
привычное понятие, как целое положительное число, и построим
всего одно его значение, например 795. При этом будем следить
за каждым своим шагом, чтобы выявить в выполняемых действиях
некоторую закономерность.
Так, начиная запись числа с цифры 7, попытаемся предста-
вить металингвистическую формулу, которую мы при этом подразу-
меваем. Очевидно, это следующая формула
<целое положительное число>::=<десятичная цифра>
поскольку запись любого целого положительного числа начинается с
цифры. Причем, ее применение дает одноразрядное число 7, но не
цифру 7!
Вторая цифра 9 записывается за уже имеющимся числом 7,
т.е. здесь подразумевается правило вида
<целое положительное число>::=
<целое положительное число><десятичная цифра>
Его применение дает целое положительное число 79. Третья цифра