LINT系関数の仕様と制約†

LINT.* 系関数は、読み込み済み辞書の解析結果(関数内のステートメントと数式の項)から、関数・変数の使用箇所を取り出すデバッグ用の関数群です。yayalint のような静的検査を YAYA 辞書自身で組むための材料になりますが、以下の仕様と制約があります。

関数一覧†

関数 対象 重複 スコープ { } 読み書きの区別 行
LINT.GetVarRefs 変数・関数・ブロック 出現ごと あり(種類付き) あり あり
LINT.GetFuncUsedBy 関数(ユーザー定義・システム) 除去・名前順 なし - なし
LINT.GetUserDefFuncUsedBy ユーザー定義関数 除去・名前順 なし - なし
LINT.GetGlobalVarUsedBy グローバル変数(読み書き両方) 除去・名前順 なし なし なし
LINT.GetGlobalVarLetted グローバル変数(代入のみ) 除去・名前順 なし - なし
LINT.GetLocalVarUsedBy ローカル変数(読み書き両方) 出現ごと あり なし なし
LINT.GetLocalVarLetted ローカル変数(代入のみ) 出現ごと あり - なし

新しく検査を組む場合は LINT.GetVarRefs を使うと、他の関数の情報をすべて含んだ形で得られます。

Tc574-1 での変更†

制約†

辞書の読み込みが前提†

解析対象は読み込みに成功した辞書です。構文エラーなどで辞書が読み込めない場合は緊急モードになり、LINT 系関数を使う辞書自体が動きません。重複定義・構文エラー・括弧付きの未定義関数呼び出し(E0071)などは、YAYA 本体が読み込み時にエラーとして出力します。

位置情報†

名前の見え方†

読み・書きの区別†

構文の情報†

解析の範囲†

検査の組み立て例†

検査 可否 方法
未使用関数 可 GETFUNCLIST の全関数について LINT.GetVarRefs の func,user を集め、どこにも現れない関数を列挙する(イベント関数など外部から呼ばれるものは除外)
未使用ローカル変数 可 スコープ({ })ごとに、w しかなく r / rw がない変数を探す
未定義ローカル変数の読み 可(分岐は辞書側で考慮) 先頭から順に追い、そのスコープまたは外側のスコープで w / rw が現れる前の r / rw を探す
未使用グローバル変数 可 全関数の var,global を集め、w しかない変数を探す(EVAL などで読まれるものは追えない)
条件式内の代入 可 context が if / elseif / while / switch / for-cond で、access が w / rw の件を探す
case の不正な節 一部可 case ブロックの直下(深さ+1)に、when / others 以外のブロックや context が when 以外の件がないか調べる。変数・関数を含まない記述は検出できない
名前の打ち間違い候補 可 GETFUNCLIST / GETVARLIST との編集距離を辞書側で計算する
行・桁の表示 行のみ可 桁は得られない