1. 記法: トークンと区切り文字
Pascal は トークン (記号) と 区切り文字 (分離子) で構成されます。トークン (Token) とは、プログラム内で意味を持つテキストの最小単位です。トークンには次のようなものがあります。
- 特殊シンボル (特殊記号)
- 予約語 (綴り記号)
- 識別子 (名前)
- 数値 (数)
- ラベル
- 指令 (指図)
区切り文字 (Separators) は空白かコメント (注釈) です。
See also:
1.1. 区切り文字 (Token Separators)
空白、改行 (行分離子/行末) 及びコメント (注釈) は 区切り文字 (分離子/字句分離符) です。Pascal のトークンの途中に区切り文字が存在するのはトークンが文字列である場合のみです。
コメント (Comment)
標準 Pascal の コメント (注釈) は {
で始まり }
で終わるブロックコメントだけですが、Delphi では //
から始まる行コメントも使えます 1。
{ これはコメントです }
// これはコメントです (Delphi)
Pascal の文法を理解してくると、行コメントは Pascal という言語には異質な存在と思えるようになってきます (多分)。
See also:
1.2. 特殊シンボルと予約語
特殊シンボル (Special-symbols)
標準 Pascal の特殊シンボル (特殊記号) は次の通りです。
# ' ( ) * + , - . / : ; < = > [ ] ↑ { }
Delphi の特殊シンボルは次の通りです。
# $ & ' ( ) * + , - . / : ; < = > @ [ ] ^ { }
オリジナルの Pascal が動作したコンピュータ (CDC 6000) には ↑
という文字がありました。他の処理系では @
または ^
で置き換えることが可能でした。以下の表は CDC の科学用 64 文字集合です。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | : | A | B | C | D | E | F | G | H | I |
10 | J | K | L | M | N | O | P | Q | R | S |
20 | T | U | V | W | X | Y | Z | 0 | 1 | 2 |
30 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | + | - | * |
40 | / | ( | ) | $ | = | , | . | ≡ | [ | |
50 | ] | % | ≠ | ↱ 2 | ∨ | ∧ | ↑ | ↓ 3 | < | > |
60 | ≤ | ≥ | ¬ | ; |
標準 Pascal では 「↑ と ^ は同じ文字を表しているけど、視認性が高いので (文章中では) ↑ を使うね」
という事になっています。また、Delphi では @
は演算子なので ^
の代わりに @
を使う事はできません。
特殊シンボルの一部は ダイグラフ(2 文字表記) で表す事ができます。
文字 (基準表現) |
ダイグラフ (代替表現) |
---|---|
{ | (* |
} | *) |
[ | (. |
] | .) |
つまり、ブロックコメント {
}
は (*
*)
として書くこともできます。 {
}
や [
]
キー (または文字) のないコンピュータでもダイグラフを使って文字を表現する事が可能になります。
文字代替における基準となる文字を 基準表現 (Reference Token)、それを代替する文字を 代替表現 (Alternative Token) と言います。
標準 Pascal ではダイグラフが機能するため、ブロックコメントを次のように書く事ができます。左ブラケットと右ブラケットが異なりますが、これで対になっています。
{ Comment *)
Delphi のブロックコメントでは異なる種類のブラケットを混在させる事はできません。しかし、別種類のブロックコメントを組み合わせる事により、ブロックコメントのネストを行う事ができます。
{
(* TEST *)
A := 1;
}
上記コードは標準 Pascal だと次のように解釈されてエラーになります。
A := 1;
}
予約語 (Word-symbol / Reserved-word)
標準 Pascal の 予約語 (綴り記号) は次の通りです。
and end nil set
array file not then
begin for of to
case function or type
const goto packed until
div if procedure var
do in program while
downto label record with
else mod repeat
Delphi (12.0 Athens 時点) の予約語は次の通りです。
and except label set
array exports library shl
as file mod shr
asm finalization nil string
begin finally not then
case for object threadvar
class function of to
const goto or try
constructor if packed type
destructor implementation procedure unit
dispinterface in program until
div inherited property uses
do initialization raise var
downto inline record while
else interface repeat with
end is resourcestring xor
※ at および on という単語も予約語として扱う必要があります。
See also:
- 特殊シンボル (DocWiki)
- ダイグラフ (Wikipedia)
- C++Builder とトライグラフ (Qiita)
- 予約語 (DocWiki)
- CDC display code (Wikipedia: en)
1.3. 識別子 (Identifiers)
識別子 (名前) は、定数、変数、フィールド、型、プロパティ、手続き、関数、プログラム、ユニット、ライブラリ、およびパッケージを表します。
標準 Pascal では識別子は英字で始まる英数字の組み合わせです。Delphi の場合、識別子にアンダーバー(_) が使え、Unicode 版 Delphi (Delphi 2009 以降) であればUnicode 文字も使えます。
Delphi の場合、識別子の長さに制限はありませんが、有効なのは最初の 255 文字だけです。標準 Pascal は実装依存ですが、最初の 8 文字しか有効でないものもあるようです。
Pascal は識別子の大文字と小文字を区別しないため HOGE
と hoge
と Hoge
は同じものとして扱われます。
予約語と同じ識別子を使う事はできませんが、Delphi では &
記号を使う事によって、そのキーワードを予約語として解釈しないようにする事ができます 4。例えば &and
とすると予約語として解釈しないため、変数名として使えるようになります。
See also:
1.4. 数値 (Numbers)
整数および実数を表す 数値 (数) は 10 進表示を用います。数値の先頭には符号 (+
または -
) を付ける事ができます。
123 -100 +0001
実数は小数点や指数、あるいはその両方を使って記述します。次の記述はいずれも実数です。
-0.1 5e-3 87.35E+8
Delphi の場合、先頭に $
の付いたものは 16 進値です。例えば $0A
は 10 進値で 10
となります。
$0A $007F $DEADBEEF
先頭に %
の付いたものは 2 進値です 5。例えば %100
は 10 進値で 4
となります。
%100 %1001001 %1000_1100_1001_0011
2 / 10 / 16 進数いずれの数値表現においても任意の位置で桁区切り文字 _
を挿入する事が可能となっています 5。
1.5. 文字列 (Character-strings)
文字列 は 文字列リテラル や 文字列定数 とも呼ばれるもので、引用符付き文字列として表現されます。引用符付き文字列は文字列をアポストロフィ (or シングルクォーテーション or 単一引用符) で囲み、単一行に記述します。引用符付き文字列内でアポストロフィを表したい場合にはアポストロフィを二つ並べます。
'a' ';' '3' 'begin' 'don''t'
文字列リテラルの要素数には制限があります。要素数の制限を超える文字列リテラルは +
演算子で連結して表現する必要があります。
'Hello,' + 'world.'
バージョン | 要素数 |
---|---|
Delphi 11 以前 | 255 文字 |
Delphi 12 以降 | 一行あたり 4K 文字 (エディタの制限) |
また、三重引用符を用いた複数行文字列も利用可能です 6。
const
MULTILINE_STR = '''
AAA
BBB
CCC
''';
AAA
BBB
CCC
文字列の開始位置は識別子の先頭の真下からです。次の例では各行の先頭にスペースが 2 つ入ります。
const
MULTILINE_STR = '''
AAA
BBB
CCC
''';
AAA
BBB
CCC
次のようなインデント位置はエラーとなります。
const
MULTILINE_STR = '''
AAA
BBB
CCC
''';
複数行文字列の改行をどう処理するかは {$TEXTBLOCK}
指令で指定できます。
(1.5.1.) 制御文字列
Delphi の場合 #数値
として、文字として表現できない文字を 制御文字 で記述する事ができます。例えば
#13#10
は [CR][LF] の改行コードとなります。制御文字は 16 進表記も可能で、
#$0D#$0A
と記述する事もできます。
(1.5.2.) キャレット記法 (Caret notation)
Delphi の場合、キャレット記法を使い、ASCII コードの制御文字を表す事ができます。キャレット記法とは ^(キャレット)
と英数記号の組み合わせによる記法です。
次の改行コード (制御文字) を含む文字列は
'Hello'#$0D#$0A'world'
次のように書き換える事ができます。
'Hello'^M^J'world'
See also:
1.6. ラベル (Labels)
標準 Pascal におけるラベルは、文に印を付けるための符号なし整数です。0~9999 の値が使えます。
Delphi におけるラベルは識別子または符号なし整数です。符号なし整数として 0~4294967295 の値が使えます。
ラベルは goto 文 で使用します。
1.7. 指令 (Directives)
指令 (指図) はソースコード内の特定の位置で区別される単語です。特定の位置でのみ予約語のように振る舞います。予約語ではないため、同じ名前の識別子を作る事も可能です (もちろん非推奨)。
標準 Pascal の指令は forward だけです (11.3 節)。
forward
先述の通り、指令と同じ名前の識別子を作る事が可能です。
program FWTEST(Output);
procedure Forward(v: Integer); forward;
procedure Test(v: Integer);
begin
Forward(v + 1);
end; { Test }
procedure Forward;
begin
Writeln(v);
end; { Forward }
begin
Test(1);
end.
Delphi (12.0 Athens 時点) の指令は次の通りです。
absolute final override safecal
abstract forward package sealed
assembler helper pascal static
automated implements platform stdcall
cdecl index private stored
contains inline protected strict
default library public unsafe
delayed local published varargs
deprecated message read virtual
dispid name readonly winapi
dynamic near reference write
experimental nodefault register writeonly
export operator reintroduce
external out requires
far overload resident
See also:
(1.7.1.) ヒント指令 (Hint directives)
Delphi には以下のヒント指令があり、型宣言、変数宣言、クラス、インターフェイス、構造体の宣言、クラスまたはレコード内のフィールド宣言、手続き、関数、メソッドの宣言、およびユニット宣言に適用できます。
platform deprecated library
ヒント指令 | 説明 |
---|---|
platform | シンボルまたはユニットに対する platform ヒント 指令は、そのシンボルまたはユニットが存在 しない可能性があること、 またはプラットフォームによって実装方法が かなり異なる可能性があることを示します。 |
deprecated | deprecated 指令は、使われなくなった項目、 つまり下位互換性のためにのみサポートされて いる項目を示します。 |
library | シンボルまたはユニットに対する library ヒント 指令は、コードが存在しない可能性があること、 またはライブラリのアーキテクチャによって 実装方法がかなり異なる可能性があることを 示します。 |
See also:
(1.7.2.) コンパイラ指令 (Compiler directives)
コンパイルオプションです。
クラシック Pascal である Pascal 6000 にもコンパイラ指令はありましたが、標準 Pascal では定義されていません。コンパイラ指令はブロックコメントとして書き、コメントブロックの先頭に $ を付けて記述します。
{$T+, P+}
Delphi でもコンパイラ指令をカンマで区切って複数並べる事が可能ですが、短い名前のコンパイラ指令に限られ、コンパイラ指令間にスペースを入れる事はできません。
See also:
(1.7.3.) 呼び出し規約に関連する指令
呼び出し規約に関わる指令は次の通りです。
cdecl pascal register safecall stdcall winapi
呼び出し規約については別記事にまとめています。
(1.8.) 属性 (Attributes)
属性は、追加情報を備えた特殊なオブジェクトによる型および型メンバの注釈付けを可能にする Delphi の言語機能です。
(1.8.1.) コンパイラ属性 (Compiler Attributes)
対象を限定したコンパイラ指令のようなものです 7。
(1.8.1.1.) [Ref] コンパイラ属性
定数パラメータ (const) を強制的に参照渡しさせます。
(1.8.1.2.) [Unsafe] コンパイラ属性
参照カウントに関連するコードを生成しないようにします。変数(メンバ)、関数の結果、関数や手続きのパラメータに指定できます。
関数の結果に [Unsafe] 属性を付けるには次のようにします。
[Result: Unsafe] function ReturnUnsafe: TObject;
Delphi 10.1 Berlin 以降で、すべてのプラットフォームで利用可能になりましたが、10.4 Sydney で ARC が廃止されたため、現在ではインターフェイス参照のためだけに利用されます。
(1.8.1.3.) [Volatile] コンパイラ属性
最適化による変数の破棄を防ぎます。C++ の volatile と同等です。変数、関数や手続きのパラメータ、レコード、クラスに対して指定できます。
簡単な例を挙げてみます。次のコードをコンパイルすると変数 i は使われていないためヒント (H2164) が出ます。
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
end;
[Volatile] 属性を付けるとヒントが出なくなります。
procedure TForm1.Button1Click(Sender: TObject);
var
[Volatile] i: Integer;
begin
end;
(1.8.1.4.) [Weak] コンパイラ属性
Delphi 10.1 Berlin 以降で、すべてのプラットフォームで利用可能になりましたが、10.4 Sydney で ARC が廃止されたため、現在ではインターフェイス参照のためだけに利用されます。
索引
[ ← 0. はじめに ] [ ↑ 目次へ ] [ → 2. データの概念: 単純データ型 ]