作为一个例子,让我们假设以下设置:
具有显式标记的标记环境的模块定义 A 定义类型 foo。并且具有隐式标记环境的模块 B 导入 foo 并将其分配给 bar。
使用模块 B 读取流时,我不清楚哪种标记环境有效。模块 B 是否定义了 bar 的标记环境(隐式)(被导入 foo)或者声明它的模块的标记环境(模块 A 中的 foo 因此显式)有效?
我希望我能很好地解释这个问题
作为一个例子,让我们假设以下设置:
具有显式标记的标记环境的模块定义 A 定义类型 foo。并且具有隐式标记环境的模块 B 导入 foo 并将其分配给 bar。
使用模块 B 读取流时,我不清楚哪种标记环境有效。模块 B 是否定义了 bar 的标记环境(隐式)(被导入 foo)或者声明它的模块的标记环境(模块 A 中的 foo 因此显式)有效?
我希望我能很好地解释这个问题
首先,导入不是像 C 中的 #include 那样的文本内容。它只是使其他模块中的类型可以访问,而无需使用它们的模块名称来限定它们。
X.680 13.1 Note 4专门针对您的问题:
模块定义的“TagDefault”值仅影响模块中明确定义的那些类型。它不影响导入类型的解释。
但是请注意,如果在模块 B 中(导入了 foo),则编写:
酒吧 ::= [应用程序 5] Foo
这相当于:
Bar ::= [应用程序 5] 隐式 Foo
因为在定义 TaggedType 的模块 B 中,标记环境是隐式的。
注释的意思是,如果在模块 A 中,您有:
Foo ::= 序列 { x [0] INTEGER }
那么 x 上的标记是 EXPLICIT 标记,因为模块 A 中的标记环境是显式的,并且 Foo 将始终以这种方式处理,即使在使用其隐式标记环境导入模块 B 时也是如此。