コンパイラ設計コースで、スキャンの出力は一連のペア(トークン コード、シンボル テーブル内のトークン位置) であると読みました。「位置」部分の意味について少し混乱しています。シンボルテーブルがインデックスを使用して要素にアクセスできる構造、たとえば配列として表される場合、「位置」は明確で、配列の 1 番目、2 番目、99 番目の要素を意味します。たとえば、ソース コードの場合:
if (a == b) a = a + c;
スキャンの出力はストリームになります: ( ..., (id,1), ..., (id,2), ..., (id,3) ) - 他のトークンは描写していませんシンプルさ -シンボル テーブルは(a,b,c)となるため、シンボル テーブルの位置 1 に a、位置 2 に b、位置 3 に c が配置されます。
記号表を二分探索木で表すとどうなるでしょうか? 同じソース コードの場合、シンボル テーブル ツリーにはキー 'b' を持つルート ノードがあります。b の左側のノードはキー 'a'を持ち、b の右側のノードはキー 'c'を持ちます。スキャンの出力は次のようになります( ...,(id,?), ..., (id,?),..., (id,?)) ? ツリーが Node クラスを使用して実装されている場合、次のようにすればよいでしょうか: ( ...,(id, キー = a のノードへの参照),...) ?
シンボル テーブルがhashtableの場合はどうでしょうか。たとえば C# では、Hashtable オブジェクト HashST とスキャンの出力を(..., (id,pointer to HashST["a"]),...) のようにすることはできますか?
これが正しいアプローチであるかどうかは本当にわかりません。ツリーまたはハッシュテーブルで「位置」が他に何を意味するのでしょうか?
前もって感謝します!