Cabezon 言語仕様書(Ver0.08)

Copyright (C) 1990-98 徳丸 浩/ockeghem

1.はじめに

1.1 カベソン(Cabezon)とは?

 カベソンは自己記述可能なことを目標としているPascalコンパイラ作成のプロジェクトです。Pascalのソースを読み込んでMASMのアセンブリソースを出力することにより、8086のネイティブ・コードを生成します。

2.言語の概要

 前述の様にCabezonはPascalサブセットとして設計されています。以下の説明では、イェンゼン、ヴィルト著「Pascal」原書第3版、培風館の流れにしたがって、ISO標準Pascalとの差異について説明していきます。

2.1 型

boolean         ◎
char            ◎
integer         ◎
real            ◎
列挙型          ◎
部分範囲型      ◎
配列型          ◎
レコード型      ◎(可変レコードを含めて、実装済み)
集合型          ×(当面、実装の予定はありません)
ファイル型      △(textのみ実装済み)
ポインタ型      ◎

【拡張仕様】

string 型        ◎(後述)

【記号の意味】

        ◎  :  フルセット実装
        ○  :  一部に手抜きあり
        ×  :  未実装

2.2 式

 算術演算子(+ - * / mod div 符号反転) ◎ 論理演算子(and or not) ◎ 集合演算子(+ - *) × 関係演算子(= <><=>= <> in) ○(集合に対する操作が未) 関数呼出 ○(2.3参照)

2.3 手続き呼出

 手続き呼出は、関数や手続きを引数としてとる機能を除いて、完全にサポートしています。上記制限は関数呼び出しにも当てはまります。

2.4 構造文、goto 文

  if            ◎
  case          ◎
  while         ◎
  repeat        ◎
  for           ◎
  with          ◎
  goto          ◎

4.記号と記号分離子

4.1 名前

 名前は先頭の 31 文字までを判定して、残りは無視しています。名前と予約語については、大文字と小文字の区別をしません。大文字と小文字を区別しないというのは ISO 規格の要求です。外部名は、全て大文字に変換されます。 名前として全角文字を用いることもできます。

4.2 予約語

    AND         ARRAY       BEGIN       CASE        CONST
    DIV         DO          DOWNTO      ELSE        END
    EVERY       (EXIT)      (FILE)      FOR         FUNCTION
    GOTO        HUGE        IF          IMPLEMENTATION
    (IN)        INTERFACE   LABEL       LEAVE       MOD
    NIL         NOT         OF          OR          OTHERWISE
    PACKED      PROCEDURE   PROGRAM     RECORD      REPEAT
    RETURN      (SET)       (STEP)      STRING      THEN
    TO          TYPE        UNIT        UNTIL       USES
    VAR         WHILE       WITH        XOR

【説明】 括弧内のものは、予約語としての判定は行っていますが、未実装のものです。

6.型

6.1 基底型 以下の基底型があります。

  char      1バイト
  boolean   1バイト
 (byte)     1バイト
  integer   2バイト
  real      8バイト(IEEE倍精度)

byte 型は標準名としては定義されていません。byte 型変数を使用する際には、型定義機能を使って、

type
    byte = 0..255;

と定義して下さい。0から255の範囲に収る部分範囲型であれば、自動的に byte 型としての処理を行います。これは、char 型や列挙型の値を ord 関数で 整数に変換した場合も同様です。 byte 型と integer 型は適合性 (compatibility) があり、文脈に応じて自動 的に相互変換されます。4則演算 (+ - * div mod) では、byte 型から integer 型に型変換してから演算します。ビット演算 (and or xor not) と比較に関して は、byte 型のままで演算します。 byte 型から integer 型への変換は上位ビットに0をつめます。integer 型か ら byte 型への変換は、単に上位ビットを無視するだけです。

6.2 列挙型、部分範囲型

 標準Pascalと同じ定義の列挙型と部分範囲型があります。型のサイズは 1バイトまたは2バイトであり、順序数が0から255に収る場合に1バイトに とられます。 可変レコードもサポートしており、タグ変数の省略も(ISO標準通り)可能 です。

6.3 配列型、レコード型

 配列型とレコード型は標準Pascalと同じです。 レコードの場合は、 integer と real またはこれらを含む構造型に関して、 ワード単位の境界合わせを行います。従って、レコード内に未使用の隙間があく ことがあります。 packed array[1..n] of char を文字列として扱う機能はありません。これは 後述の string 型があるためですが、ISO標準との互換性のため、将来サポー トするつもりです。 配列型宣言の前に huge を指定すると、32K バイトを越える配列が利用でき ます。huge 配列は、手続きの中に宣言することはできません。最も外側のブロッ クで宣言するか、ポインタとして宣言して、手続き new で領域を割り当てます。 huge 配列の要素型は 32K バイトまで、要素数は 32767 までです。その他、 MS-DOS の空きメモリ(コンベンショナルメモリ)の制約を受けます。 huge 指定は配列にのみ可能です。

6.4 string 型

 ISO標準に対する拡張として、string 型があります。

【定義】

  形式-1      string[ 定数 ] of 型 ;
  形式-2      string[ 定数 ];

形式-2は、string[ 定数 ] of char の省略形です。また、”型”の部分に は任意の型定義を記述できます。 string 型は、概ね以下の様な構造と考えて下さい。

        record
            length : integer;
            名前なし : array[1.. 定数 ] of 型
        end;

string 型は実行時に長さの変化する「列」をモデル化したものです。このよ うなものには、文字列のほかに、点列、折れ線、線形リスト、スタックなどがあ ります。 string 型変数の操作には、代入、手続きの引数、関数の戻り値(後述)、メ ンバへのアクセスがあります。 string 型変数のメンバのアクセスは、次の通りです。

        現在の長さの参照        変数名 .length
        n番目の要素の参照      変数名 [n]

これらは、右辺値としても、左辺値としても使用できます。

特別な型として、string[ 定数 ] of char があります。この型をカベソン言 語の「文字列」と定義します。 文字列に対しては、上記の string 型の操作が全て行えることに加えて、比較 演算子が使用でき、アポストロフィで囲んだ文字の列を、文字列定数として扱う ことができます。 文字列の操作は、Turbo Pascal に準拠した下記のものがあります。

(1)連結

+の記号で、文字列の連結を行います。これは Turbo Pascal などの仕様と同 じです。実装上の文字列長の制限はありません。1000 文字どうしを連結して、 2000 文字の文字列を作るというようなことも可能です。但し、スタックの容量 の制限を受けます。

【例】
        a := a + 'abc';

(2)部分文字列

 組込関数 Copy で部分文字列を取り出すことができます。 Copy(s : string; index, count : integer) : string; 文字列 s の index 文字目から count 文字だけを返します。文字列長の制限 はありません。 (3)部分文字列の探索 組込関数 Pos で、部分文字列の探索を行えます。 Pos(sub, str : string) : integer; 文字列 str 中に文字列 sub の位置を返します。sub がない場合は 0 を返し ます。 【文字列定数の使用例】

var
    str = string[30] of char;       (* string[30] でも同じ *)

begin
    ...

    str := 'this is a pen.';
    ..

文字列に限らず、string 型の適合性 (compatibility) は、要素型の適合性の みで判断します。従って、上記の様に長さの異なる文字列でも、代入可能です。 'a' のように、1文字からなる文字列定数は、文字定数としても解釈できます が、これらの区別はコンパイラが文脈から判断します。

6.5 ファイル型

 ファイル型はtext型のみサポートしています。

6.6 集合型

集合型はサポートしていません。プライオリティとしても、最後に回すことに なります[*1]。 カベソンの究極の目標は、自己記述可能なコンパイラを作成することですが、 使用できる技術、時間、CPU、OS等から判断して、集合型を目標の機能から 外しました。したがって、カベソンコンパイラ自体も集合型を使用しないで記述 しています。 標準Pascalにあって、カベソンにないのは集合だけなので、余裕と興味 があれば、実装するかもしれません。

6.7 ポインタ型

ポインタ型は実装済みで、Ver0.03 からは、標準手続き new/dispose が使用 できるようになりました。

6.8 型の適合性

2つの型がある場合に、下記条件のうちどれか1つを満足するものがあれば、 2つの型は適合していると定義します。

  1. 2つの型が同一である。
  2. 一方の型がもう一方の型の部分範囲であるか、両方が同じ型の部分範囲で ある。
  3. 両方が string 型で、要素の型が適合している。

[*1] 但し、構文解析と意味解析の一部は、現状でも行っています

7.変数

変数の定義はISO規格に準拠していますが、バッファ変数には対応していません。

8.式

8.1 演算子

加減演算子に、排他的論理和 xor が追加されています。演算子の優先順位は +, -, or と同じです。

8.2 ビット演算

論理演算子 (and or xor not) を整数に対して使用することができ、この場合 は、ビット演算を行います。ビットシフトには対応していませんが、将来は組込 関数として対応予定です。 ビット演算は将来組込関数にして、論理演算子をビット演算にも使用する機能 は削除する予定です。

8.3 演算の評価順序

ISO規格では、演算の評価順序や、演算の途中で式の値が定まった場合の、 残りの式の評価の有無は、処理系定義となっています。 カベソンでは、論理演算子 and or についてのみ、式の評価順序を保証します。 すなわち、and と or については、左から右に評価していき、式の値が定まった ところで、評価を打切ります。これは、C言語の論理 and、論理 or と同等の 規則です。但し、and や or がビット演算子して使用される場合には、これらの 保証はありません。 関数・手続きの引数は、現状の処理系では、左から右に評価していますが、将 来変更する可能性があるため、式の評価順序を仮定することは禁止します。

9.文

9.1 goto 文

ISO-Pascal準拠の goto をサポートしています。ブロックの飛出し も可能です。 goto ラベルには数字だけでなく、名前を使用することもできます。

【例】

label
    exitMainLoop;
begin
    ...


        goto exitMainLoop;
    ...

   exitMainLoop:

9.2 case 文

ISO標準に対する拡張として、対応する選択肢が存在しなかった場合の飛び 先、otherwise を設けています。逆に otherwise 節を記述しない場合に、対応 する選択肢が存在しない場合は、実行時エラーとします。これは標準Pasca lでは常識ですが、最近のPascalではエラーにしないものも多くあり、そ のことを仮定したプログラムも多く存在するようなので、敢えて明記しておきま す。 したがって、選択肢に該当しない場合にやるべきことがない場合でも、空の otherwise 節を置いて下さい。

9.3 for 文

ISO標準の書法に加えて、下記の書法を追加しています。 for 制御変数 every 型名 do 文 【注意1】 制御変数は、型名と一致する型でなければなりません。適合するだけではだめ ですので、注意して下さい。 【注意2】 for 文を抜けた後の制御変数の値は、終値+1(downto の場合は-1)にな ります。ISO規格では、for 文から抜けた時の制御変数は「不定」と定義され ており、カベソンではたまたま+1の値になるということです[*2]。但し、for 文から goto で抜けた場合は、その時の制御変数の値が保存されます。 上記の制御変数に関する振舞は、性能向上を目的として、将来変更する可能性 があります。

【例】

type
    color = (blue, red, black, white);
var
    c : color;
    m : array[color] of integer;
begin
    ...
    for c every color do
        m[c] := 0;
    ...

for ~ every 構文は、日経 MIX の pascal 会議で、ogochan こと生越昌己 氏から提案されたものであることを付記しておきます。

9.4 with 文

with 文は実装済みです。 [*2] 処理系依存の部分は、将来仕様を変更する可能性があります。

10.ブロック、有効範囲および駆動

ブロックや有効範囲の定義はISO標準に準拠しています。

11.手続きと関数

11.1 関数宣言と手続き宣言

関数・手続きは、”前方宣言”や”外部宣言”を用いて宣言できます。前方宣 言は(標準Pascalにある)forward を使って、外部宣言は external を使っ て示します。

【例】

procedure abc;
begin
    ...
end;

procedure def(a, b, c : integer); forward;

procedure ghi(x, y, z : integer); external;

function xyz(x : real) : integer; external;

 外部宣言とは、関数・手続き本体が別のモジュールで定義されていることを示すもので、通常はアセンブリ言語とのリンクに使用します。
 forward 宣言された関数や手続きは、関数・手続きの本体は後のほうで定義されていることを示します。ISO規格では、この後の方の宣言では、仮引数並びや関数の戻り値の型を記述しないことになっています。しかし、これでは可読性が悪くなる可能性があるので、カベソンでは、ISO標準に対する拡張として、forward 宣言した関数・手続きの本体を定義するときにも、引数並びや関数の戻り値の型を記述できることになっています。
 この場合、forward 宣言と後の宣言では、仮引数名や型は全く同一でなければなりません。また、引数を途中まで記述して、後を省略することも許されません。従来のPascalの様に、引数並びを省略することも、当然のことながら可能です。

11.2 関数の型

ISO規格に対する拡張として、関数の型には file 型以外の全ての型を指定 できます。 この機能の典型的な利用法は、文字列を返す関数ですが、それに限定されるわ けではありません。

11.3 仮引数

ISO規格流の整合配列はサポートしていません。 引数は値引数と変数引数のみで、関数引数や手続き引数はサポートしていませ ん。

11.4 実値引数

仮引数と実引数は適合していなければなりません。

11.5 実変数引数

仮引数と実変数引数は同一の型でなければなりません。

11.6 宣言済み手続き・関数

11.6.1 入出力手続き

        read(v1, v2, ...)   又は        read(file1, v1, v2, ...)
        readln(v1, v2, ...)             readln(file1, v1, v2, ...)

        write(exp1, exp2, ...)          write(file1, exp1, exp2, ...)
        writeln(exp1, exp2, ...)        writeln(file1, exp1, epx2, ...)

        eof(f)
これらは標準Pascalと同じ機能をもつ。但し、下記の制約があります。

11.6.2 算術関数

        abs(x)      引数の絶対値を返す。引数の型は integer または real。
        ln(x)       自然対数
        sqrt(x)     平方根
        max(a, b)   a と b の最大値を返す。a, b は整数型。
        min(a, b)   a と b の最小値を返す。a, b は整数型。

abs は、引数の絶対値を返す。結果は引数の型と同じです。
ln と sqrt は、それぞれ自然対数と平方根を返します。結果は real になります。

11.6.3 変換関数

        trunc(x)    real の引数を、切捨てにより integer に変換する。
        round(x)    real の引数を、四捨五入により integer に変換する。
        str(n, str) 整数 n を示す文字列を str に返す
        upcase(ch)  ch は文字変数。もし ch が小文字であれば、大文字に変
                    換した文字を返す。さもなければ、ch をそのまま返す。

11.6.4 順序関数

        ord(x)      任意の順序型を引数に取り、その順序数を返す。
        chr(x)      integer 型を引数に取り、対応する文字を返す。

11.6.5 その他

        paramCount  コマンド行のパラメータの数を integer 型で返す
        paramStr(n) n 番目のコマンド行パラメータを string 型で返す。n ≧
                    1。
        randomize   乱数系列の初期化を行う。初期化はシステム・クロックに
                    より、ランダムに行う。
        random(n)   0~n-1の乱数を返す。

        copy(s, a, n)   文字列 s の a 番目から n 文字を返す。
        pos(s1, s2)     文字列 s2 中に最初に現れる文字列 s1 の位置を整数
                        型で返す。s1 がない場合は、0を返す。
        cpos(ch, s2)    文字列 s2 中に最初に現れる文字 ch の位置を整数型
                        で返す。ch がない場合は、0を返す。

        halt(n)         プログラムを強制終了する。nは MS-DOS に返すリターンコードである。
        getdate(var year, month, day, dayofweek: integer)
            現在の日付けを返す

        gettime(var hour, min, sec, sec100: integer)
            現在の時刻を返す

13.プログラムまたはユニット

カベソンはISO規格に対する拡張として、unitによる分割コンパイルを サポートしています。 1つのPascalプログラムは1つの program と0個以上の unit からな ります。program や unit がPascalソースファイルを構成する単位となり ます。 program と unit は下記の様な構文になっています。

  プログラム  =  プログラム頭部 ";" [uses節] ブロック.
  ユニット    =  ユニット頭部 ";" インターフェース部 実現部 "end" ".".

  プログラム頭部  =  "program" プログラム名 ["(" 名前並び ")"].
  名前並び  =  識別名 {"," 識別名}.

  ユニット頭部    =  "unit" ユニット名.
  インターフェース部  =  "interface" [uses節] [定数定義部] [型定義部]
                          [変数宣言部] [手続き・関数頭部].

  実現部  =  "implementation" [uses節] [定数定義部] [型定義部]
                  [変数宣言部] [手続き・関数宣言部].

  uess節      =  "uses" 識別名 {"," 識別名} ";".

  定数定義部  =  "const" 定数定義 ";" {定数定義 ";"}.
  定数定義  =  識別名 "=" 定数.
  型定義部  =  "type" 型定義 ";" {型定義 ";"}.
  型定義    =  識別名 "=" 型.
  変数宣言部  =  "var" 定数定義 ";" {定数定義 ";"}.
  変数宣言  =  名前並び ":" 型.

  手続き・関数頭部  =  (手続き頭部 | 関数頭部) ";" {手続き・関数頭部 ";"}.
  手続き頭部  =  "procedure" 識別名 [引数リスト].
  関数頭部  =  "function" 識別名 [引数リスト].
  引数リスト  =  識別名 {"," 識別名}.

  手続き・関数宣言部  =  (手続き宣言部 | 関数宣言部) {手続き関数宣言部}.
  手続き宣言部  =  手続き頭部 ";" (ブロック | "forward" | "external") ";".
  関数宣言部  =  関数頭部 ";" (ブロック | "forward" | "external") ";".

unitのインターフェース部で宣言された定数、型、変数、関数・手続きは、そのunitをuseするプログラムまたはたのunitに対してパブリックであるといえます。それに対して、インターフェース部で宣言されていない、定数、型、変数、関数・手続きはそのunit内でしか使用できないため、プライベートであるといえます。この機能を利用して、情報を隠蔽することが可能です。

インターフェース部で宣言された関数・手続きは、一種のforward宣言がされているのと同じです。従って、実現部ではこれらの関数・手続きを任意の位置で定義することができます。引数に関しても、forward 宣言のときと同じように、実現部で記述してもしなくてもかまいません。一方、インターフェース部で宣言された関数・手続きを実現部で forward 宣言することはできませんし、その必要もありません。

14.入出力機能について

14.入出力機能について カベソンの入出力機能の仕様は、Turbo Pascal に準拠しています。 (1)assign ファイル変数と実ファイルの割当ては、手続き assign で行います。 assign(var f : text; name : string[64]); f : テキスト型のファイル変数 name : ファイル名 (2)reset、rewrite reset、rewrite は標準 Pascal と同じ書式です。 reset(var f : text); rewrite(var f : text); reset、rewrite に先立って、ファイル変数に、assign でファイル名を割当て ておく必要があります。assign で空文字列、すなわち '' が割当てられていた 場合には、下記のファイルを指定したことになります。 reset 標準入力 rewrite 標準出力 (3)close 標準Pascalと異なり、ファイルは明示的にクローズする必要があります。 明示的なクローズは、手続き close を使って行います。 close(var f : text) オープン中のファイルを reset または rewrite する場合は、明示的な close を実行せずに reset/rewrite を行うことができます。 (4)エラー処理について 手続き reset、rewrite、read(ln)、write(ln)、close では、実行時エラーが 発生する可能性があります。デフォルトでは、エラー発生時には、組込のエラー 処理ルーチンにより、エラー内容とアドレスが表示され処理を中止します。メッ セージは以下のようなものです。 Run time error XXX at SSSS:OOOO. XXX エラーコード(10進) SSSS:OOOO エラー発生アドレス(16進) エラーコードの内容は、付録Cにまとめてあります。 エラー発生アドレスからソースプログラム上のエラー箇所を見つけるには、下 記の手順にしたがって下さい。 まず、リンク時に作成されるMAPファイルから、どのユニット(ソースファ イル)でエラーが発生したかが分ります。カベソンではユニットとセグメントが 1対1に対応していますから、エラーが発生したセグメント(SSSS で示した部 分)から、ソースファイルを見つけて下さい。 つぎに、より詳しいエラー箇所を見つけるには次のようにします。上記の手順 で切りわけたソースファイルを、下記の方法で再コンパイルします。 A>CAB /L /S ファイル名 これにより、アセンブル・リスト(.LST ファイル)が生成されますから、こ れとエラー発生アドレスのオフセット部(OOOO で示した部分)からエラーの発 生箇所が分ります。但し、この際に注意して欲しいことがあります。それは、表 示されるアドレスは、エラーが発生した文の、その次の文を指していることです。 デフォルトのエラーチェックを禁止するには、コンパイル指令 {$I-} を使用 します。{$I-} が指定された状態で、エラーが発生したかどうかは、関数 ioresult で知ることができます。 function ioresult : integer; (* エラーコードを返す *) I/Oエラーが発生したにもかかわらず、ioresult が呼ばれない状態では、 すべてのI/O処理は無視されます。ioresult を呼出すと、内部的なエラーフ ラグを解除するため、次のI/O処理を行うことができます。

【例】

    assign(f, fileName);    (* assignではエラーは発生しない *)
    {$I-}                   (* エラーチェックの解除     *)
    reset(f);               (* resetではエラーが発生し得る  *)
    {$I+}                   (* エラーチェックの再開     *)
    code := ioresult;       (* エラーコードを得る       *)
    if code <> 0 then
        エラー処理

14.入出力機能について

カベソンの入出力機能の仕様は、Turbo Pascal に準拠しています。

(1)assign

ファイル変数と実ファイルの割当ては、手続き assign で行います。

        assign(var f : text; name : string[64]);

            f : テキスト型のファイル変数
            name : ファイル名

(2)reset、rewrite

reset、rewrite は標準 Pascal と同じ書式です。 reset(var f : text); rewrite(var f : text); reset、rewrite に先立って、ファイル変数に、assign でファイル名を割当て ておく必要があります。assign で空文字列、すなわち '' が割当てられていた 場合には、下記のファイルを指定したことになります。

    reset 標準入力 
    rewrite 標準出力 

(3)close

標準Pascalと異なり、ファイルは明示的にクローズする必要があります。 明示的なクローズは、手続き close を使って行います。

        close(var f : text)
オープン中のファイルを reset または rewrite する場合は、明示的な closeを実行せずに reset/rewrite を行うことができます。

(4)エラー処理について

 手続き reset、rewrite、read(ln)、write(ln)、close では、実行時エラーが発生する可能性があります。デフォルトでは、エラー発生時には、組込のエラー処理ルーチンにより、エラー内容とアドレスが表示され処理を中止します。メッセージは以下のようなものです。

Run time error XXX at SSSS:OOOO.

XXX             エラーコード(10進)
SSSS:OOOO       エラー発生アドレス(16進)

エラーコードの内容は、付録Cにまとめてあります。 エラー発生アドレスからソースプログラム上のエラー箇所を見つけるには、下記の手順にしたがって下さい。 まず、リンク時に作成されるMAPファイルから、どのユニット(ソースファイル)でエラーが発生したかが分ります。カベソンではユニットとセグメントが1対1に対応していますから、エラーが発生したセグメント(SSSS で示した部分)から、ソースファイルを見つけて下さい。 つぎに、より詳しいエラー箇所を見つけるには次のようにします。上記の手順で切りわけたソースファイルを、下記の方法で再コンパイルします。

        A>CAB /L /S ファイル名

これにより、アセンブル・リスト(.LST ファイル)が生成されますから、これとエラー発生アドレスのオフセット部(OOOO で示した部分)からエラーの発生箇所が分ります。但し、この際に注意して欲しいことがあります。それは、表示されるアドレスは、エラーが発生した文の、その次の文を指していることです。

デフォルトのエラーチェックを禁止するには、コンパイル指令 {$I-} を使用します。{$I-} が指定された状態で、エラーが発生したかどうかは、関数 ioresultで知ることができます。

        function ioresult : integer;    (* エラーコードを返す *)

I/Oエラーが発生したにもかかわらず、ioresult が呼ばれない状態では、すべてのI/O処理は無視されます。ioresult を呼出すと、内部的なエラーフラグを解除するため、次のI/O処理を行うことができます。

【例】

    assign(f, fileName);    (* assignではエラーは発生しない *)
    {$I-}                   (* エラーチェックの解除     *)
    reset(f);               (* resetではエラーが発生し得る  *)
    {$I+}                   (* エラーチェックの再開     *)
    code := ioresult;       (* エラーコードを得る       *)
    if code <> 0 then
        エラー処理

付録A 予約語一覧

        AND         ARRAY       BEGIN       CASE        CONST
        DIV         DO          DOWNTO      ELSE        END
        EVERY       (EXIT)      (FILE)      FOR         FUNCTION
        GOTO        HUGE        IF          IMPLEMENTATION
        (IN)        INTERFACE   LABEL       LEAVE       MOD
        NIL         NOT         OF          OR          OTHERWISE
        PACKED      PROCEDURE   PROGRAM     RECORD      REPEAT
        RETURN      (SET)       (STEP)      STRING      THEN
        TO          TYPE        UNIT        UNTIL       USES
        VAR         WHILE       WITH        XOR
【説明】
  括弧内のものは、予約語としての判定は行っているが未実装のもの

付録B 標準名一覧

定数:
        false       maxint      true

型:
        boolean     char        integer     real        text

変数:
        input       output

関数:
abs bitshift chr copy cpos
eof inttostr ioresult ln max
min ord paramcount paramstr pos
random round sqrt trunc upcase
手続き:
        assign      dispose     getdate     gettime     halt
        new         randomize   read        readln      reset
        rewrite     str         write       writeln

付録C 指令

        external    forward     length

【注】
 これらの3つ名前は予約語でも、標準名でもない。文脈上特定の位置に表れた場合のみ、指令としての効果を持つ。これらの名前を他の目的で使用してもさしつかえない[*3]。
 上記指令のうち、ISO規格で規定しているのは forward のみである。ISO規格で forward を予約語にしていないので、forward と似た文脈で現れるexternal も指令扱いにした。

[*3] 書法上は避けた方が良いと思われる

付録D 実行時エラーコード

実行時にエラーが起こると、デフォルトの状態では、下記のメッセージを出力してプログラムは終了します。

Run time error XXX at SSSS:OOOO.

XXX はエラー番号を意味しています。
実行時エラーは下記の2種類に分れています。DOSエラー:1 から 17、I/Oエラー:100 以降です。

エラー  内容

   2    ファイルが見つからない
   3    パスが見つからない
   4    オープンファイルが多すぎる
   5    ファイルアクセスが拒否された(ディレクトリをオープンしようとした
        など)
   6    無効なファイルハンドル(ファイル変数が壊れている場合)

 100    EOFを越えて読み込みを行った
 101    DISK  FULL
 102    ファイル変数にファイルが割当てられていない。assign を使うこと
 103    ファイルがオープンされていない
 104    ファイルが入力用にオープンされていない
 105    ファイルが出力用にオープンされていない
 106    数値中に数字以外の文字がある
 203    ヒープオーバーフロー
 204    dispose エラー。new で割当ててない領域を dispose しようとした

徳丸浩/ockeghem