Почему DSL показывает «Не удалось разрешить ссылку на»? - PullRequest
0 голосов
/ 29 марта 2019

Я реализую грамматику с тремя разделами. В первом разделе я объявляю компоненты с их интерфейсами, например, компонент A с интерфейсами interface_1, interface_2. В третьем разделе я объявляю некоторые ограничения, например, компонент A может получить доступ к компоненту B через интерфейс XXXX. Когда я пытаюсь сделать перекрестную ссылку на интерфейсы компонента, я получаю сообщение об ошибке «Не удалось разрешить ссылку на 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 можно ссылаться по грамматике.

Спасибо.

1 Ответ

1 голос
/ 29 марта 2019

грамматика, которую вы разместили, является неполной

способ определения интерфейсов действительно плох.именование по умолчанию работает только с однозначными атрибутами имени

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)
    }
...