-
Notifications
You must be signed in to change notification settings - Fork 3
nnsTable
XcodeML/C++におけるname要素には名前を解決するための属性としてfullName属性が定義されているが、無名名前空間やローカルクラスのつくるスコープに対応していない問題がある。この問題を解消する方法としてnnsTable要素とnns属性を提案する。(nnsはnested name specifierの略)
XcodeML/C++文書に現れる全てのname要素はnns属性をもつ。nns属性の値はnested name specifier識別名である。nested name specifier識別名は翻訳単位で一意である任意の文字列とし、識別名と実際のnested name specifierとの対応関係はnnsTable要素の中で定義する。
例えば、 std::string::npos
はXcodeMLで <name nns="Q1">npos</name>
と表し、nnsTable要素内に
<nestedNameSpecifier nns="Q0">
<namespaceName nns="global">std</namespaceName>
</nestedNameSpecifier>
<nestedNameSpecifier nns="Q1">
<className nns="Q0">string</className>
</nestedNameSpecifier>
という要素を出しておく。 fullName属性は廃止する。
nnsTable要素は、翻訳単位に対してただ一つだけ存在し、翻訳単位で使われている全ての名前について、その所属するスコープについての情報を定義する。
<nnsTable>
[nested name specifier 定義要素
...]
</nnsTable>
属性なし
nnsTable要素はXcodeProgram要素の直接の子要素であり、nested name specifierを定義する要素の列からなる。
nested name specifier定義要素およびその子要素が表現できなければならないことを以下に列挙する。
- 普通のクラスおよび名前空間 (= 名前空間スコープか、またはローカルでないクラスのクラススコープ)
- グローバル名前空間 (例:
::std::cout
はグローバル名前空間に属するstd名前空間に属する名前coutを表す。) - ローカルクラス
- 無名名前空間
- 実引数を与えられたクラステンプレート (例:
A<T, 1>::B
)
また、そもそも上の例
<nestedNameSpecifier nns="Q1">
<namespaceName>std</namespaceName>
<className>string</className>
</nestedNameSpecifier>
のように名前の列で表現するか、また別の表現方法を使うか?
テンプレートを実体化すると(XcodeMLの意味で)新しいスコープや型が導入される。そこで、テンプレートを定義する要素の中にlocalTypeTable要素とlocalNnsTable要素を入れておく。翻訳単位中でテンプレートが実体化されたら、対応するlocalTypeTableとlocalNnsTableをもとにtypeTableとnnsTableに新しい要素を追加する。