基本的な構文要素(Delphi)
基本的な構文要素:インデックス への移動
トークンと呼ばれる基本構文要素を組み合わせて、式や宣言や文を組み立てます。 文とは、プログラム内で実行可能なアルゴリズム動作を記述したものです。式は、文の中に現れる構文単位で、1 つの値を表します。宣言では、式や文の中で利用できる識別子(関数や変数の名前など)を定義し、必要に応じて識別子用のメモリを割り当てます。
目次
このトピックでは、Delphi 言語の文字セットを紹介し、次のものを宣言するための構文を説明します。
- 識別子
- 数値
- 文字列
- ラベル
- ソース コード コメント
Delphi の文字セット
Delphi 言語では、文字セットとして Unicode 文字エンコードを使用します。これには、アルファベットおよび英数字の Unicode 文字とアンダースコアが含まれます。Delphi は大文字/小文字を区別しません。スペース文字と制御文字(改行文字または行末文字である U+000D を含む U+0000 から U+001F)は、空白です。
RAD Studio コンパイラは、バイト オーダー マーク(BOM)が含まれているものであれば、UCS-2 や UCS-4 でエンコードされたファイルを受け取ることができます。ただし、UTF-8 以外の形式を使った場合、コンパイル速度は低下する可能性があります。UCS-4 でエンコードされたソース ファイルの文字はすべて、サロゲート ペアを含まない UCS-2 で表現できるものでなければなりません。サロゲート ペアを含む UCS-2 エンコード(GB18030 を含む)を受け取ることができるのは、codepage コンパイラ オプションを指定した場合のみです。
トークン
非常に簡単に言うと、プログラムとは、区切り文字で区切られた一連のトークンです。トークンとは、プログラム内で意味を持つテキストの最小単位です。区切り文字は、空白かコメントです。厳密に言うと、2 つのトークンの間に必ず区切り文字が必要なわけではありません。たとえば次のコードを見てください。
Size:=20;Price:=10;
これは有効性に関してはまったく問題がありません。ただし、規約や可読性を考慮すると、次のように書く方がいいでしょう。
Size := 20;
Price := 10;
トークンは、特殊シンボル、識別子、予約語、指令、数値、ラベル、および文字列に分類されます。区切り文字がトークンの一部になり得るのは、トークンが文字列である場合のみです。隣り合う識別子、予約語、数値、およびラベルの間には、1 つ以上の区切り文字を置く必要があります。
特殊シンボル
特殊シンボルとは、非英数字の文字、またはその組み合わせで、決まった意味を持つものです。次の文字は、単独で特殊シンボルになります。
# $ & ' ( ) * + , - . / : ; < = > @ [ ] ^ { }
以下の文字の組み合わせも特殊シンボルです。
(* (. *) .) .. // := <= >= <>
Delphi でも同じ意味で使用されるシンボルの組み合わせを次に示します(シンボルの組み合わせ {} と (* *) は、コメント文字です。詳細は、「コメントおよびコンパイラ指令」に記載されています)。
特殊シンボル | 類似の特殊シンボル |
---|---|
[ ] |
(. .) |
{ } |
(* *) |
左角かっこ [ は、左丸かっことピリオドの文字の組み合わせ (. と等価です。
右角かっこ ] は、ピリオドと右丸かっこの文字の組み合わせ .) と等価です。
左中かっこ { は、左丸かっことアスタリスクの文字の組み合わせ (* と等価です。
右中かっこ } は、アスタリスクと右丸かっこの文字の組み合わせ *) と等価です。
メモ: %、?、\、!、"(二重引用符)、_(アンダースコア)、|(パイプ)、および ~(チルダ)は特殊シンボルではありません。
識別子
識別子は、定数、変数、フィールド、型、プロパティ、手続き、関数、プログラム、ユニット、ライブラリ、およびパッケージを表します。識別子の長さに制限はありませんが、有効なのは最初の 255 文字だけです。識別子は、アルファベット文字、Unicode 文字、またはアンダースコア(_)で始まらなければならず、スペースを含むことはできません。最初の文字の後には、英数字、Unicode 文字、数字、およびアンダースコアを続けることができます。予約語を識別子として使うことはできません。 Delphi 言語では大文字と小文字を区別しないため、たとえば CalculateValue という識別子は次のいずれのようにも記述可能です。
CalculateValue calculateValue calculatevalue CALCULATEVALUE
ユニット名はファイル名に対応するため、大文字と小文字の使い方が一貫していないと、コンパイルに影響する可能性があります。詳細は、「プログラムとユニット」の「ユニット参照と Uses 句」セクションを参照してください。
限定識別子
複数の場所で宣言されている識別子を使うには、識別子を限定しなければならない場合があります。限定識別子の構文を次に示します。
識別子1.識別子2
この識別子1 は識別子2 を限定します。たとえば、2 つのユニットがそれぞれに CurrentValue という変数を宣言している場合、Unit2 の CurrentValue にアクセスしたいことを指定するには次のように記述します。
Unit2.CurrentValue
限定子は重ねて使うことができます。以下に例を示します。
Form1.Button1.Click
と記述すると、Form1 の Button1 の Click メソッドが呼び出されます。
識別子を限定しない場合には、「宣言と文」の「ブロックとスコープ」セクションで説明するスコープの規則に基づいて解釈されます。
拡張識別子
識別子(型やクラスのメソッドなど)が、Delphi 言語の予約語と同じ名前になることがあります。たとえば、クラスに begin というメソッドが含まれるなどです。begin など Delphi の予約語は、識別子の名前として使用できません。
識別子を完全修飾する場合は、問題はありません。たとえば、Delphi の予約語 type を識別子の名前として使用したい場合は、次のように完全修飾名を使用する必要があります。
var TMyType.type
// Using a fully qualified name avoids ambiguity with {{Delphi}} language keyword.
もっと短くしたい場合には、アンパサンド(&)演算子を使って、識別子と Delphi 言語の予約語を区別できます。& を使用すると、あるキーワードがキーワード(予約語)として解析されないようにします。Delphi のキーワードと同じ名前のメソッドや型がある場合に、識別子の名前の前にアンパサンドを付けると、名前空間指定を省略できます。ただし、キーワードと同じ名前を持つ識別子を宣言する場合は、次のように、& を使用する必要があります。
type
&Type = Integer;
// Prefix with '&' is ok.
予約語
以下の予約語を再定義したり識別子として使うことはできません。
Delphi の予約語:
and |
end |
interface |
record |
var |
array |
except |
is |
repeat |
while |
as |
exports |
label |
resourcestring |
with |
asm |
file |
library |
set |
xor |
begin |
finalization |
mod |
shl |
|
case |
finally |
nil |
shr |
|
class |
for |
not |
string |
|
const |
function |
object |
then |
|
constructor |
goto |
of |
threadvar |
|
destructor |
if |
or |
to |
|
dispinterface |
implementation |
packed |
try |
|
div |
in |
procedure |
type |
|
do |
inherited |
program |
unit |
|
downto |
initialization |
property |
until |
|
else |
inline |
raise |
uses |
メモ: 上記の単語の他に、private、protected、public、published、および automated がクラス型宣言の中では予約語になります(クラス型宣言以外では指令として扱われます)。また、at および on という単語も特別な意味を持つため、予約語として扱う必要があります。キーワード of object を使用すると、メソッド ポインタを定義できます。
指令
Delphi の指令には複数のタイプがあります。"指令" の意味の 1 つは、ソース コード内の特定の位置で区別される単語という意味です。このタイプの指令は、Delphi 言語で特別な意味を持ちますが、予約語とは違って、ユーザー定義の識別子が出てこないコンテキストにのみ出現します。そのため、お勧めはしませんが、指令と寸分違わない識別子を定義することは可能です。
指令:
absolute |
export |
name |
public |
stdcall |
abstract |
external |
near1 |
published |
strict |
assembler |
far1 |
nodefault |
read |
stored |
automated |
operator10 |
readonly |
unsafe | |
cdecl |
forward |
out |
reference9 |
varargs |
contains7 |
helper8 |
overload |
register |
virtual |
default |
implements |
override7 |
reintroduce |
winapi6 |
delayed11 |
index |
package |
requires7 |
write |
inline2 |
pascal |
resident1 |
writeonly | |
dispid |
platform |
safecall |
||
dynamic |
local4 |
private |
sealed5 |
|
message |
protected |
static |
メモ: 1. far、near、および resident は古い形式です。 2. inline は、手続きおよび関数宣言の末尾で指令形式に使用され、その手続きや関数がインライン対象であることを示しますが、Turbo Pascal では予約語になりました。 3. library も、プロジェクト ソース コードの最初のトークンとして使用される場合のキーワードであり、DLL のターゲットを示します。それ以外の場合は、シンボルを指定して、使用されるとライブラリの警告が生成されるようにします。 4. local は、Kylix の指令でしたが、Delphi for Win32 では無視されます。 5. sealed は、通常とは異なる構文('class sealed')で使用されるクラス指令です。sealed クラスは、(C++ での
final
のように)拡張または派生されることはありません。6. winapi は、Delphi for Win32 の stdcall と同じですが、64 ビットでは異なります。7. package は、最初のトークンとして使用されると、パッケージのターゲットを示し、package 構文を有効にします。requires および contains は、package 構文内のみの指令です。8. helper は、"~のクラス ヘルパ" であることを示します。 9. reference は、関数または手続きへの参照を示します。10. operator は、class 演算子を示します。11. delayed 指令については、「ライブラリとパッケージ」に記載されています。12. platform、deprecated、experimental、および library は ヒント(または、警告)指令です。これらの指令は、コンパイル時に警告を生成します。
指令の種類
上述の指令の表でリストしたとおり、コンテキストを区別するタイプの指令を含め、Delphi には 2 つのタイプの指令があります。
1 つ目のコンテキストを区別する指令は、識別子になる可能性があり、通常はキーワードではありませんが、宣言の末尾に記述するとその宣言の意味を変更します。以下に例を示します。
procedure P; forward;
または
procedure M; virtual; override;
または
property Foo: Integer read FFoo write FFoo default 42;
2 つ目のタイプの指令は、公式なコンパイラ指令であり、コンパイラの動作に影響を与えるスイッチ(オプション)です。コンパイラ指令は、次のようにかっこ({})で囲み、先頭にドル記号($)を付けます。
{$POINTERMATH ON}
{$D+} // DEBUGINFO ON
他のタイプの指令と同様に、コンパイラ指令はキーワードではありません。コンパイラ指令の一覧については、「Delphi コンパイラ指令のリスト」を参照してください。
数値
整数および実数の定数を 10 進表記で表すには、カンマやスペースを含まない数字を並べ、その前に + または - の演算子を付けて符号を示します。値は、デフォルトでは正の数で(たとえば 67258 と +67258 は等価です)、あらかじめ定義された実数または整数の型の最大値の範囲内でなければなりません。
小数点や指数が付いた数は実数を、その他の数は整数を表します。実数の中に E または e の文字が入っている場合、"10 の~乗の~倍" を意味します。たとえば、7E2 は 7 * 10^2、12.25e+6 と 12.25e6 はどちらも 12.25 * 10^6 という意味になります。
$8F など、前にドル記号が付いたものは 16 進数を表します。前に単項演算子 - が付いていない 16 進数は、正の値と見なされます。代入時には、16 進数の値が代入先の型の範囲外であれば、エラーが発生します。ただし、Integer(32 ビット整数)の場合は例外で、警告が出されます。この場合、Integer の正の範囲を超えた値は、2 の補数の整数表現と同じ考え方で負の数と見なされます。
実数および整数の型の詳細は、「データ型について(Delphi)」を参照してください。数を表すデータ型の詳細は、「宣言済みの定数」を参照してください。
ラベル
識別子または負ではない整数値のどちらかを、ラベルとして使用できます。Delphi コンパイラでは、数値ラベルとして 0 から 4294967295(UInt32 の範囲)が使用できます。
ラベルは goto 文で使用します。goto 文とラベルに関する詳細については、「goto 文」(宣言と文」内)を参照してください。
文字列
文字列は、文字列リテラルや文字列定数とも呼ばれるもので、引用符付き文字列、制御文字列、あるいは引用符付き文字列と制御文字列の組み合わせで構成されます。区切り文字を使えるのは引用符付き文字列の中だけです。
引用符付き文字列は、連続する複数の文字で、ANSI またはマルチバイト文字セットの文字で構成され、1 行に記述し、アポストロフィで囲みます。アポストロフィの間に何も入っていない引用符付き文字列が NULL 文字列です。引用符付き文字列中でアポストロフィが 2 つ並んでいるものは、1 つの文字、つまりアポストロフィを表します。
文字列は、内部的には UTF-16 にエンコードされた Unicode 文字列として表現されます。基本多言語面(Basic Multilingual Plane:BMP)の文字は 2 バイトで表現され、BMP ではない文字は 4 バイトで表現されます。
以下に例を示します。
'Embarcadero' { Embarcadero }
'You''ll see' { You'll see }
'アプリケーションを Unicode 対応にする'
'''' { ' }
'' { null string }
' ' { a space }
制御文字列は、連続する複数の制御文字です。各制御文字は、# 記号の後ろに UTF-16 エンコードの 0 から 65,535 (10 進数)または $0 から $FFFF (16進数)の符号なし整数の定数を続けたもので、特定のコード値に対応する文字を表します。それぞれの整数値は、内部では 2 バイトの文字列で表現されます。これは、制御文字とマルチバイト文字を表現するのに役立ちます。次の制御文字列は、
#89#111#117
次の引用符付き文字列と等価です。
'You'
引用符付き文字列と制御文字列を組み合わせて、より大きな文字列を形成することができます。たとえば、
'Line 1'#13#10'Line 2'
のようにすると、'Line 1' と 'Line 2' の間に復帰改行を挿入できます。ただし、この方法で 2 つの引用符付き文字列を連結することはできません。連続する 2 つのアポストロフィは 1 つの文字と解釈されるためです (引用符付き文字列を連結するには、+ 演算子を使うか、単純に 1 つの引用符付き文字列にまとめます)。
1 文字の文字列は、任意の文字列型および PChar 型と互換性があります。AnsiString 型はマルチバイト文字を含む可能性があるため、1 文字、1 バイトまたはマルチバイトで構成される 1 文字の文字列は、任意の文字型と互換性があります。(コンパイラ指令 {$X+} によって)拡張構文が有効なときは、長さ n の空ではない文字列は、n 文字のゼロベース配列およびパック配列と互換性があります。詳細は、「データ型について(Delphi)」を参照してください。
コメントおよびコンパイラ指令
コメントは、(隣り合うトークンを区切る)区切り文字またはコンパイラ指令として機能している場合以外は、コンパイラに無視されます。
コメントを構成する方法はいくつかあります。
{ Text between left and right braces is a comment. }
(* Text between left-parenthesis-plus-asterisk and an
asterisk-plus-right-parenthesis is also a comment *)
// Text between double-slash and end of line is a comment.
同じ形式のコメントはネストできません。たとえば、(*{}*)
は機能します。後者の形式は、コメントを含むコード セクションをコメント アウトする場合に便利です。
次に、これらの 3 つのタイプのコメント文字を使う方法と状況について推奨事項を示します。
- ダブルスラッシュ(//)は、開発中に行った一時的な変更をコメント アウトするのに使用します。コード エディタの便利な
Ctrl+/
(スラッシュ)メカニズムを使用して、作業中にすばやくダブルスラッシュ コメント文字を挿入できます。 - かっことアスタリスクの組み合わせ "(*...*)" は、開発コメントおよび他のコメントを含むコード ブロックのコメント アウトに使用します。このコメント文字は、他のタイプのコメントを含む複数行のソースを許容し、コンパイラの考慮対象になりません。
- かっこ({})は、コードと共に保持する予定のソース内ドキュメントに使用します。
始まりの { または (* の直後にドル記号($)を含むコメントは、コンパイラ指令です。以下に例を示します。
{$WARNINGS OFF}
コンパイラに警告メッセージを生成しないよう指示することができます。
関連項目
- 式(Delphi)
- 宣言と文
- プログラムとユニット(「ユニット参照と uses 句」セクション)
- ライブラリとパッケージ(「遅延読み込み」セクション)