以下の説明は執筆時点でのpascc.exeを元にしています。
最新版では一部仕様が異なる可能性があります。
pascc.exeは、PasC言語でかかれたテキストソースを解釈し、pasc.exe(ヴァーチャルマシン)用のバイナリコード、および、C言語のソースを出力します。
すなわち、pasc.exe用コンパイラ & C言語トランスレータです。
動作環境はWin9x,WinNT系(MS-DOSプロンプト)です。
Windows 98SE,Windows 2000 sp2にて確認済みです。
pascc.exeで出力されたC言語ソースは、Mingw32 (gcc2.95.2)でコンパイル確認しています。
C:\>pascc.exe test.psc
拡張子.pscは省略可能なので、以下のように簡潔に書いてもかまいません。
C:\>pascc test
特別なコンパイルオプションなどは設けていません。
PasC文法にソースファイルをコンパイルした時はエラーや警告が出ます。
全てのエラーメッセージは、標準エラーに出力されます。
致命的なエラーでコンパイルが中断しない限り、コンパイル終了時に次のようなメッセージが出力されます。
test.psc - エラー 0、警告 0
この例では、test.pscは正しくコンパイルされたことがわかります。
ただし、これはPasCの構文的に「正しい」ということで、実行時に正常動作するとは限りません。
アルゴリズムの間違え、メモリ不足、メモリ破壊などは、コンパイル時にチェックできないからです。
致命的エラーは、コンパイルの継続が不可能になった時に表示されます。
致命的なエラーが出ると、コンパイルは中断します。
バイナリコードやCソースは出力されません。
個々のメッセージに加え、以下のメッセージが出力されます。
コンパイルを中断します
エラーの総数がnum個を超えた時に発生します。
デフォルト値は100で、現バージョンでは変更不可能です。
出力するバイナリデータのサイズがnum語を超えたときに発生します。
デフォルト値はヴァーチャルマシンの限界語数である65535で、変更不可能です。
入力ソースファイルが存在しなかったときに発生します。
出力ファイルfilenameが作成できなかったときに発生します。
バイナリコード、Cソースコードのファイル名が入ります。
コンパイラ自体の問題です。
コンパイラ自体の問題です。
エラーは、PasCの文法として正しくない部分に対して表示されます。
エラーがある時は、バイナリコードやCソースは出力されません。
エラーが出てもコンパイルは続行するため、1つのエラーが更なるエラーを生み出すことがあるでしょう。
個々のメッセージは、以下のフォーマットで出力されます。
エラー(line): pos: message
lineはエラーのあった行番号です。
ただし、本当にこの行に間違えがあるかどうかはわかりません。
別の場所のエラーが影響を及ぼしている可能性もあります。
また、現バージョンでは構文規則の末尾にあたる行を取得しているため、正確な行が得られない場合があります。
posは、エラーを出力したクラス名などです。
クラス名と構文規則の非終端記号名は一致しているため、どこの構文規則でエラーが出たかがわかります。
messageは、以下に示す個々のメッセージです。
flexによる字句切り出し時に発生します。
/* で始まったコメントを */ で閉じる前にソースファイルが終了しています。
flexによる字句切り出し時に発生します。
認識できなかった文字があります。この文字をスキップして切り出しを続行します。
bisonによる、構文解析時に発生します。
PasCの構文規則に合わなかった規則sentenceをスキップして解析を続行します。
正しい構文木が作られないため、別のエラーを誘発する可能性があります。
構文木の子ノードが生成されていない時に発生します。
構文の一部が無視されたことが原因です。
stateには、break,continueが入ります。
繰り返し制御文(while文、do-while文、for文)の内部以外で使用したのが原因です。
選択制御文(if-else文)、繰り返し制御文(while文、do-while文、for文)の内部以外の場所に、値を返すreturn文がないことが原因です。
返り値をもつ関数内で、return文に演算式をかいていないことが原因です。
return文での返り値の型が、関数定義での返り値の型と一致しません。
宣言された型でない演算結果を代入したことが原因です。
定数宣言された変数に代入したことが原因です。
input文で、int型以外の変数を指定したことが原因です。
演算子には取りうる項の型があり、それと異なった型を指定したことが原因です。
等価演算(=,><)の両辺が異なる型であることが原因です。
警告は、無駄があるコードや、多少の問題がある場合に表示されます。
警告があっても、バイナリコードとCソースは出力されます。
しかし、多少の問題は存在しているため、警告された問題は修正すべきです。
個々のメッセージは、エラーと同じく以下のフォーマットで出力されます。
警告(line): pos: message
変数名nameは、宣言されたものの、一度も使用されませんでした。
ここでいう「使用」とは、代入、標準入力は含めません。
演算式の一部として使用されなかったときに発生します。
配列は初期化できないため、const宣言すると意味がありません。
const宣言された定数は再代入できないため、初期化しないと意味がありません。
nはデフォルトで32です。変更はできません。
C言語では変数・関数名は32字までという制限があるので、正しいCソースを出力しません。
バイナリコードには識別子の制限はありません。
Cソース出力の際に、start関数をmain関数に置き換えているので、main関数を別に定義すると二重定義になります。
バイナリコードであつかえる整数値を超えた定数に対して発生します。
nはデフォルトで32767です。変更はできません。
ヴァーチャルマシン上で、正しい計算結果が出力されません。