Синтаксис Pascal-программы
НАПИСАНИЕ ПРОГРАММ НА ЯЗЫКЕ CF-PASCAL
В этом разделе мы узнаем о том, как писать простые программы на языке CF-Pascal, проверять корректность синтаксиса и использовать принципы проектирования и разработки программ в процессе пошагового совершенствования написания, исполнения и тестирования простейших программ.
Введение в синтаксис языка CF-Pascal
Программы CFPascal составляются в соответствии с четко заданным синтаксисом. Точный набор правил определяет синтаксис программ и процедуры его проверки.
Новые идеи: Синтаксис программы, нотация BNF, синтаксическое правило, альтернативное синтаксическое правило, рекурсивное синтаксическое правило, доказательство синтаксической корректности.
Для того, чтобы научиться писать на английском, в первую очередь необходимо освоить синтаксис и грамматику языка, чтобы быть способным писать сложные предложения, объединять их в параграфы и т.д. Синтаксис английского языка, требует многих лет изучения, потому что он является естественным языком и постоянно обновляется и изменяется.
Аналогично, для того, чтобы писать на CF-Pascal, тоже необходимо овладеть синтаксисом, чтобы быть способным писать операторы и составлять с их использованием программы. Однако CF-Pascal является формальным языком с четко заданным набором синтаксических правил. Эти правила позволяют изучить синтаксис языка гораздо быстрее и полнее, чем это возможно в случае естественных языков. Изучив синтаксис языка, можно смело переходить к вопросу о том, как писать программы для решения предстоящих задач.
Паскаль-машина рассматривает Паскаль-программу как последовательность символов. Люди, в свою очередь, узнают знакомые слова и могут догадаться, что имеется в виду в следующей последовательности символов, не являющейся Паскаль-программой:
PROGRAM CopyChar(INPUT, OUTPUT);
VAR
Ch; CHAR;
BEGIN
READ(Ch);
WRITELN(Ch)
END.
Паскаль-программа, с таким же именем, которая была рассмотрена на предыдущей лекции, выглядит так:
PROGRAM CopyChar(INPUT, OUTPUT);
VAR
Ch: CHAR;
BEGIN
READ(Ch);
WRITELN(Ch)
END.
Разница между этими строками символов в один-единственный символ не позволит компилятору языка Паскаль откомпилировать первый пример.
Из-за необходимости составления Паскаль-программ с точностью до символа, эта глава ознакомит вас со строгими правилами синтаксиса языка CF-Pascal. Конечно, эксперименты и примеры полезны во время изучения, но точные и лаконичные правила позволят вам уверенно проверять корректность программ. Изучения языков программирования только по примерам и использования компилятора для проверки синтаксиса приведет не только к ограниченному использованию ЯП, но также создаст неверное понимание о написания программ вообще.
Синтаксис Pascal-программы
Программа CopyChar – всего лишь пример последовательности символов, удовлетворяющей правилам синтаксиса языка Pascal. Правила определяют элементы программ (это что-то вроде частей речи в русском языке) при помощи синтаксических категорий, а также показывают, как элементы программ попадают в эти категории.
Синтаксические элементы могут быть описаны по правилам грамматики в нотации BNF (Backus-Naur Form) названной по имени компьютерных ученых, которые вместе с другими учеными участвовали в разработке языка ALGOL-60 – концептуальным предшественником языка Паскаль. Синтаксические элементы записываются в виде слова или фразы внутри угловых скобок (<…>) и определяются при помощи правила, которое может относиться к другим синтаксическим элементам.
Правило 1 определяется часть синтаксического элемента «программа».
SR1. <программа> ::= <заголовок> ; < блок > .
Синтаксическое правило 1 утверждает, что синтаксический элемент <программа> может быть составлен из синтаксического элемента <заголовок>, следующей за ней точки с запятой, синтаксического элемента <блок> и последующей точки. Угловые скобки, заключающие в себе названия других синтаксических элементов, означают, что каждый из этих элементов также определяются синтаксическим правилом. Правило 1 определяет элемент <программа>, тогда как <заголовок> и <блок> будут определены при помощи других правил. Точка с запятой и точка – это синтаксические литералы или строки символов, которые должны присутствовать именно в том виде, в каком они показаны.
Символ ::= означает «является любым примером». Синтаксическое правило 1 читается так:
<программа> является любым примером <заголовка>, последующей точки с запятой, последующего <блока>,последующей точки.
Символы ::= и угловые скобки < > являются метасимволами,поскольку они не являются частью определяемого языка. Ни ::=, ни <программа> не могут присутствовать в Пасколь программы, за исключением, возможно, комментариев. В случае программы CopyChar последовательность символов
PROGRAM CopyChar(INPUT,OUTPUT)
соответствует синтаксической части <заголовок>, а последовательность:
VAR
Ch: CHAR;
BEGIN
READ(Ch);
WRITELN(Ch);
END
соответствует синтаксической части <блок>.
Для того, чтобы вся программа соответствовала синтаксической части <программа>, надо вставить точку с запятой после заголовка и точку после части <блок>, как это указано в синтаксическом правиле 1. Мы будем говорить об элементах программ, говоря о том какая последовательность символов какому синтаксическому элементу соответствует, и затем будет ссылаться к данной последовательности символов по имени элемента.
Синтаксическое правило 2 определяет синтаксический элемент <заголовок>.
SR2. <заголовок> ::= PROGRAM <идентификатор> (INPUT, OUTPUT)
Заголовок начинается с символьной последовательности PROGRAM, последующего <идентификатора> и символьной строки (INPUT, OUTPUT). В программе CopyChar, <идентификатором> является последовательность сама символов CopyChar.
Стандартные слова вроде PROGRAM и <идентификатор>должны бать разделены друг от друга как минимум одним пробелом, в том случае, когда между ними не находится знак препинания вроде точки с запятой. В синтаксических правилах пробелы никогда явно не показываются. Пробелы используются в них только для того, чтобы повысить их читаемость. В тех случаях, когда может быть вставлен один пробел, может быть использовано любое их количество пробелов. Символ конца строки может заменить собой любой пробел.
<Идентификатором>является любая последовательность символов, которая начинается с буквы, за которой может следовать любое (0 или больше) количество букв и/или цифр, без пробелов и других символов.
Синтаксическое правило 3 задает определение идентификатора, используя два новых понятия. Во первых – это вертикальная черта | которая означает «или». Во вторых, данное правило использует в определении синтаксического элемента тот же самый синтаксический элемент. Вертикальная черта – это другой метасимвол, в данных синтаксических правилах.
SR3. <идентификатор> ::= <буква>
| <идентификатор> <буква>
| <идентификатор> <цифра>
Данное правило читается так:
<Идентификатором> является <буква>, либо (другой) <идентификатор>, за которым следует <буква>, либо (другой) <идентификатор>, за которым следует <цифра>.
Каждый возможный вариант в таком правиле называется альтернативой правила. В том случае, когда нам будет необходимо сослаться на одну из альтернатив, мы будем пользоваться нотацией Dewey. Например, правило SR3 имеет первую альтернативу 3.1 (<буква>), и две другие альтернативы 3.2 и 3.3. Короче говоря, синтаксическое правило SR3 гласит, что любая буква или цифра, добавленная в конец <идентификатора> создает новый <идентификатор>. Правило 3.1 определяет <идентификатор> как единственную букву, а правила 3.2 и 3.3 определяют <идентификаторы> длиной более одного символа в терминах <идентификаторов> меньшей длины.
SR4. <буква> := 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 | a | b | c | d | e | f | g | | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z
SR5. <цифра > := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Альтернатива 4.7, например, позволяет <букве> быть равной (например) равной G.
Теперь, используя эти определения мы можем построить <идентификатор> CopyChar по одному символу за раз:
<идентификатор> | По синтаксическому правилу |
C | С является <буквой> по правилу 4.3, и, следовательно, <идентификатором> по правилу 3.1 |
Co | С является <буквой> как описано выше, o является <буквой> по правилу 4.41, поэтому Coявляется идентификатором по правилу 3.2 |
Cop | Подобным образом, как в случае с Co, Copявляется идентификатором по правилам 4.42 и 3.2 |
… | |
CopyChar | подобно CopyCha и правилам 1.44 и 3.2 |
Подобным образом последовательности символов Copy1, XxXxX, One4Two являются <идентификаторами>.
Поскольку пробелы встречаются в синтаксических правилах только для улучшения читаемости, они не могут встречаться внутри <идентификаторов>
Почему ниже перечисленные символьные строки не являются идентификаторами?
Последовательность символов | Не является <идентификатором> потому что |
2nd | не начинается с буквы |
C 75 | содержит пробел |
Ch1+Ch2 | символ + не является ни буквой, ни цифрой |
Синтаксические деревья
Правила синтаксиса языка CF-Pascal определяют пошаговое построение любой программы в виде последовательности символов. В случае, когда такое построение программы невозможно, символьная последовательность не может быть текстом Паскаль-программы. Построение программы может быть изображено в виде синтаксического дерева. На рисунке 1 частично построена <программа> CopyChar.