вторник, 5 апреля 2011 г.

Основные элементы синтаксиса

Перевод из справочной системы Delphi

Основые элементы синтаксиса, называемые токенами, состоят из выражений, объявлений и инструкций. Инструкция описывает алгоритмическое действие, которое можеты быть выполнено внутри программы. Выражение – это синтаксический элемент, который включается в инструкцию и возвращает значение. Объявление определяет идентификатор (например, имя функции или переменной), который может быть использован внутри инструкций и выражений, и, если это необходимо, выделяет для него память.


Набор символов в Delphi

Язык Delphi использует кодирование символов Unicode для своего набора символов, включая алфавитные и числовые символы Unicode и символ подчеркивания. Язык Delphi не чувствителен к регистру. Символ пробела и управляющие символы (от U+0000 до U+001F , включая U+000D, символ конца строки или возврата каретки) являются пустыми.

Компилятор RAD Studio примет файл в кодировке UCS-2 или UCS-4 если файл содержит отметку порядка байтов. Тем не менее на скорость компиляции может влиять использование форматов, отличных от UTF-8. Все символы в файле с кодировкой UCS-4 должны быть перекодируемы в UCS-2 без суррогатных пар. Символы, кодируемые в UCS-2 с суррогатными парами (включая GB18030) приемлемы только в том случае, когда установлена опция компилятора для поддержки этой кодировки.

Набор символов Delphi и базовый синтаксис

На самом простом уровне программа – это последовательность токенов, разделяемых сепараторами. Токен – это наименьший значимый элемент в программе. Сепаратор – это или пробел или комментарий. Строго говоря, не всегда обязательно помещать разделитель между двумя токенами. Например, фрагмент кода:

Size:=20;Price:=10;

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

Size := 20; 
Price := 10;

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

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

Специальные символы – это нечисловые символы (или их пары), имеющие определенное значение для компилятора. Следующие символы являются специальными:

# $ & ' ( ) * + , - . / : ; < = > @ [ ] ^ { } 

Следующие парные символы также являются специальными:

(* (. *) .) .. // := <= >= <> 

Далее в таблице приведено соответствие символов:

Специальный символЭквивалентные символы Пояснение
[(. Левая квадратная скобка [ эквивалентна символьной паре, в которую входит левая круглая скобка и точка (..
].) Правая квадратная скобка [ эквивалентна символьной паре, в которую входит правая круглая скобка и точка (..
{(* Левая фигурная скобка [ эквивалентна символьной паре, в которую входит левая круглая скобка и звездочка (*.
}*) Правая фигурная скобка [ эквивалентна символьной паре, в которую входит правая круглая скобка и звездочка (*.
Замечание: %, ?, \, !, " (двойные кавычки), _ (подчеркивание), | (вертикальная черта) и ~ (тильда) не являются специальными символами.

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

Идентификаторы определяют константы, переменные, поля, типы, свойства, процедуры, функции, программы, модули, библиотеки и пакеты. Идентификатор может иметь любую длину, но для компилятора значимыми являются только первые 255 символов. Идентификатор должен начинаться с алфавитного символа, символа в кодировке Unicode или нижнего подчеркивания(_) и не может содержать пробелов.

Буквенно-числовые символы, символы Unicode, цифры разрешены после первого символа. Зарезервированные слова не могут быть использованы как идентификаторы. Поскольку язык Delphi не чувствителен к регистру идентификатор CalculateValue может быть записан любым способом:

CalculateValue 
 calculateValue
 calculatevalue
 CALCULATEVALUE

Поскольку названия модулей соответствуют именам файлов, несоответствие регистра могут повлиять на компиляцию.

Специфицируемые идентификаторы

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

identifier1.identifier2

identifier1 является спецификатором identifier2. Например, если в двух модулях объявляются переменные с именем CurrentValue, вы можете указать, что хотите обратиться к переменной из другого модуля:

Unit2.CurrentValue
Спецификаторы могут уточняться. Например:

Form1.Button1.Click
Вызывает метод Click, связанный с Button1 на Form1.

Если вы не специфицируете идентификатор, его интерпретация определяется правилами, указанными в разделе Блоки и область видимости.

Расширения идентификаторов

Вы можете столкнуться с идентификаторами (например, типами или методами в классах), имеющими имена, совпадающими с зарезервированными словами языка Delphi. Например, класс может иметь метод с именем begin. Зарезервированное слово begin не может быть использовано в качестве идентификатора, но если вы полностью специфицируете его, то проблемы не будет. Например, если вы хотите использовать зарезервированное слово type в качестве идентификатора, вам необходимо полностью его специфицировать:

var TMyType.type
// Использование полностью специфицированного 
//имени помогает избежать 
//путаницы с зарезервированным словом

В качестве альтернативы для решения проблемы может быть использован оператор амперсанд (&). Амперсанд запрещает идентифицировать слово как ключевое (зарезервированное). Если вы столкнулись с методом или типом, имеющим название, совпадающее с зарезервированным словом, вы можете опустить спецификацию пространства имен, предваряя его амперсандом. Когда вы объявляете идентификатор с именем, совпадающим с зарезервированным словом, вам необходимо использовать амперсанд:

type
 &Type = Integer; 
 // Префикс '&' обрабатывается без ошибок

Зарезервированные слова

Следующие зарезервированные слова не могут быть переопределены или использованы в качестве идентификаторов:

andendinterfacerecordunit
arrayExceptisremoveuntil
asexportslabelrepeatuses
asmfilelibraryresourcestringvar
beginfinalizationmodsetwhile
casefinallynilshlwith
classforNotshrxor
constFunctionofstrict private
constructorgotoorstrict protected
destructorifOutstring
dispinterfaceimplementationpackedthen
divinprocedurethreadvar
doinheritedprogramto
downtoinitializationpropertytry
elseinlineraisetype
Замечание: кроме того, слова private, protected, public, published и automated действуют как зарезервированные слова внутри объявлений типов, а в остальных случаях обрабатываются как директивы. Слова at и on также должны считаться зарезервированными.

Директивы

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

absoluteexternalnear1readstored
abstractfar1nodefaultreadonlyunsafe
assemblerfinaloperator10reference9varargs
automatedforwardoverloadregistervirtual
cdeclhelper8overridereintroducewinapi6
contains7implementspackage7requires7write
defaultindexpascalresident1writeonly
deprecatedinline2platformsafecalldelayed
dispidlibrary3privatesealed5
dynamiclocal4protectedstatic
experimentalmessagepublicstdcall
exportnamepublishedstrict


Замечание: far, near и resident являются устаревшими.
  • inline используется как директива в конце объявления процедуры или функции, чтобы пометить ее как встраиваемую, но в Turbo Pascal являлась зарезервированным словом.
  • library – ключевое слово, которое при использовании в первой строке в проекте, указывает на необходимость компиляции в DLL. В других случаях эта директива служит для пометки идентификаторов для вывода соответствующего предупреждения компилятора.
  • local использовалась как директива в Kylix и игнорируется в Delphi for Win32.
  • sealed директива класса с полным синтаксисом: 'class sealed.'
  • winapi аналогична stdcall для Delphi Win32; в 64-битной версии отличается.
  • package, при использовании в первой строке проекта, указывает на необходимость компиляции в пакет и включает соответствующий синтаксис. requires и contains - директивы относящиеся только к синтаксису пакетов.
  • helper указывает на помощника класса.
  • reference обозначает ссылку на процедуру или функцию.
  • operator обозначает оператор класса.
Другие типы директив

Кроме контексто-зависимых, в Delphi есть два других типа директив.

Директива может быть и идентификатором – ключевым словом, помещаемым после объявления для изменения его смысла. Например:

procedure P; forward;
//или: 
 procedure M; virtual; override;
//или: 
 property Foo: Integer read FFoo write FFoo default 42;

И последний тип директив, - это официальные директивы компилятора, которые представляют собой переключатели или опции, которые изменяют поведение компилятора. Директива компилятора помещается в фигурные скобки ({}) и начинается со знака ($):

{$POINTERMATH ON}
 {$D+} // DEBUGINFO ON
Как и остальные директивы, директивы компилятора не являются ключевыми словами.

Числа

Целочисленные и вещественные константы могут быть представлены в десятичном виде как последовательность цифр без запятых и пробелов с указанием префикса – оператора "+" или "–" для обозначения знака. По умолчанию значения распознаются как положительные (то есть, например, 67258 эквивалентно +67258) и должны попадать в диапазоны значений целочисленных и вещественных типов.

Числа с десятичной точкой или экспонентой обозначают вещественные типы, остальные числа определяются как целые. Когда символ Е встречается в обозначении числа, он имеет значение "умножение на 10 в степени…". Например, 7E2 = 7 * 10^2, а 12.25e+6 = 12.25e6 = 12.25 * 10^6.

Префикс в виде знака доллара обозначает шестнадцатеричное число, например: $8F. Шестнадцатеричные числа без указания оператора "-" определяются как положительные. Если во время присваивания шестнадцатеричное значение находится вне диапазона принимающего типа, возникает ошибка (кроме тех случаев, когда принимающий тип – Integer (32 битные целые) – в этом случае выдается предупреждение). При превышении положительного диапазона для типа Integer, значения принимаются в качестве отрицательных по аналогии с добавлением целых значений.

Метки

Метки – это стандартные идентификаторы Delphi, которые отличаются от остальных идентификаторов тем, что могут начинаться с цифры. Числовые метки могут включать в десять числовых символов, то есть числа от 0 до 9999999999.

Метки используются в инструкциях goto.

Символьные строки

Символьные строки, также называются строковыми литералами или строковыми константами и могут состоять из строки, заключенной в кавычки, управляющей строки или их комбинации. Сепараторы могут включаться токлько в строки, заключенные в кавычки, которые представляют собой последовательность символов, входящих в набор ANSI или многобайтовый набор символов, записанные в одну строку и заключенные в апострофы. Строка, в которой между апострофов нет ни одного символа, считается пустой строкой (null string). Два апострофа, стоящие вместе в строке обозначают единичный апостроф. Технически строка представляет собой последовательность символов Unicode, имеющих кодировку UTF-16. Символы в Базовом Многоязыковом Плане (Basic Multilingual Plane (BMP)) занимаеют 2 байта, а символы, не входящие в этот план требуют 4 байта.

Например:
'Embarcadero'           { Embarcadero }   
  'You''ll see'        { You'll see }
  '????????? Unicode ?????'
  ''''                 { ' } 
  ''                   { null string } 
  ' '                  { a space }

Управляющая строка – это последовательность из одного или более символов (в кодировке UTF-16), каждый из которых состоит из символа # , за которым следует целое число без знака в диапазоне от 0 до 65,535 (десятичное) или от $0 до $FFFF (шестнадцатиричное), и обозначает символ, соответствующий указанному коду. Каждое целое число в строке представляется двумя байтами. Это полезно для представления управляющих символов и многобайтовых символов.Например:

#89#111#117

Эквивалентно:

'You'

Вы можете комбинировать эти виды строк, составляя из них новые строки. Например, в строке вида:

'Line 1'#13#10'Line 2'

между 'Line 1' и 'Line 2' помещается символ возврата каретки. Тем не менее, вы не можете сцеплять таким образом две строки, поскольку следующие друг за другом апострофы интерпретируются как один символ. Для сцепки строк используйте оператор "+" или просто соедините их в одну строку.

Символьная строка совместима с любым строковым типом, а так же с типом Pchar. Поскольку тип AnsiString может содержать многобайтовые символы, строка с одним символом (одно-или многобайтовым) совместима с любым символьным типом. При включении расширенного синтаксиса ({$X+}), непустые символьные строки длины n совместимы с обычными и запакованными массивами, содержащими (от 0 до n-1 символов).

Комментарии и директивы компилятора

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

Есть несколько способов комментирования:

{ Текст между левой фигурной скобкой 
и правой фигурной скобкой представляет собой комментарий. }
(* Текст между левой круглой скобкой + звездочка 
и звездочка + правой круглой скобкой – также комментарий *)
// Любой текст между двойным слэшем 
//и концом строки представляет собой комментарий.

Комментарии с различным синтаксисом могут быть вложенными. Например, {{}} будет вызывать ошибку при компиляции, а (*{}*) - нет. Такая форма полезна для комментирования секций кода, которые уже содержат комментарии.

Далее приведены некоторые рекомендации, касательно того, как и где следует использовать три типа комментирующих символов:

Используйте двойной слэш для комментирования временных изменений, сделанных в процессе разработки приложения. Вы можете использовать механизм редактора кода, комментирующий строку при нажатии CTRL+/.
Используйте скобку-звездочку для комментирования разработки и комментирования блоков кода, содержащего другие комментарии. Эти символы комментирования позволяют комментировать одновременно несколько строк.
Используйте фигурные скобки для документирующих код комментариев, которые вы планируете оставить в коде.
Комментарий, содержащий знак доллара ($) сразу после открывающей скобки ("{"или "(*")– является директивой компилятора. Например, директива:

{$WARNINGS OFF}
дает указание компилятору подавлять предупреждения компиляции.

Комментариев нет:

Отправить комментарий