Область действия идентификатора
Любой используемый в программе идентификатор должен быть предварительно описан. Идентификаторы описываются в разделе описаний. Идентификаторы для переменных могут также описываться внутри блока.
Основная программа, подпрограмма, блок, модуль, класс образуют так называемое пространство имен — область в программе, в которой имя должно иметь единственное описание. Таким образом, в одном пространстве имен не может быть описано двух одинаковых имен (исключение составляют перегруженные имена подпрограмм). Кроме того, в сборках .NET имеются явные определения пространств имен.
Область действия идентификатора (т.е. место, где он может быть использован) простирается от момента описания до конца блока, в котором он описан. Область действия глобального идентификатора, описанного в модуле, простирается на весь модуль, а также на основную программу, к которой данный модуль подключен в разделе uses .
Кроме этого, имеются переменные, определенные в блоке и связанные с некоторыми конструкциями ( for , foreach ). В этом случае действие переменной i простирается до конца соответствующей конструкции. Так, следующий код корректен:
var a: array of integer := (3,5,7);
for i: integer := 1 to 9 do
write(a[i]);
foreach i: integer in a do
write(i);
Идентификатор с тем же именем, определенный во вложенном пространстве имен, скрывает идентификатор, определенный во внешнем пространстве имен. Например, в коде
var i: integer;
procedure p;
var i: integer;
begin
i := 5;
end;
значение 5 будет присвоено переменной i , описанной в процедуре p ; внутри же процедуры p сослаться на глобальную переменную i невозможно.
Переменные, описанные внутри блока, не могут иметь те же имена, что и переменные из раздела описаний этого блока. Например, следующая программа ошибочна:
var i: integer;
begin
var i: integer; // ошибка
end.
В производных классах, напротив, можно определять члены с теми же именами, что и в базовых классах, при этом их имена скрывают соответствующие имена в базовых классах. Для обращения к одноименному члену базового класса из метода производного класса используется ключевое слово inherited :
type
A=class
i: integer;
procedure p;
begin
i := 5;
end;
end;
B=class(A)
i: integer;
procedure p;
begin
i := 5;
inherited p;
end;
end;
Алгоритм поиска имени в классе следующий: вначале имя ищется в текущем классе, затем в его базовых классах, а если не найдено, то в глобальной области видимости.
Алгоритм поиска имени в глобальной области видимости при наличии нескольких подключенных модулей следующий: вначале имя ищется в текущем модуле, затем, если не найдено, по цепочке подключенных модулей в порядке справа налево. Например, в программе
описание переменной id будет искаться вначале в основной программе, затем в модуле unit2 , затем в модуле unit1 . При этом в разных модулях могут быть описаны разные переменные id . Данная ситуация означает, что unit1 образует внешнее пространство имен, пространство имен unit2 в него непосредственно вложено, а пространство имен основной программы вложено в unit2 .
Если в последнем примере оба модуля — unit1 и unit2 — определяют переменные id , то рекомендуется уточнять имя переменной именем модуля, используя конструкцию ИмяМодуля . Имя:
Pascal ABC Язык Pascal ABC Идентификаторы и служебные слова
Идентификаторы служат в качестве имен программ, модулей, процедур, функций, типов, переменных и констант. Идентификатором считается любая последовательность латинских букв или цифр, начинающаяся с буквы. Буквой считается также символ подчеркивания » _ «.
Например, a1 , _h , b123 — идентификаторы, а 1a , ф2 — нет.
Служебные слова служат для оформления конструкций языка и не могут быть использованы в качестве имен. Список всех служебных слов языка Pascal ABC приведен ниже:
Идентификаторы, зарезервированные слова и пунктуация
Идентификатор — это название, которое программист присваивает переменной и константе.
Они должны соответствовать следующим правилам:
- Начинаются с буквы английского алфавита или символа подчеркивания “_”.
- Могут содержать буквы и цифры, а также знак подчеркивания.
- Не допускается использования пробельных и специальных знаков:
Зарезервированные слова
В языке Pascal есть слова, которые не разрешается использовать для своих идентификаторов. Для разных версий Паскаль существует собственный набор зарезервированных слов.
Поскольку мы рассматриваем среду Lazarus, то приведем список слов для языка Free Pascal.
Зарезервированные слова языка Free Pascal | |||||||
---|---|---|---|---|---|---|---|
abs | absolute | and | arctan | array | as | asm | |
begin | boolean | break | case | char | class | const | |
constructor | continue | cos | destructor | dispose | div | do | |
downto | else | end | eof | eoln | except | exp | |
exports | false | file | finalization | finally | for | function | |
goto | if | implementation | in | inherited | initialization | inline | |
input | integer | interface | is | label | library | ln | |
maxint | mod | new | nil | not | object | odd | |
of | on | operator | or | ord | output | pack | |
packed | page | pred | procedure | program | property | raise | |
read | readln | real | record | reintroduce | repeat | reset | |
rewrite | round | self | set | shl | shr | sin | |
sqr | sqrt | string | succ | text | then | threadvar | |
to | true | trunc | try | type | unit | until | |
uses | var | while | with | write | writeln | xor |
Пунктуация в Pascal
Компилятор игнорирует пробелы, символы табуляции и перевод строки. По этой причине, пунктуация должна указать компилятору, где заканчивается оператор. Для разделения операторов используется символ ;.
Какие строки должны оканчиваться точкой с запятой:
- Название программы;
- Строки объявления переменных и констант;
- Каждое объявление пользовательских типов данных;
- Почти все операторы языка.
Перед словом end, блока begin end, не обязательно ставить точку с запятой, но согласно правил хорошего тона — лучше поставить.
Как было сказано выше, Паскаль не требует наличия отступов в коде программы. Однако они улучшают читабельность кода, что очень полезно для программиста.
Сравним две программы с отступами и без:
program Indentation; var x, y, z : integer; begin x := 4; y := 23; z := x + y; write(z); readln; end.
program WithoutIndentation; var x,y,z : integer; begin x := 4; y := 23; z := x + y; write(z); readln; end.
Как мы видим, понять что делает вторая программа достаточно сложно, даже на таком простом примере.
В большинстве современных IDE, в том числе в Lazarus, отступы выставляются автоматически, во время набора кода.
Что такое индификатор в паскале абс
Идентификаторы обозначают следующее:
Идентификаторы могут иметь любую длину, но только первые 63 символа являются значимыми для компилятора.
■ Первый символ идентификатора должен быть буквой
или знаком подчёркивания (не пробелом!).
■ Последующие символы должны быть буквами, цифрами
или знаком подчёркивания.
Подобно зарезервированным словам , идентификаторы можно записывать в любом регистре, компилятор не чувствителен к регистру.
Квалифицированные идентификаторы
Если существуют несколько образцов одного и того же идентификатора, то вы можете квалифицировать идентификатор с помощью идентификатора модуля для того, чтобы выбрать нужный образец идентификатора.
Объединённый идентификатор называется квалифицированным идентификатором.
Примеры
(* Идентификаторы *)
WriteLn
Exit
Real2String
(* Квалифицированные идентификаторы *)
System.MemAvail (* модуль = System, идентификатор = MemAvail *)
Dos.Exec (* модуль = Dos, идентификатор = Exec *)
Crt.Window (* модуль = Crt, идентификатор = Window *)
Ада
Идентификатор не может начинаться и заканчиваться на знак подчёркивания, два знака подчёркивания не могут идти подряд. Помимо латиницы, можно использовать буквы других алфавитов. Так, например, в пакете Ada.Numerics константа Pi также доступна по своему греческому имени π . В языке Ада пакеты образуют иерархию, поэтому квалифицированный идентификатор может содержать более одного идентификатора пакета .
Примеры на Аде
— Идентификаторы
Count X Get_Symbol Ethelyn Marion
Snobol_4 X1 Page_Count Store_Next_Item
Чайковский — кириллица в идентификаторе
— Квалифицированные идентификаторы
Interfaces.Unsigned_32 — пакет = Interfaces, идентификатор = Unsigned_32
Ada.Strings.Maps.Identity — Ada.Strings.Maps и Identity, соответственно