Идентификаторы Назад В начало Вперед

Идентификаторы создаются по следующим правилам:

Компилятор VIP не различает заглавные и строчные буквы в идентификаторах.

Между двумя идентификаторами должен быть хотя бы один разделитель (в т.ч. комментарий) или специальный символ.

<идентификатор> = ( _ | <буква>) { _ | <буква> | <цифра> }
<буква> = <буква-латинского-алфавита> | <знак-подчеркивания>
<цифра> = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Идентификаторы делятся на стандартные и пользовательские.

Стандартные идентификаторы вводятся системными программистами. К ним относятся имена функций и процедур библиотеки VIP API, глобальные системные переменные, идентификаторы системных констант. Стандартные идентификаторы описаны далее по тексту в соответствующих разделах данного документа.

Пользовательские идентификаторы вводятся прикладными программистами. Стандартные идентификаторы не должны использоваться в качестве идентификаторов пользователя.

Идентификатор может быть объявлен на одном из следующих уровней:

Уровни являются вложенными друг в друга. Множество идентификаторов, объявленных на верхнем уровне, доступно на всех вложенных в него уровнях. Уникальность идентификаторов требуется только в пределах одного уровня. Во вложеных уровнях допускается объявление идентификаторов, одноимённых индентификаторам верхнего уровня. Приоритет растёт с увеличением вложенности уровней. Т.е. переменная объявленная в программном блоке будет иметь более высокий приоритет, чем переменная VIP-объекта, но и доступна она будет только в рамках этого блока.

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

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

Все описываемые идентификаторы попадают в текущий компонент. Текущий компонент переключается директивой #component ( см. "Component: компонентная принадлежность. ").

При использовании идентификаторов их поиск производится в стеке текущего компонента (снизу вверх), а затем (в случае неудачи) во всех остальных компонентах в порядке их описания.

При необходимости можно явно указать компилятору из какого компонента следует брать описание того или иного идентификатора. Имя компонента отделяется от идентификатора символом '::' (двойное двоеточие):

::Message(' ... '); 	 // функция из системного компонента
var aRec: TestComp::MyRecord; // тип из компонента TestComp
Support::g_CurrentID := 0; // глобальная переменная из компонента Support

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

interface CompTest;
var testVar : string;

procedure CTFunc;
var testVar : longInt;
{
  testVar := 5; 			// локальная переменная
  ::Message(private::testVar); // переменная объекта
}
end.