我正在实施一个包含三个部分的语法。在第一部分中,我声明了带有接口的组件,例如带有接口interface_1,interface_2的组件A。在第三部分中,我声明了一些限制,例如,组件A可以通过接口XXXX访问组件B。当我尝试交叉引用组件的接口时,出现错误“无法解析对ProbeInterface'interface_1'的引用”吗?。
我从互联网上尝试了几个示例,但没有一个适合我的情况。
这是我语法的一部分:
ArchitectureDefinition:
'Abstractions' '{' abstractions += DSLAbstraction+ '}'
'Compositions' '{' compositions += DSLComposition* '}'
'Restrictions' '{' restrictions += DSLRestriction* '}'
;
DSLComposition:
DSLProbe|DSLSensor
;
DSLRestriction:
'sensor' t=[DSLSensor] 'must-access-probe' type = [DSLProbe] 'through-interface' probeinterface=[ProbeInterface] ';'
;
DSLSensor:
'Sensor' name=ID ';'
;
DSLProbe:
'Probe' name=ID ('with-interface' probeinterface=ProbeInterface)? ';'
;
ProbeInterface :
name+=ID (',' name+=ID)*
;
执行:
Abstractions
{
Sensor sensor_1 ;
Probe probe_1 with-interface interface_1, interface_2;
}
Compositions{}
Restrictions
{
sensor sensor_1 must-access-probe probe_1 through-interface
interface_1;
}
我希望文法可以引用interface_1或interface_2。
谢谢。
答案 0 :(得分:1)
您发布的语法不完整
定义接口的方式确实很糟糕。 默认命名仅适用于单值名称属性
ProbeInterface :
name+=ID (',' name+=ID)*
;
更好
DSLProbe:
'Probe' name=ID ('with-interface' probeinterfaces+=ProbeInterface ("," probeinterfaces+=ProbeInterface)*)? ';'
;
ProbeInterface :
name=ID
;
它看起来像一个接口的合格名称是
<probename>.<interfacename>
ref=[Thing|FQN]
与FQN: ID ("." ID)*;
一起使用这是一个样本
override getScope(EObject context, EReference reference) {
if (reference === MyDslPackage.Literals.DSL_RESTRICTION__PROBEINTERFACE) {
if (context instanceof DSLRestriction) {
val probe = context.type
return Scopes.scopeFor(probe.probeinterfaces)
}
}
super.getScope(context, reference)
}