«Машины должны работать. Люди должны думать»
4. Синтаксические элементы языка
В программе используются символы таблицы ASCII. Символ пробел (space) и управляющие символы (control characters) с кодами 0..31 называются «пустыми» символами (blanks) и используются, наряду с комментариями, в качестве разделителей (separators).
Программа состоит из лексем (token), которые отделяются друг от друга разделителями (separator). Лексема – это минимальная значимая единица текста программы. Из лексем составляются:
Ø описания (declarations);
Ø выражения (expressions);
Ø операторы (statements).
Лексемы подразделяются на следующие категории:
Ø специальные символы (special symbols);
Ø идентификаторы (identifiers);
Ø зарезервированные слова (reserved words);
Ø директивы (directives);
Ø числа (numerals);
Ø метки (labels);
Ø строки символов (character string).
Специальные символы – те же, что и в Borland Pascal:
# $ & ' ( ) * + , – . / : ; < = > @ [ ] ^ { }
К специальным символам относятся также следующие пары символов:
(* (. *) .) .. // := <= >= <>
Новая пара символов – это //, используемая для однострочного комментария.
Идентификаторы – составляются по тем же правилам, но длина идентификатора может быть любой. В идентификаторе распознаются первые 255 символов.
Зарезервированные слова.
and |
downto |
in |
or |
string |
array |
else |
inherited |
out |
then |
as |
end |
initialization |
packed |
threadvar |
asm |
except |
inline |
procedure |
to |
begin |
exports |
interface |
program |
try |
case |
file |
is |
property |
type |
class |
finalization |
label |
raise |
unit |
const |
finally |
library |
record |
until |
constructor |
for |
mod |
repeat |
uses |
destructor |
function |
nil |
resource- |
var |
dispinterface |
goto |
not |
set |
while |
div |
if |
object |
shl |
with |
do |
implementation |
of |
shr |
xor |
В дополнение к приведенным в таблице идентификаторы private, protected, public, published и automated ведут себя как зарезервированные слова в описаниях объектов и классов, а вне их трактуются как директивы компилятора.
Директивы имеют специальное назначение, однако, в отличие от зарезервированных слов, появляются только в контексте, где не могут употребляться пользовательские идентификаторы. Таким образом, они могут использоваться как идентификаторы, но этого делать не рекомендуется.
Директивы компилятора
absolute |
dynamic |
name |
protected |
resident |
abstract |
export |
near |
public |
safecall |
assembler |
external |
nodefault |
published |
stdcall |
automated |
far |
overload |
read |
stored |
cdecl |
forward |
override |
readonly |
virtual |
contains |
implements |
package |
register |
write |
default |
index |
pascal |
reintroduce |
writeonly |
dispid |
message |
private |
requires |
Числа, метки и строки символов – подчиняются тем же правилам, что и в BP.
Комментарии – вводятся с помощью фигурных скобок и символов //. Директива компилятора записывается так же, как и в ВР, например, {$R+}.
Операции(operators):
@, not, ^, *, /, div, mod, and, shl, shr, as, +, –, or,
xor, =, >, <, <>, <=, >=, in, is.
Новыми являются as и is. Они применяются к экземплярам (instances) классов. Операция as используется для приведения типа экземпляра класса, а is – для проверки принадлежности экземпляра класса определенному типу.
Арифметические, булевские, битовые операции и операции над строками – трактуются так же, как и в ВР.
Операции над указателями – трактуются так же, как и в ВР.
Операция |
Смысл |
Типы операндов |
Тип результата |
Пример |
+ |
прибавление к указателю |
указатель на символ, целый |
указатель на символ |
P + I |
- |
вычитание из указателя |
указатель на символ, целый |
указатель на символ, целый |
P - Q |
^ |
разыменование указателя |
указатель |
базовый тип указателя |
P^ |
= |
равенство |
указатель |
Boolean |
P = Q |
<> |
неравенство |
указатель |
Boolean |
P <> Q |
Операции над множествами и операции отношения – те же. Операции отношения применимы также к экземплярам классов (равно и не равно).
Вызовы функций – допускается вызывать функцию как процедуру. Также разрешается указывать пустые круглые скобки после имени функции или процедуры, которая не имеет параметров.
Приведение типа (typecasts) имеет такой синтаксис:
typeIdentifier (expression)
Тип значения выражения должен быть задан идентификатором типа typeIdentifier. Если выражение expression является переменной, говорят о приведении типа переменной (variable typecast), в противном случае – о приведении типа значения (value typecast).
В случае приведения типа значения идентификатор типа и тип значения должны быть оба порядкового типа (ordinal) или типа указатель:
Integer('A')
Char(48)
Boolean(0)
Color(2)
Longint(@Buffer)
При получении результата может происходить усечение или расширение размера, если размеры типа и значения отличаются. Приведение типа значения не может использоваться в левой части оператора присваивания.
Можно приводить любую переменную к любому типу, при условии, что они имеют одинаковый размер и нет смешения целочисленного и вещественного типов, например:
Char(I)
Boolean(Count)
TSomeDefinedType(MyVariable)
…
var MyChar: char;
…
Shortint(MyChar) := 122;
«3. Структура программы и модулей»
5. Типы данных