web-dev-qa-db-ja.com

変数が設定されていることが保証されているかどうかを計算するにはどうすればよいですか?

宣言が式であると仮定すると、次のようなコードが考慮されます。

if ((var x = foo()) and (var y = x)) or (var z = bar()) then
  println(z);
end

この時点でxを設定する必要があるため、xへの参照は問題ありませんが、zprintln内)への参照は設定されていません。有効かどうかはわかりません。

変数のこれら2つの「状態」を計算したいと思います-変数を参照してもよいか(設定されていることが保証されているか)、いいえ(確実に設定されていないか、設定されている可能性があります)。

どうやってするの?

更新:このウィキページを見つけました https://en.wikipedia.org/wiki/Definite_assignment_analysis そして私の場合だと思いますはるかに簡単です。 4種類のフローを追跡する必要があります-そして、または、xor、next(コンマ演算子、述語から本体まで)。私が正しいことを願っています:-)

2
greenoldman

あなたが求めているのは、データフロー分析の一形態です。コードは、何らかの形式の基本ブロック(または他の中間データ構造)に変換できます。 ANDおよびOR式のif-condition-test(およびthen-partのスキップに関連するブランチ)に関連付けられた制御フロー(ブランチ)があります)。基本ブロック。を分析して、変数ごとに1ビットの状態があり、初期化されているかどうかを示すデータ構造を生成して使用します。

分析されている基本ブロックに潜在的にループがある場合、物事がより複雑になる可能性があります(たとえば、変更がなくなるまで)反復する必要があります。

基本ブロックがマージされるとき(つまり、「または」から)、またはif-thenまたはif-then-elseの後に、これらのビットを効果的にANDして、マージパスの1つにある特定の変数のビットがクリアすると、マージの結果、その変数のビットがクリアになります。変数が使用されるときはいつでも(つまり、then-partのように)、その変数のビットの現在のステータスを確認し、ビットがクリアされている場合はエラーを報告します。

2
Erik Eidt