This post is Private. Only a writer or those who know its URL can access this post.

Improve article
RevisionsShow article in Markdown
Report article
Help us understand the problem. What is going on with this article?

<1> 記法: トークンと区切り文字 (標準 Pascal 範囲内での Delphi 入門)〔裏〕

1. 記法: トークンと区切り文字

1.1. 区切り文字 (Token Separators)

コメント (Comment)

Pascal の文法を理解してくると、行コメントは Pascal という言語には異質な存在と思えるようになってきます (多分)。

C 言語もそうですが、Pascal は基本的にどこで改行しても構いません。改行コードは区切り文字の一種なので、文字列中に改行コードを含めたりはできませんが、改行なしでダラダラと一行プログラムを書く事ができます。既存のコードから改行コードが失われてもコンパイル可能です。

...が、この行コメント (//) を使用した場合、改行コードが失われるとコンパイルできなくなってしまいます。このためか、C 言語においても C99 になってやっと行コメントが追加されています。

なお、Pascal 6000-3.4 (Revised Report) では、72 文字を超えて書かれたコードはコメント扱いになっていました。コンパイラ指令 {$U-} を指定すると、拡張されて 120 文字までが有効なコードとなります。

1.2. 特殊シンボルと予約語

特殊シンボル (Special-symbols)

予約語 (Word-symbol / Reserved-word)

Modula-2 では予約語をすべて大文字で記述する必要があります。嫌な人にはとても嫌な制約だと思いますが、プレーンテキストでも視認性がいいというメリットもあります。入力 (写経) しやすいかと言われると...

Queens.mod
MODULE Queens;
  FROM InOut IMPORT WriteInt, WriteLn;
VAR
  i: INTEGER;
  q: BOOLEAN;
  a: ARRAY [ 1.. 8] OF BOOLEAN;  
  b: ARRAY [ 2..16] OF BOOLEAN;  
  c: ARRAY [-7.. 7] OF BOOLEAN;  
  x: ARRAY [ 1.. 8] OF INTEGER;  

PROCEDURE Try(i: INTEGER; VAR q: BOOLEAN);  
VAR
  j: INTEGER;
BEGIN
  j := 0;
  REPEAT
    j := j+1; q := FALSE;
    IF a[j] AND b[i+j] AND c[i-j] THEN
      x[i] := j;
      a[j] := FALSE; b[i+j] := FALSE; c[i-j] := FALSE;
      IF i<8 THEN
        Try(i+1, q);
        IF NOT q THEN
          a[j] := TRUE; b[i+j] := TRUE; c[i-j] := TRUE;
        END
        ELSE
          q := TRUE;
      END
    END
  UNTIL q OR (j=8)
END Try;  

BEGIN
  FOR i:= 1 TO  8 DO a[i] := TRUE END;
  FOR i:= 2 TO 16 DO b[i] := TRUE END;
  FOR i:=-7 TO  7 DO c[i] := TRUE END;
  Try(1, q);
  FOR i:= 1 TO 8 DO WriteInt(x[i], 4) END;
  WriteLn
END Queens.

Modula-2 の予約語一覧は次の通りです (PIM4)。

AND             FOR             QUALIFIED
ARRAY           FROM            RECORD
BEGIN           IF              REPEAT
BY              IMPLEMENTATION  RETURN
CASE            IMPORT          SET
CONST           IN              THEN
DEFINITION      LOOP            TO
DIV             MOD             TYPE
DO              MODULE          UNTIL
ELSE            NOT             VAR
ELSIF           OF              WHILE
END             OR              WITH
EXIT            POINTER         
EXPORT          PROCEDURE 

1.3. 識別子 (Identifiers)

Delphi の場合、識別子の長さに制限はありませんが、有効なのは最初の 255 文字だけです。標準 Pascal は実装依存ですが、最初の 8 文字しか有効でないものもあるようです。

Revised Report では識別子の最初の 8 文字だけが有効とされています。Apple ][/// の Pascal の識別子は 8 文字まで、MPW Pascal が 63 文字まででした。

See also:

1.4. 数値 (Numbers)

拡張 Pascal では 基数#数値 という書式で任意の基数 (2~36) による値を表現できます。

13#42 { the answer to the ultimate question of life,
        the universe, and everything }

1.5. 文字列 (Character-strings)

(1.5.1.) 制御文字列

(1.5.2.) キャレット記法 (Caret notation)

1.6. ラベル (Labels)

1.7. 指令 (Directives)

(1.7.1.) ヒント指令 (Hint directives)

(1.7.2.) コンパイラ指令 (Compiler directives)

コンパイラ指令は

に記述がありますが互いに互換性はありません。

PASCAL-P5 にもコンパイラ指令があります。

オプション 意味 デフォルト
$C 中間コードを出力する/しない。 $C+
$D 配列の境界、部分範囲型などをチェックするためのコードを追加する/しない。 $D+
$L コンパイル時にソースプログラムをリストアップする/しない。 $L+
$T 各ルーチンがコンパイルされた後に、内部テーブルを印刷する/しない。 $T-

例えば {$L-}{$L+} でコードを括ることにより、コンパイル時に一部のコードだけをリストアップさせる事ができます。

See also:

索引

:ramen: [ ← 0. はじめに〔裏〕 ] [ ↑ 目次へ ] [ → 2. データの概念: 単純型〔裏〕 ]

ht_deko
とある熊本の障害復旧(トラブルシューター)
https://ht-deko.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away