Object Pascal 入門
1. トークン
プログラムの作成は、テキストファイルに処理やデータを記述します。プログラムが書いてあるファイルをソースファイルといいます。書いてある内容をソースコードといいます。
ソースコードの最小単位をトークンといい、トークンには、予約語、修飾子、識別子、演算子、分離子、定数 があります。
トークンとはプログラムソースコードで意味を成す最小独立単位の記述です。
以下のシンボルで構成されます。
- 文字: A〜Z, a〜z
- 数字: 0〜9 16進数は 0〜9, A〜F, a〜f
- 特殊記号: ' + - * / = < > [ ] . , ( ) : ^ @ { } $ # & %
- ペア記号: << >> ** <> >< <= >= := += -= *= /= (* *) (. .) //
プログラムの中には、コメント(注釈)の記述も可能で、コンパイラはコメント内の記述を無視するため、上記シンボルに含まれない日本語などのマルチバイトコードの記述も可能です。
ObjectPascalのトークンには次ののものがあります。
- 予約語 (reserved words)
プログラム言語の中で固定的な意味を持つ名前です。変更や再定義はできません。
- 修飾子 (modifiers)
コンパイラが事前に定義しているシンボルの名前です。特別な意味を持ちますが再定義が可能です。
- 識別子 (identifiers)
プログラマが定義するシンボルの名前です。言語のスコープルールがあります。
- 演算子 (operators)
数値演算や論理演算など演算を表す記号です。+, -. * などです。
- 分離子 (separators)
空白, 改行, タブ などです。コメントも分離子になります。
- 定数 (constants)
数値や文字の値をソースコード内に直接記述したものです。
識別子で定義された定数と区別するため、数値や文字列で直接記述されたものをリテラル(literal)または直値と呼びます。
Object Pascal ではトークンの大文字と小文字は区別されません。予約語や識別子は大文字と小文字の任意の組み合わせで記述可能です。
大文字・小文字の違いであれば同一のものとして扱います。
ThreadVar と threadvar は同じ予約語となります。MyData と mydata も同じ識別子となります。
文字列の定数の場合は、上記シンボルに含まれない日本語などのマルチバイトコードの記述も可能です。識別子ではなくデータとなるためです。
ただし、コメントとは違い、文字列データはソースコードのコードページ(エンコーディング)と矛盾のない文字列である必要があります。
矛盾があるとコンパイルエラーになる場合があります。
予約語は、Object Pascal 言語の一部であるため、プログラマーが再定義することはできません。
以下は、Object Pascal (OBJFPCモード)の予約語です。
and
array
as
asm
begin
case
class
const
constructor
destructor
dispinterface
div
do
downto |
else
end
except
exports
file
finalization
finally
for
function
goto
if
implementation
in
inherited |
initialization
inline
interface
is
label
library
mod
nil
not
object
of
on
operator
or |
out
packed
procedure
program
property
raise
record
repeat
resourcestring
self
set
shl
shr
string |
then
threadvar
to
try
type
unit
until
uses
var
while
with
xor |
予約語を & 記号でエスケープすることで、識別子として使用することができますが、予約語リストが変更されたときにどの移行時対応など以外では使用を避けるべきです。
&label はユーザ定義の識別子として定義されます。予約語の label は影響を受けません。
修飾子は、特定の場所ではコンパイラにとって特別な意味を持つ識別子となります。コンパイラはそれらを Object Pascal 言語の一部と見なします。
以下は、Object Pascal (OBJFPCモード)の修飾子です。
absolute
abstract
alias
assembler
break
cdecl
continue
cppdecl
default
deprecated
dynamic |
enumerator
experimental
far
far16
forward
generic
helper
implements
index
interrupt
iocheck |
local
message
name
near
nodefault
noreturn
nostackframe
oldfpccall
overload
override
pascal |
platform
private
protected
published
read
register
reintroduce
result
safecall
saveregisters
softfloat |
specialize
static
stdcall
stored
strict
unaligned
unimplemented
varargs
virtual
winapi
write |
修飾子は、予約語ではないため、プログラマーが再定義することができます。再定義すると本来の意味は失います。混乱が生じるため再定義は避けるべきです。
識別子は、特定の定数、型、変数、手続き、関数、ユニット、プログラムに付けるプログラマー定義の名前です。ソースコード内のすべてのプログラマー定義の名前は、識別子となります。
予約語と同じ識別子は定義できません。
識別子は、文字(A〜Z, a〜z)、数字(0〜9)、アンダースコア(_)で構成され、最初の文字は文字(A〜Z, a〜z)、アンダースコア(_) でなければなりません。
■ 正しい識別子
MyData
_Data10
Test_Data
Sanda_vs_Gaira
mydata (MyDataと同じ)
■ 正しくない識別子
12month (数字で始まっている)
Test-Data (ハイフン(-)は使用不可)
Testデータ (漢字などマルチバイト文字は不可)
Testデータ (半角カナなど文字コード128以上は不可)
array (予約語と同じ)
演算子は、演算項(operand)と組み合わせて式を構成します。演算項は変数(識別子)や定数や関数です。演算では演算結果が返されます。式の各演算をすべて実行した結果が式の演算結果となります。
数学の式と近いイメージですが、式の書き方は Object Pascal で定義された演算子を使用して構成します。演算子の優先順位も Object Pascal で定義されています。
Y := (Data1 + 30) * X
Data1 に 30 を加算し、それに X を乗じます。
+, * は演算子で、Data1, 30, X は演算項です。
() で演算の優先順位を変える事ができます。
:= は代入を表し、Y の値を式の結果で置き換えます。
分離子は、空白, 改行, タブなどです。コメントも分離子になります。
トークンがそれぞれ認識できるように、それらを区切るために使用されます。
接していても独立して解釈できる場合は区切子を挟まなくても大丈夫です。
program test; は、 programtest; とすると意味が変るか解釈不能となります。program と test の間は分離子が必要です。test と ; の間は分離子は不要です。分離子を挟んでも問題ありません。
コメントは、コンパイラが完全に無視するソースコードです。プログラマが注釈を書くために使用されます。コンパイラはコメントが存在しないものとして処理しますが、分離子扱いになるので、コメントの両端にあるトークンがコンパイラにより連結されてしまうことはありません。コメント自体が空白文字一つに置き換わる感じです。
コメントの書き方は以下のものがあります。
■ { と } で囲む。複数行に対応します。
{ これはコメントです }
{
これも
コメントです。
}
■ (* と *) で囲む。複数行に対応します。
(* これはコメントです *)
(*
これも
コメントです。
*)
■ // から文末まで。単一行のみで複数行には対応しません。
//これはコメントです
WriteLn('Hello'); // これもコメントです。
「WiriteLn('Hello');」 はコメントではありません。//以降がコメントになります。
入れ子のコメント { { コメント } } や (* (* コメント *) *)はエラーにはなりませんが警告(Warning)が出ます。これは避けるべきです。
{ } と (* *) で入れ子にすることは問題ありません。
(*
以下のコメント全体をコメント化
{ これはコメントです }
*)
{
以下のコメント全体をコメント化
(* これはコメントです *)
}
{
WriteLnも含めて丸ごとコメント化
WriteLn('Hello'); // これもコメントです。
}
{ ... } と (* ... *) はどちらも同様にコメントを表しますが、Object Pascal では { ...*) や (* ... } の組合せはできません。コメントを開始しますが同じ組合せの記号が現れるまでコメントが終了しません。
標準パスカルでは、{ ... *) や (* ... } も正しいコメントとして定義されています。
// の後(同一行)に {, }, (*, *), // があってもそれらはすべてコメントになるため無視されます。
数値には、整数値と実数値があります。既定では10進表記(基数 10)で表します。数値の先頭には符号( + または - )をつけることができます。
実数は、指数表記(E表記)で小数点か指数部、あるいはその両方を持ちます。どちらもないと実数にはなりません。
実数は、m × 10
n (mは仮数部, nは指数部)を、小数点を持つ仮数部か、それに指数部をつけたものになります。指数部がついた場合、仮数部に小数点がなくても大丈夫です。指数部は、文字Eと10のべき乗の数値を指定します。仮数部、指数部の数値とも符号を持つことができます。
1.234 × 10
2 は 1.234E2 と書きます。
整数は、小数点も指数部も持ちません。
■ 正しい数値リテラル
1000 -5464 434453 +900
3.14 -0.1 563.5 1000.
1E30 1.E30 0.3433E+12 -344.3E0 0.0045E-15
1000 は整数で、1000. (小数点付き)は実数です。
■ 正しくない数値リテラル
1,000,000 .5 -.5 E30 E+30
カンマ(,)はつけられません。小数点の前には数値が1つ以上必要です。
指数部だけでは不可です。E30 は指数部ではなく、E30 という名前の識別子となります。E+30 はEという識別子(変数)と 30 の加算式になります。
10進表記の数値は、符号を除いた数値部分が数字で始まる必要があります。
16進表記(基数 16)で表された数値の前に $ をつけます。
$10 は10進数の16。$FF は10進数の255。大文字小文字は区別されません。$ff は $FF と同じです。
小数点を付けることはできません(実数はありません)。
符号( + または - )をつける場合は、$の前。
8進表記(基数 8)で表された数値の前に & をつけます。
&10 は10進数の8。&377 は10進数の255。
小数点を付けることはできません(実数はありません)。
符号( + または - )をつける場合は、&の前。
2進表記(基数 2)で表された数値の前に % をつけます。
%10 は10進数の2。%11111111 は10進数の255。
小数点を付けることはできません(実数はありません)。
符号( + または - )をつける場合は、&の前。
文字列は、ソース コードの1行内に一重引用符(')で囲まれた 0 個以上の文字の列です。文字列の途中で改行することはできません。
一重引用符の組('')の間に何も含まれないものを空の文字列といいます。
シングルバイトのASCIIコード1文字の場合は、文字列としても扱いますが単一の文字として扱うこともできます。'A' は文字列でもあり、単一の文字でもあります。
マルチバイト文字の 'あ' は私達にとっては1文字ですが、現在の Free Pascal コンパイラにとっては1文字のリテラルとしては扱えず文字列になります。
文字列の中に文字として一重引用符(')を入れたい場合は、一重引用符を続けて2回入力します。
I'm a boy. を文字列で表現すると、'I''m a boy.' となります。
ソースコードの中に {$CODEPAGE UTF8} を設定をしてソースファイルを UTF-8 で作成している場合、漢字などマルチバイトの文字を含めることができます。
'Pascal プログラム' も正しい文字列になります。文字列の中には空白文字(コード:32)をそのまま含めることもできます。
タブコードや改行コードなどの制御文字を含めたいときは、制御文字コードの前に # 記号を付けて文字列と連結します。
'ABCXYZ' で、ABCとXYZの間にタブコード(コード:9)を挿入したいときは、'ABC' と #9 と 'XYZ' を連列して、'ABD'#9'ZYX' とします。
#9 の前後に空白などの分離子を挟むことはできません。'ABC' #9 'XYZ' はエラーとなります。
制御文字コードは複数連結することも可能で、途中だけではなく先頭や末尾につけることも可能です。
Windowsの場合、改行コードは CR(コード:13)とLF(コード:10) なので、'XYZ'#13#10 とすると XYZ[改行] となります。
'1行目'#13#10'2行目' とすると2行の文字列となります。
制御文字以外の文字にも # と文字コードの組合せは可能です。
一重引用符の文字コードは 39 なので、'I''m a boy.' は 'I'#39'm a boy.' としても同じ文字列になります。
文字コードを 16進表記でかくこともできます。
'1行目'#13#10'2行目' は '1行目'#$0D#$0A'2行目' または '1行目'#$D#$A'2行目' としても同じ文字列になります。
同様に 8進表記や2進表記の使用も可能です。
'ABD'#9'ZYX と 'ABD'#$9'ZYX'' と 'ABD'#&11'ZYX' と 'ABD'#%1001'ZYX' は同じ文字列になります。
キャレット文字(^)とアルファベット1文字(A〜Z, a〜z)を使用した制御文字の表現もあります。アルファベットは大文字小文字の区別はありません。
^A, ^B, .... ^Z は、#1, #2, ... #26 と同じになります。'ABD'^I'ZYX' は 'ABD'#9'ZYX' と同じ文字列になります。