Н. Вирт - Программирование на языке Модула-2 (1160777), страница 4
Текст из файла (страница 4)
Эти абстракции, как показано ниже, принимают Формустандартных операторов. Ввод данных осуществляется операцией Read (читать), а вывод операцией Write (писать). Мы можем, например, считать, что данные читаются с клавиатуры ипишутся на дисплей.ReadCard (x);ReadCard(y);WHILE x # у DOIF x > у THEN x := х - уELSE у := у - хENDEND:WriteCard(x,6)Процедура ReadCard читает число типа CARDINAL (т.е. целое неотрицательное) и присваиваетего параметру (х). Процедура WriteCard выводит число типа CARDINAL, указанное ее первымпараметром (х). Второй параметр (6) указывает количество позиций, выделяемое дляпредставления этой величины на внешнем носителе.
В следующей далее окончательной версии мыоформим наш текст так, что он станет настоящей программой на Модуле.MODULE нод:11FROM InOut IMPORT ReadCard,WriteString,WriteLn.WriteCard:VAR x.y: CARDINAL;BEGINWriteString("x="): ReadCard(x); WriteLn;UriteString("y="): ReadCard(y); WriteLn;WHILE x # у DOIF x > у THEN x := x - уELSE у : = у - xENDEND;WriteString("нод="); WriteCard(x,6); WriteLn;END нод.Существенные добавления, сделанные на этомобъектов, встречающихся в программе, таких,описаны.
Описание вводит идентификатор (имя)константа или что-либо еще) и указывает егопеременной или значение константы.шаге, - это описания. в Модуле имена всехкак переменные и константы, должны бытьобъекта, определяет вид объекта (переменная,общие неизменные свойства, такие, как типПолучившейся завершенной программе, называемой модулам, присваивается имя (нод), и онаимеет следующий Формат:MODULE имя;<списки импорта><описания>BEGIN<операторы>END имя.Уместно сделать еше несколько замечаний относительно нашего примера. Процедуры WriteLn,WriteStrlng. ReadCard и WriteCard не являются частью самого языка.
Они определены в другоммодуле, называемом InOut, который считается доступным. Подборка таких полезных модулейбудет приведена в последующих разделах книги с соответствующими пояснениями. Здесь же мыпросто отметим: для того чтобы сделать модули доступными программе, их нужноимпортировать. Это осуществляется включением имен нужных объектов в список импорта иуказанием того, какому модулю они принадлежат.Процедура WriteString по выводит текст в виде последовательной цепочки литер (предназначенныедля вывода литеры заключены в кавычки).
Этот вывод сообщает пользователю ЭВМ, что далеетребуется ввод. Такое поведение - существенное свойство диалоговых систем. Процедура WriteLnзаканчивает строку в выходном тексте.На этом завершим обсуждение первого примера, которое было совершенно неформальным.
Этодопустимо, поскольку мы стремились объяснить уже готовую программу. Однако12программирование - это разработка и создание новых программ. Для такой цели подходит лишьточное, Формальное описание нашего инструментального средства. В следующем разделе мывведем Формализм для точного описания правильных ("законных") программ. Этот Формализмпозволяет строгим образом определить, удовлетворяет ли написанный текст нормам языка.3. НОТАЦИЯ ДЛЯ ЗАПИСИ СИНТАКСИСА МОДУЛЫФормальный язык - бесконечное множество цепочек символов. Элементы этого множестваназываются предложениями языка.
В случав языка программирования такими предложениямиявляются программы. Символы берутся из конечного множества, называемого словарем. Так какмножество программ бесконечно и не может быть задано прямым перечислением, то вместо этогооно определяется правилами образования его элементов. Последовательности символов, которыемогут быть образованы в соответствии с этими правилами, называют синтаксически правильнымипрограммами. Такой набор правил представляет собой синтаксис языка.Программы Формального языка соответствуют грамматически правильным предложениямразговорных языков.
Каждое предложение имеет структуру и состоит из отдельных частей, таких,как подлежащее, сказуемое, дополнение. Аналогично, программа состоит из частей, называемыхсинтаксическими понятиями, таких, как операторы, выражения, описания. Если грамматическаяконструкция А состоит из следующих друг за другом конструкций В и С, т.е. их конкатенации(сцепления) ВС, то мы будем называть В и С -синтаксическими Факторами и описывать Аследующей синтаксическойФОРМУЛОЙ:А = ВС.Если же А состоит либо из В, либо из С, мы будем называть В и С синтаксическими термами ивыражать А в виде:А = B|C.Для группировки термов и Факторов можно использовать круглые скобки.
Следует заметить, чтоА, В и С обозначают синтаксические понятия описываемого Формального языка, символы равно"-", вертикальная черта "|", скобки "(",")" и точка "." -символы метанотации, называемыеметасимволами. Введенная здесь метанотация называется расширенной формой Бэкуса-Наура(РБНФ).Кроме конкатенации и выбора РБНФ позволяет выразить условное вхождение и повторение. Есликонструкция А может состоять либо из В, либо из пустой цепочки, то это выражается в видеА = [В].Если же А может состоять из конкатенации любого числа (включая нуль) конструкций В, то этообозначаетсяА = {В}.Вот мы и объяснили, что такое РБНФ. Приведем несколько примеров того, как множествапредложений описываются Формулами в РБНФ.(A|B)(C|D)АС АD ВС ВDA[B]CABC ACА{ВА}A ABA ABABA ABABABA ...{А|В}СС АС ВС ААС ABC ВВС ВАС ...13Очевидно, что сама РБНФ - это тоже Формальный язык. Если этот язык способен делать то, длячего предназначен (описывать Формальные языки), то уж по крайней мере он должен уметьописать сам себя» В приведенном ниже описании РБНФ на РБНФ мы используем следующиеимена для синтаксических понятий:СинтОператор : синтаксическая ФормулаСинтВыражение : список альтернативных термовСинТерм: конкатенация ФакторовСинтФактор : единичное 'синтаксическое понятие или выражение в скобкахФормальное определение РБНФ теперь можно задать следующим образом:Синтаксис = { СинтОператор }.СинтОператор = идентификатор "-" СинтВыражение ".".СинтВыражение = СинТерм { "|" СинТерм }.СинТерм = СинтФактор { СинтФактор }.СинтФактор = идентификатор | цепочка| "(" СинтВыражение ")" I "[" СинтВыражение "]"| "{" СинтВыражение "}".Идентификаторами обозначены синтаксические понятия; цепочка -это последовательность литер,взятых из алфавита определяемого языка.
Для представления идентификатора мы приняли широкоиспользуемое в языках программирования соглашение, а именно:Идентификатор состоит из последовательности букв и цифр. начинающейся буквой. Цепочкасостоит из последовательности любых литер, заключенных в кавычки (или в апострофы).Формальное определение этих правил в терминах РБНФ дано в следующем разделе.4. ПРЕДСТАВЛЕНИЕ ПРОГРАММ НА МОДУЛЕВ предыдущем разделе был введен Формализм, которым в дальнейшем будет определятьсяструктура правильно составленных программ. Этот Формализм, однако, определяет только то,каким образом представляются программы в виде последовательностей синтаксических элементов(лексем), но не литер.
Этот "дефект" допущен намеренно: мы полагаем, что представление лексем(а значит, и программ) в терминах литер слишком сильно зависит от конкретной реализации, а дляопределения языка необходим более высокий уровень абстракции. Создание промежуточногоуровня представления через последовательности лексем обеспечивает удобную развязку междуязыком и окончательным представлением программы, которое зависит от доступного наборалитер. Как следствие этого мы должны принять ряд правил, регулирующих представление лексемв виде последовательности литер. Лексемы Модулы разделяются на следующие классы:идентификаторы, числа, цепочки, операции, разделители, комментарии.Правила, регулирующие их представление в терминах стандартного набора литер ISO,следующие:1. Идентификаторы - последовательности букв (* в оригинале только буквы латинского алфавита,в русском переводе книги используются также буквы русского алфавита, прописные и строчные.
Прим. перев.*) и цифр, начинающиеся с буквы:$Идентификатор - Буква {Буква|Цифра>.14Вот примеры правильно составленных идентификаторов:Алиса hello ЧернаяПтица oпepaторWHILE SR71Примеры слов, не являющихся идентификаторами:Модула 2(пробел недопустим)Модула-2(содержит дефис)2N(первой литерой должна быть буква)D'Alembert(содержит апостроф)Прописные и строчные буквы считаются различными.Иногда идентификатор (например i) должен быть квалифицирован (уточнен) другимидентификатором (j).
Эти выражается в том, что перед i размешается j и они разделяются точкой(j.i). Такой объединенный идентификатор называется квалифицированным (сокращенноКвалИдент). Его синтаксис:$КвалИдент * {Идентификатор "."} Идентификатор.2. Числа могут быть целыми или действительными. Целые представляются последовательностямицифр. Действительные числа содержат десятичную точку и дробную часть.
Кроме того, вдействительном числе может присутствовать порядок. Он задается буквой Е (прописнаялатинская) и произносится как "умножить на десять в степени". Числа не должны содержатьпробелов. Примеры правильно записанных чисел:1981 1 3.25 5.1ЕЗ 4.0Е-10А вот примеры последовательностей литер, которые не распознаются как числа:1,5запятая в числе недопустима1'000'000 не может быть апострофов3.5Еnзапрещены буквы в числе (за исключением Е)Точные правила образования чисел задаются следующим синтаксисом:$Число - Целое I Действительное.$Целое - Цифра (Цифра).$Действительное - ЦиФра{ЦиФра}"."{Цифра}[Порядок]-$Порядок - "Е" ["+"|"-"] Цифра {Цифра}.ПРИМЕЧАНИЕ: Если за целым числом следует латинская буква В. то оно воспринимается каквосьмеричное, если же за ним следует латинская буква Н, то как шестнадиатеричное.3.
Цепочка - последовательность любых литер, заключенная в кавычки. Очевидно, что дляоднозначного распознавания цепочки необходимо, чтобы она сама не содержала кавычек. Чтобыможно было записать и цепочку, содержащую кавычки, разрешается заключать ее вместо кавычекв апострофы. Однако в этом случае в ной не должно содержаться апострофов.$Цепочка - '"' {Литера}'"'|"'" {Литера} "'".Примеры цепочек:"NO PROBLEM"15"L'Etoile"'Придворная молочница сказала: "Благодарствуйте!".'4. Операции и ограничители - это или специальные литеры или ключевые слова. Последниепишутся прописными буквами и не должны использоваться в качестве идентификаторов.