Разработка программ
.pdfиндекс |
|
|
= |
|
выражение . |
|
|
|
|
выборка-поля |
|
|
= |
[ переменная записи ” . ” ] имя-поля . |
|
||||
переменная-записи |
|
|
= |
|
переменная . |
|
|
|
|
имя-поля |
|
|
= |
|
идентификатор . |
|
|
|
|
обращение-к-функции |
|
= |
|
имя-функции [ список-фактических- |
|
||||
|
|
|
|
|
|
параметров ] . |
|
|
|
Пример синтаксического анализа выражения a+b*100 |
|
||||||||
“a” |
“+” |
|
|
“b” |
“*” |
“100” |
|
||
Имя_переменной |
“+” |
|
|
Имя_переменной |
“*” |
Чис- |
|
||
|
|
|
|
|
|
|
|
ло_без_знака |
|
Переменная |
“+” |
|
|
Переменная |
“*” |
Констан- |
|
||
|
|
|
|
|
|
|
|
та_без_знака |
|
Множитель |
“+” |
|
|
Множитель |
“*” |
Множитель |
|
||
слагаемое |
“+” |
|
|
слагаемое |
|
|
|
||
Простое_выражение |
|
|
|
|
|
|
|
||
выражение |
|
|
|
|
|
|
|
|
|
Операторы Паскаля
Основное в программе для вычислительной машины – выполняемые ей действия. Описывают эти действия операторы. Операторы бывают простыми и структурными. Синтаксические диаграммы операторов Паскаля представлены ниже.
Приведенный синтаксис обладает одним важным свойством. Он построен так, что лексема, с которой начинается оператор, однозначно определяет тип этого оператора. Например, если оператор начинается с имени переменной, то это может быть только оператор присваивания, если со служебного слова if
– условный оператор и так далее.
Пример синтаксического анализа оператора cost := cost + number * price:
“cost” |
“:=” |
“cost” |
“+” |
“number” |
“*” |
“price” |
Имя_пер |
“:=” |
Имя_пер |
“+” Имя_пере “*” Имя_переме |
|||
еменной |
|
еменной |
|
менной |
|
нной |
Пере- |
“:=” |
Пере- |
“+” |
Перемен- |
“*” |
Переменная |
51 |
|
|
|
|
|
|
менная |
|
менная |
|
ная |
|
Пере- |
“:=” |
Множи- |
“+” |
Множи- |
“*” Множитель |
менная |
|
тель |
|
тель |
|
Пере- |
“:=” |
слагае- |
“+” |
слагаемое |
|
менная |
|
мое |
|
|
|
Пере- |
“:=” |
Простое_выражение |
|
||
менная |
|
|
|
|
|
Пере- |
“:=” |
выражение |
|
|
|
менная |
|
|
|
|
|
Оператор_присваивания Простой_оператор оператор
Структура программы. Область действия идентификатора
Любая программа состоит из заголовка программы и некоторого блока (рис. 5-6). Блок содержит раздел описаний, в котором определяются все локальные по отношению к данной программе объекты, и раздел операторов. Он задает действия которые необходимо выполнить над этими объектами.
Место, где программист вводит новый идентификатор, называется точкой определения. Описание или определение идентификатора имеет силу везде в блоке, где находится это описание или определение. Исключением являются лишь вложенные (внутренние) блоки, в которых переописываются или переопределяются данные идентификаторы. Область, где справедливо определение либо описание идентификатора, называется его областью действия.
Если идентификаторы описаны либо определены в блоке программы, то их называют глобальными. Если же идентификаторы описаны либо определены внутри блока, то они называются локальными по отношению к этому блоку. Идентификаторы не локальны по отношению к этому блоку, если они описаны или определены в блоке, включающий данный.
Идентификатор нельзя описывать на одном уровне или в
52
одной области действия более одного раза. Соблюдаются следующие правила.
1.Для идентификатора, определенного в блоке Б1, областью действия определения является блок Б1 и все входящие в него блоки, за исключением тех, где тот же идентификатор переопределяется.
2.Идентификатор не имеет смысла вне своей области действия, а также между началом области действия и точкой определения.
3.Идентификатор имеет смысл в любой точке своей области действия, расположенной за точкой его определения.
Ниже представлена область действия идентификаторов для
примера программы с процедурой. Вертикальные линии соответ-
ствуют области действия. |
|
|
|
|
|
||
Program prim4; |
n t |
x P |
|||||
var n,t: real; x:char; |
|
|
|
|
|
|
|
procedure P(x,y: real); |
|
|
|
|
x |
y n |
|
var n:real; |
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
n:=x+t; |
|
|
|
|
|
|
|
t:=y; |
|
|
|
|
|
|
|
writeln(n,t,x); |
|
|
|
|
|
|
|
end; |
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
read(n); |
|
|
|
|
|
|
|
t:=n/2; |
|
|
|
|
|
|
|
x:=’+’; |
|
|
|
|
|
|
|
P(n,0.8); |
|
|
|
|
|
|
|
writeln(n,t,x) |
|
|
|
|
|
|
|
end. |
|
|
|
|
|
|
|
Новые типы данных. Определение типа. Диапазоны.
Каждый тип данных в Паскале определяет:
1.множество значений, принадлежаших к данному типу,
2.операции, которые могут выполняться над этими значениями,
3.свойства этого множества значений (например, упорядочен-
53
ность, длина строки у типа String и т.д.).
Например, стандартный тип данных Integer определяет:
1.множество значений – целые числа в диапазоне от –32768 до
32767,
2.набор операций и встроенных функций с данными этого типа,
3.линейная упорядоченность всех значений (от меньшего к большему).
Программист может описывать и использовать новые типы
данных, основу которых составляют множества значений стандартных типов. Описать новый тип данных – значит, указать множество значений, принадлежащих этому типу (обязательно) и дать ему имя (это явное описание типа), можно имя типу не давать (это будет неявное описание типа). Заметьте, что набор операций для нового типа данных, а также в большинстве случаев и свойства, программист не определяет, они как бы наследуются от базового стандартного типа.
Неявное определение нового типа данных – в разделе описания переменных или внутри определения структурных типов данных указывается множество значений нового типа, например: Var а: 1..20 – тип диапазона
b:(1,2,3) – тип перечисления
c:array [1..10] of integer – тип массива ([1..10] – неявное опреде-
ление типа диапазона внутри неявного определения типа массива)
d: array [‘a’..’g’] of char – тип массива
Так как при неявном определении типа имя ему не дается, то и сослаться на него для описания других переменных нельзя.
Явное определение нового типа данных – в разделе описания типов, который начинается со служебного слова Type и находится перед разделом описания переменных, записывается имя нового типа и после знака = указывается его множество значений, например:
Type N_gruppa = 1..3;
Podgruppa = (a,b);
Fio = array [1..25] of string;
54
Var fio619 : fio; (использование ранее описанного типа).
Имя нового типа можно теперь использовать для описания переменных и других типов не только в разделах описания типов и переменных программы, но и в подпрограммах.
55