宣言が式であると仮定すると、次のようなコードが考慮されます。
if ((var x = foo()) and (var y = x)) or (var z = bar()) then
println(z);
end
この時点でx
を設定する必要があるため、x
への参照は問題ありませんが、z
(println
内)への参照は設定されていません。有効かどうかはわかりません。
変数のこれら2つの「状態」を計算したいと思います-変数を参照してもよいか(設定されていることが保証されているか)、いいえ(確実に設定されていないか、設定されている可能性があります)。
どうやってするの?
更新:このウィキページを見つけました https://en.wikipedia.org/wiki/Definite_assignment_analysis そして私の場合だと思いますはるかに簡単です。 4種類のフローを追跡する必要があります-そして、または、xor、next(コンマ演算子、述語から本体まで)。私が正しいことを願っています:-)
あなたが求めているのは、データフロー分析の一形態です。コードは、何らかの形式の基本ブロック(または他の中間データ構造)に変換できます。 ANDおよびOR式のif-condition-test(およびthen-partのスキップに関連するブランチ)に関連付けられた制御フロー(ブランチ)があります)。基本ブロック。を分析して、変数ごとに1ビットの状態があり、初期化されているかどうかを示すデータ構造を生成して使用します。
分析されている基本ブロックに潜在的にループがある場合、物事がより複雑になる可能性があります(たとえば、変更がなくなるまで)反復する必要があります。
基本ブロックがマージされるとき(つまり、「または」から)、またはif-thenまたはif-then-elseの後に、これらのビットを効果的にANDして、マージパスの1つにある特定の変数のビットがクリアすると、マージの結果、その変数のビットがクリアになります。変数が使用されるときはいつでも(つまり、then-partのように)、その変数のビットの現在のステータスを確認し、ビットがクリアされている場合はエラーを報告します。