PasCコンパイラ & C言語トランスレータ
pascc.exe

目次

  1. はじめに
  2. 概要
  3. 動作環境
  4. 実行方法
  5. エラーメッセージ
    1. 致命的なエラー
    2. エラー
    3. 警告

1 はじめに

以下の説明は執筆時点でのpascc.exeを元にしています。
最新版では一部仕様が異なる可能性があります。


2 概要

pascc.exeは、PasC言語でかかれたテキストソースを解釈し、pasc.exe(ヴァーチャルマシン)用のバイナリコード、および、C言語のソースを出力します。
すなわち、pasc.exe用コンパイラ & C言語トランスレータです。


3 動作環境

動作環境はWin9x,WinNT系(MS-DOSプロンプト)です。
Windows 98SE,Windows 2000 sp2にて確認済みです。

pascc.exeで出力されたC言語ソースは、Mingw32 (gcc2.95.2)でコンパイル確認しています。


4 実行方法

  1. まず、PasC言語のソースファイルを用意します。(test.pscとします)
  2. コマンドライン(MS-DOSプロンプト)上で、以下のコマンドを実行します。
    C:\>pascc.exe test.psc
    拡張子.pscは省略可能なので、以下のように簡潔に書いてもかまいません。
    C:\>pascc test
  3. ソースファイルに間違いなどがあれば、エラーや警告などを標準エラーに出力して終了します。
    エラーがなければ、同じディレクトリ内にtest.exec(バイナリコード)と、test.c(C言語ソース)が出力されます。
  4. test.execはpasc.exe(ヴァーチャルマシン)上で実行することができます。
    test.cはgccなどのCコンパイラでコンパイルし、実行することができます。

特別なコンパイルオプションなどは設けていません。


5 エラーメッセージ

PasC文法にソースファイルをコンパイルした時はエラーや警告が出ます。
全てのエラーメッセージは、標準エラーに出力されます。
致命的なエラーでコンパイルが中断しない限り、コンパイル終了時に次のようなメッセージが出力されます。

test.psc - エラー 0、警告 0

この例では、test.pscは正しくコンパイルされたことがわかります。
ただし、これはPasCの構文的に「正しい」ということで、実行時に正常動作するとは限りません。
アルゴリズムの間違え、メモリ不足、メモリ破壊などは、コンパイル時にチェックできないからです。


5.1 致命的なエラー

致命的エラーは、コンパイルの継続が不可能になった時に表示されます。
致命的なエラーが出ると、コンパイルは中断します。
バイナリコードやCソースは出力されません。
個々のメッセージに加え、以下のメッセージが出力されます。

コンパイルを中断します

エラーの数がnumを超えました

エラーの総数がnum個を超えた時に発生します。
デフォルト値は100で、現バージョンでは変更不可能です。

バイナリデータが最大語数(num語)を超えました

出力するバイナリデータのサイズがnum語を超えたときに発生します。
デフォルト値はヴァーチャルマシンの限界語数である65535で、変更不可能です。

入力ファイルが開けません

入力ソースファイルが存在しなかったときに発生します。

出力ファイル(filename)が開けません

出力ファイルfilenameが作成できなかったときに発生します。
バイナリコード、Cソースコードのファイル名が入ります。

配列の範囲外アクセスがありました

コンパイラ自体の問題です。

その他の例外がありました

コンパイラ自体の問題です。


5.2 エラー

エラーは、PasCの文法として正しくない部分に対して表示されます。
エラーがある時は、バイナリコードやCソースは出力されません。
エラーが出てもコンパイルは続行するため、1つのエラーが更なるエラーを生み出すことがあるでしょう。
個々のメッセージは、以下のフォーマットで出力されます。

エラー(line): pos: message

lineはエラーのあった行番号です。
ただし、本当にこの行に間違えがあるかどうかはわかりません。
別の場所のエラーが影響を及ぼしている可能性もあります。
また、現バージョンでは構文規則の末尾にあたる行を取得しているため、正確な行が得られない場合があります。

posは、エラーを出力したクラス名などです。
クラス名と構文規則の非終端記号名は一致しているため、どこの構文規則でエラーが出たかがわかります。

messageは、以下に示す個々のメッセージです。

コメント終端の前にEOFが検出されました

flexによる字句切り出し時に発生します。
/* で始まったコメントを */ で閉じる前にソースファイルが終了しています。

文字'c'を無視します

flexによる字句切り出し時に発生します。
認識できなかった文字があります。この文字をスキップして切り出しを続行します。

sentenceを無視します

bisonによる、構文解析時に発生します。
PasCの構文規則に合わなかった規則sentenceをスキップして解析を続行します。
正しい構文木が作られないため、別のエラーを誘発する可能性があります。

構文木が正しく生成されていません

構文木の子ノードが生成されていない時に発生します。
構文の一部が無視されたことが原因です。

配列には添字が必要です

添字がint型ではありません

サイズが0の配列を宣言しようとしました

変数'name'は宣言されていません

変数'name'はすでに宣言されています

配列でない変数に添字が使われました

void型の変数を宣言しようとしました

関数'name'は定義されていません

関数'name'はすでに定義されています

引数の数や型が定義と一致しません

start関数に引数があってはいけません

不正な'state'です

stateには、break,continueが入ります。
繰り返し制御文(while文、do-while文、for文)の内部以外で使用したのが原因です。

関数'name'に値を返さないコントロールパスがあります

選択制御文(if-else文)、繰り返し制御文(while文、do-while文、for文)の内部以外の場所に、値を返すreturn文がないことが原因です。

返り値がありません

返り値をもつ関数内で、return文に演算式をかいていないことが原因です。

返り値の型が違います

return文での返り値の型が、関数定義での返り値の型と一致しません。

type1型をtype2型に代入することはできません

宣言された型でない演算結果を代入したことが原因です。

const宣言された変数に代入してはいけません

定数宣言された変数に代入したことが原因です。

int型以外の変数に代入することはできません

input文で、int型以外の変数を指定したことが原因です。

条件式がbool型ではありません

type型でない項でop演算してはいけません

演算子には取りうる項の型があり、それと異なった型を指定したことが原因です。

異なる型の項でop演算してはいけません

等価演算(=,><)の両辺が異なる型であることが原因です。


5.3 警告

警告は、無駄があるコードや、多少の問題がある場合に表示されます。
警告があっても、バイナリコードとCソースは出力されます。
しかし、多少の問題は存在しているため、警告された問題は修正すべきです。
個々のメッセージは、エラーと同じく以下のフォーマットで出力されます。

警告(line): pos: message

変数'name'は使用されていません

変数名nameは、宣言されたものの、一度も使用されませんでした。
ここでいう「使用」とは、代入、標準入力は含めません。
演算式の一部として使用されなかったときに発生します。

配列がconst宣言されています

配列は初期化できないため、const宣言すると意味がありません。

定数が初期化されていません

const宣言された定数は再代入できないため、初期化しないと意味がありません。

識別子がn字以上です(Cソースが不正です)

nはデフォルトで32です。変更はできません。
C言語では変数・関数名は32字までという制限があるので、正しいCソースを出力しません。
バイナリコードには識別子の制限はありません。

関数'name'はC言語で宣言されています(Cソースが不正です)

Cソース出力の際に、start関数をmain関数に置き換えているので、main関数を別に定義すると二重定義になります。

nより大きい整数値が使われています(バイナリコードが不正です)

バイナリコードであつかえる整数値を超えた定数に対して発生します。
nはデフォルトで32767です。変更はできません。
ヴァーチャルマシン上で、正しい計算結果が出力されません。