エラーと診断
実行前に確認する
Section titled “実行前に確認する”tekri check は字句解析、構文解析、名前解決、型検査を行います。C++ コンパイラーは不要で、プログラムは実行しません。
tekri check main.tkr検査に成功しても、すべての入力に対して正常終了する保証にはなりません。ゼロ除算、入力形式、実行時のオーバーフローなどは実行時に検査します。
コンパイル時の診断
Section titled “コンパイル時の診断”診断にはファイル名、行、列、メッセージ、該当するソース行と位置が表示されます。メッセージ本文は英語です。
main.tkr:2:10: error: expected i64, found i32 |2 | y: i64 = x; | ^expected はその場所で必要な型、found は実際の型です。表示される位置は原因の手掛かりであり、直すべき場所がその行だけとは限りません。型が先に定まった変数は、最初の定義を見直します。
| 状況 | 確認すること |
|---|---|
undefined variable |
使用前に定義したか、ブロックの外に出ていないか |
expected i64, found i32 など |
型注釈・リテラルの接尾辞・関数の引数型が一致しているか |
integer literal is out of range |
i64 の注釈や接尾辞が必要か、それでも型の最大値を超えていないか |
compound assignment requires an existing variable |
+= などの前に通常の = で定義したか |
would shadow a visible variable |
for の変数名が外側の変数と重複していないか |
a variable cannot store a unit value |
値を返すつもりのブロックの末尾に ; を付けていないか |
| 関数の引数個数・戻り値のエラー | 定義と呼び出し、全分岐の末尾式が一致しているか |
たとえば、次は型が混在しています。
x = 1;y: i64 = x;64ビットで扱いたい場合は、最初の定義で指定します。
x: i64 = 1;y: i64 = x;print y;if の分岐が i32 と () になる場合も型エラーです。片方の末尾にだけ ; が付いていないか確認してください。詳細は式・文・ブロックにあります。
実行時の診断
Section titled “実行時の診断”実行時エラーは標準エラー出力へ書き出し、終了コード 1 で停止します。tekri のソース上のファイル名・行・列を報告します。
main.tkr:3:7: runtime error: division by zero| エラーの原因 | 対処の方向 |
|---|---|
| ゼロ除算・ゼロを除数とする剰余 | 演算の前に除数を確認する |
| 加減乗算・符号反転のオーバーフロー | 数値の上限を確認し、必要なら最初から i64 を使う |
最小整数の / -1 または % -1 |
この組み合わせを演算前に分岐する |
| シフト量が範囲外 | 左辺が32ビットか64ビットかと、シフト量の範囲を確認する |
| 入力不足・不正トークン・範囲外の入力 | read の個数、型、入力データを確認する |