Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Разработка программ

.pdf
Скачиваний:
9
Добавлен:
02.05.2015
Размер:
440.75 Кб
Скачать

x:=-100;

 

write(x)

-100

x:=1,6;y:=-0,555555555555;

 

write(x);

1.6000000000E+00

write(-0,6);

-6.0000000000E-02

write(y);

-5.5555555556E-01

Вывод вещественных чисел без форматирования осуществляется в экспоненциальном виде. Изображение числа включает: 1 позиция знак числа. Если число отрицательное, то перед ним выводится знак минус, плюс либо заменяется пробелом, либо вообще не отображается (зависит от реализации Паскаля). В предыдущем и последующих примерах знак плюс не отображается, и положительное число занимает на одну позицию меньше, чем отрицательное.

1

позиция

первая цифра мантиссы

1

позиция

десятичная точка

10 позиций

остальные цифры мантиссы (количество позиций

зависит от реализации языка)

1

позиция

буква Е

1

позиция

знак порядка

2

позиции

цифры порядка

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

2.a : m - вывод с указанием ширины поля вывода (m). Ширина поля вывода - это количество позиций, которое задает программист и в котором должно быть размещено значение а,

причем это значение выводится в правых позициях заданного поля.

Здесь возможны два случая, в зависимости от соотношения m и количество k символов, изображающих выводимое значение а. Например:

Операторы

На экране (файл output)

Случай m>k

Остающиеся свободными (m-k) левые позиции заданного поля

41

заполняются пробелами

write (‘Вывод строки символов’ :

_ _ _ _Вывод строки символов

25);

 

x:=100;

 

write(x :10);

_ _ _ _ _ _ _100

x:=-100;

 

write(x :10)

_ _ _ _ _ _ -100

 

 

x:=1,6;y:=-0,555555555555;

 

write(x : 20);

_ _ _ 1.6000000000E+00

write(-0,6 : 20);

_ _ _ -6.0000000000E-02

write(y : 20);

_ _ _ -5.5555555556E-01

 

 

Случай m<k

значение m игнорируется и ширина поля принимается в точности равной числу k символов, изображающих значение а (кроме строки символов, здесь выводятся столько символов, сколько заказано)

write (‘Вывод строки символов’ :

Вывод стр

9);

 

X:=100;

 

Write(x :1);

100

X:=-100;

 

Write(x :3)

-100

 

 

X:=1,6;y:=-0,555555555555;

 

Write(x : 2);

1.6E+00 минимум 7 символов

Write(-0,6 : 7);

-6.0E-02 минимум 8 символов

Write(y : 20);

-5.6E-01 минимум 8 символов

 

и округление

3.a : m : n - вывод вещественных чисел в формате с фиксированной запятой (точкой в Паскале). Здесь m также представляет собой ширину поля вывода, из этих m позиций n позиций отводится на вывод дробной части.

Изображение числа включает:

42

1 позиция

знак минус (если число меньше 0)

С позиций

цифры перед точкой - целая часть числа, выводится

всегда вся

 

1 позиция

десятичная точка

n позиций

цифры после точки - дробная часть числа , при не-

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

Минимальное количество позиций для отрицательного числа равно 1(знак)+С+1(точка)+n, для положительного =

С+1+n.

Например:

Операторы

На экране (файл output)

x:=1,6; y:=-0,555555555555;

 

write(x : 2:3);

1.600

write(-0,6 : 7:10);

-0.6000000000

write(y : 20:3);

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _-0.555

write(y:20:10)

_ _ _ _ _ _ _-0.5555555555

Синтаксис

Чтобы понять текст, на каком бы языке он не был написан, необходимы два условия: наличие в нем структуры и смысла. Правила, определяющие структуру текста, назывются грамматикой или синтаксисом языка. Правила, управляющие смыслом текста, называются семантикой языка.

Для описания синтаксиса удобно использовать синтаксические диаграммы. Для иллюстрации основополагающих принципов использования синтаксических диаграмм рассмотрим крайне ограниченный язык Показушка, не имеющего ничего общего с программированием. Он, в сущности, позволяет лишь писать предложения о кошках и мышках. Показушка включает всего десять слов и два знака препинания, которые называются лексемами. Синтаксические диаграммы языка показаны на рис.1. Каждая

43

диаграмма определяет синтаксический класс.

Чтобы построить отрывок текста по синтаксической диаграмме, нужно проделать следующее:

1.Двигаясь слева на право, пройти по линиям диаграммы от начала до конца, помещая в текст все встретившиеся элементы. Какой бы путь не был выбран на диаграмме, порожденный фрагмент текста будет синтаксически правильным.

2.Когда в названии упомянуто название другого синтаксического класса, вместо него можно подставить любой фрагмент, построенный по соответствующей синтаксической диаграмме.

Пользуясь синтаксической диаграммой, можно получить

следующие конструкции: КОШКА.

БЕЛАЯ, ЧЕРНАЯ, ТОЩАЯ, УПИТАННАЯ КОШКА.

Все эти предложения синтаксически правильные в Показушке. Заметим, что следование синтаксическим правилам не гарантирует получения осмысленных выражений.

Для описания синтаксиса вместо синтаксических диаграмм довольно часто в документации по языкам программирования используется особые обозначения, называемые расширенные Бэкуса-Наура (РБНФ) Формы. РБНФ – это язык для определения других языков. Синтаксические конструкции обозначаются английскими словами (метаименами), напечатанными курсивом. Каждое правило РБНФ определяет метаимя с помощью РБНФ – выражения, состоящего из одной или более альтернатив (фраз), разделенных вертикальной чертой ( | ). Фраза состоит из нуля или более элементов. Элемент – это или некоторое метаимя, или некоторая буквальная комбинация символов, заключенных в кавычки ( “ ”), или другое РБНФ-выражение, заключенное с двух сторон в фигурные, квадратные или круглые скобки. Фигурные скобки { } указывают на повторение (нуль или более вхождений), квадратные скобки [ ] – на допустимость ( нуль или одно вхождение), а круглые скобки ( ) указывают на группирование (точно одно вхождение) выражений, в них заключенных. РБНФ – обозначения сведены в таблицу

44

Обозначение

Смысл обозначения

 

=

Определяется как

 

.

Конец определения

 

|

Выбор или альтернатива

 

“x”

Лексема x

 

 

X

Фрагмент текста, относящийся к синтаксиче-

 

 

скому классу x

 

{x}

Отсутствие x или одно или больше вхождений x

 

 

(возможность повторения, что соответствует

 

 

замкнутому циклу в синтаксической диаграмме)

 

[x]

Отсутствие x или ровно одно вхождение x. (не-

 

 

обязательная часть синтаксического класса)

 

(x | y | …| z)

Вхождение x, или y, или … или z (альтернативы

 

 

внутри определения)

 

Представим

определение языка Показушка в расширенной

 

форме Бэкуса-Наура

=

Подлежащее предикат “.” .

Предложение

 

Подлежащее

 

=

Именная_группа .

Предикат

 

=

Глагол ( именная_группа | наречие ) .

Именная_группа

=

[ список_прилагательных ] . суще-

 

 

 

ствительное .

Спи-

 

=

Прилагательное { “,” прилагатель-

сок_прилагательных

 

ное} .

Существительное

=

“КОШКА”|”МЫШКА”

Прилагательное

=

“ЧЕРНАЯ”|”БЕЛАЯ”|”ТОЩАЯ”|

 

 

 

”УПИТАННАЯ” .

Глагол

 

=

“БЕЖИТ”|”ЕСТ” .

Наречие

 

=

“БЫСТРО”|”МЕДЛЕННО” .

Синтаксическим анализом называется процесс выяснения принадлежности конкретного фрагмента текста данному синтаксическому классу. Одним из методов его проведения является построение синтаксического дерева, который сводится к следующему.

1.Текст разбивается на последовательность лексем.

2.Разбирая текст слева направо, находится последовательность

45

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

В качестве примера выясним, будет ли предложение КОШКА ЕСТ МЫШКУ. синтаксически правильным в Показушке.

На первом этапе текст нужно расчленить, превратив в последовательность лексем. В показушке это тривиально “КОШКА” “ЕСТ” “МЫШКУ” “.” .

Второй этап анализа состоит в том, чтобы пройти по тексту слева на право и найти последовательно составные части, образующие объект данного синтаксического класса. Так как сейчас мы пытаемся доказать, что текст – это предложение, обратимся к синтаксической диаграмме предложение. Диаграмма показывает, что всякое предложение начинается с именной группы. Поэтому в начале текста мы должны найти именную группу.

Именная_группа – другой синтасический класс, поэтому в рамках основной процедуры анализа нужно произвести еще один разбор, чтобы найти именную группу. Согласно соответствующей синтаксической диаграмме, лексема “КОШКА” допустима в качестве именной группы. Поэтому мы возвращаемся к основной процедуре и заменяем первое слово в предложении названием класса именная_группа:

”КОШКА” ”ЕСТ” ”МЫШКУ” ”.”

именная-группа ”ЕСТ” ”МЫШКУ” ”.”

Согласно синтаксической диаграмме, именная группа, найденная в начале предложения, заставляет непосредственно за ней искать лексемы «ЕСТ» или «БЕЖИТ». Это просто. Следующей в частично уже проанализированном тексте идет лексема «ЕСТ», что синтаксически правильно.

Затем мы должны найти либо другую именную группу, ли-

46

бо лексему «БЫСТРО», либо лексему «МЕДЛЕННО». Так как «МЫШКА» – действительно именная группа, наш анализ продолжается так:

”КОШКА” ”ЕСТ” ”МЫШКУ” ”.”

именная-группа ”ЕСТ” ”МЫШКУ” ”.”

именная-группа ”ЕСТ” именная-группа ”.”

Наконец, требуется найти лексему «.», и она в тексте обнаруживается. Итак, дойдя до правого конца синтаксической диаграммы и исчерпав весь текст, можем заключить, что данный фрагмент в примере является правильным предложением.

Существенно, что синтаксический анализ не является простым разглядыванием текста с целью отнесения его к какомунибудь из классов. Нужно знать, какой мы класс ищем, и определить, принадлежит ли текст этому классу.

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

”КОШКА” ”ЕСТ” ”МЫШКУ” ”.”

существительное глагол существительное ”.”

именная-группа глагол именная-группа ”.”

подлежащее предикат ”.”

предложение

Синтаксис Паскаля

Лексемы и выражения

Программа на Паскале состоит из лексем и символовразделителей. В лексемы Паскаля входят специальные символы,

47

служебные слова, идентификаторы, числа и строки символов (литералы):

специальный символ

= ”+” | ”-” | ”*” | ”/” | ”=” | ”<” | ”>” |

 

 

”=” | ”[” | ”]” | ”.” | ”,” | ”;” | ”:” |

 

 

”^” | ”|” | ”<>” | ”<=” | ”>=” | ”” |

 

 

”:=” | ”..” | ”and” | ”array” | ”begin”

 

 

| ”case” | ”const” | ”div” | ”do” |

 

 

”downto” | ”else” | ”end” | ”file” |

 

 

”for” | ”function” | ”goto” | ”if” |

 

 

”in” | ”label” | ”mod” | ”nil” | ”not” |

 

 

”of” | ”or” | ”packed” | ”procedure”

 

 

| ”program” | ”record” | ”repeat” |

 

 

”set” | ”then” | ”to” | ”type” |

 

 

”until” | ”var” | ”while” | ”with” .

идентификатор

= буква {буква | цифра} .

число

=

[знак ] число-без-знака .

число-без-знака

=

целое-без-знака | действитель-

 

 

ное-без-знака .

целое-без-знака

= цепочка-цифр .

действительное-без-знака

= цепочка-цифр ”.” цепочка-цифр |

 

 

цепочка-цифр [”.” цепочка-

 

 

цифр] | ”E” порядок .

порядок

=

[знак ] целое-без-знака .

знак

=

”+” | ”-” .

цепочка-цифр

 

цифра { цифра } .

литерал

= ”’” элемент-литерала { элемент-

 

 

литерала } ”’” .

элемент-литерала

= изображение апострофа | стро-

 

 

ковый символ .

изображение-апострофа

=

” ’’ ” .

строковый-символ

= любой-символ-допускаемый-

 

 

оборудованием-кроме-

 

 

апострофа .

Символами-разделителями считаются пробелы, концы строк (разделители строк) и комментарии. Внутри лексем ни раз-

48

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

К специальным символам относятся +, -, *, /, ,, :, ;, =, <>, <, <=, >, >=, :=, .., ^, (, ), [, ]. Специальные символы, состоящие из двух символов, не допускают «вклинивания» разделителей.

Служебные слова (или зарезервированные слова) в рукописных программах обычно подчеркиваются, чтобы их легче было воспринимать как единые символы с фиксированным смыслом. Использование этих слов в каком-либо другом значении, кроме того, которое зафиксировано в определении Паскаля нельзя; в частности, эти слова не употребляются в качестве иденти-

фикаторов. Всего их 35 (program, begin, end, if, while и так далее).

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

Различают продопреленные идентификаторы и идентификаторы, определенные программистом. Предопределенный идентификатор имеет сдандартный смысл и входит в описание языка (write, read, cos, true и так далее). Идентификаторы, определенные программистом – это идентификаторы, смысл которых определен непосредственно в программе (имена переменных, констант, процедур, функций, программы и так далее).

Для чисел, обозначающих целые или вещественные значения, используется десятичная нотация. Перед любым числом может стоять знак (+ или -). В числе не допускается никаких запятых. Вещественное число записывается с десятичной точкой или с масштабным множителем (порядком), можно с тем, и с другим. Буква Е (или е), за которой следует порядок, читается как «умножить на десять в степени». Если вещественное число содержит десятичную точку, то перед нею и после нее должно быть по крайней мере по одной цифре.

Заключенные в апострофы (одиночные кавычки) последовательность символов называется строками или литералом. Если

49

нужно включить в строку сам апостоф, то он записывается дважды.

Выражение задает порядок вычисления значения, основанный на иерархическом принципе и реализует обычные правила вычисления слева направо и по старшенству операций, аналогично математике. Выражения состоят из множителей, слагаемых и простых выражений. Синтаксис класса выражение и нескольких связанных с ним классов представлен ниже:

выражение

=

простое выражение [ операция-

 

 

сравнения простое-выражение ] .

простое-выражение

=

[знак] терм { операция-сложения

 

 

терм } .

терм

=

множитель {операция-умножения

 

 

множитель} .

множитель

=

константа-без-знака | переменная | ” (

 

 

” выражение ” ) | ” not ” множитель |

 

 

обращение-к-функции .

операция-сравнения

=

” = ” | ” <> ” | ” < ” | ” > ” | ” <= ” | ”

 

 

>= ”

операция сложения

=

” + ” | ” - ” | ” or ” .

опреация-умножения

=

” * ” | ” / ” | ” div ” | ” mod ” | ” and ” .

знак

=

”+” | ”-” .

константа-без-знака

=

число-без-знака | имя-константы |

 

 

литерал .

имя-константы

=

идентификатор .

переменная

=

полная-переменная | буферная-

 

 

переменная | индексированная-

 

 

переменная | выборка-поля .

полная-переменная

=

имя-переменной .

имя-переменной

=

идентификатор .

буферная-переменная

=

файловая переменная ” ^ ” .

файловая-переменная

=

переменная .

индексированная-

=

переменная-массива ” [ ” индекс { ”,”

переменная

 

индекс } ” ] ” .

переменная-массива

=

переменная .

50