コンテンツにスキップ

エラーと診断

tekri check は字句解析、構文解析、名前解決、型検査を行います。C++ コンパイラーは不要で、プログラムは実行しません。

ターミナルウィンドウ
tekri check main.tkr

検査に成功しても、すべての入力に対して正常終了する保証にはなりません。ゼロ除算、入力形式、実行時のオーバーフローなどは実行時に検査します。

診断にはファイル名、行、列、メッセージ、該当するソース行と位置が表示されます。メッセージ本文は英語です。

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 と () になる場合も型エラーです。片方の末尾にだけ ; が付いていないか確認してください。詳細は式・文・ブロックにあります。

実行時エラーは標準エラー出力へ書き出し、終了コード 1 で停止します。tekri のソース上のファイル名・行・列を報告します。

main.tkr:3:7: runtime error: division by zero
エラーの原因 対処の方向
ゼロ除算・ゼロを除数とする剰余 演算の前に除数を確認する
加減乗算・符号反転のオーバーフロー 数値の上限を確認し、必要なら最初から i64 を使う
最小整数の / -1 または % -1 この組み合わせを演算前に分岐する
シフト量が範囲外 左辺が32ビットか64ビットかと、シフト量の範囲を確認する
入力不足・不正トークン・範囲外の入力 read の個数、型、入力データを確認する

これらの検査は最適化ビルドでも有効です。除算やシフトの正確な規則は演算子、入力形式は入出力を参照してください。

実装の参照先: 診断の表示、検査、実行時エラー。