Ошибка грамматики Xtext "не удается найти тип для [State]", даже если такой тип существует - PullRequest
0 голосов
/ 26 января 2019

У меня есть эта грамматика:

StateMachine:
    declarations+=Declaration*;

Declaration:
    Transition |
    State;

Transition returns Declaration:
     "trans" label=ID ":" source=[State] "->" target=[State] ";" ;

State returns Declaration:
     "state" id=ID ";" ;

@Override
terminal WS: 
    (' ' | '\t' | '\n' | '\r')+;

@Override
terminal ID: 
    ( 'a' .. 'z'  |  'A' .. 'Z' ) ( 'a' .. 'z'  |  'A' .. 'Z'  |  '0' .. '9' )* ;

В правиле перехода, когда я пытаюсь использовать ref to State, всегда выдается ошибка типа «не удается найти тип для [State]». Когда я использую его без [], так что не в качестве перекрестной ссылки все работает отлично. Как я мог решить эту ситуацию? Что может быть не так с этой грамматикой?

1 Ответ

0 голосов
/ 26 января 2019

Ошибка в этой строке:

"trans" label=ID ":" source=[State] "->" target=[State] ";" ;

В Xtext [Foo] означает «перекрестную ссылку на экземпляр типа Foo». Is НЕ означает «ссылку на правило грамматики». Xtext НЕ генерирует тип State из-за этой строки:

State returns Declaration:

где returns Declaration означает «Правило State вернет тип Declaration» и, следовательно, тип State не требуется.

Следующая грамматика исправит это:

StateMachine:
    declarations+=Declaration*;

Declaration:
    Transition |
    State;

Transition:
     "trans" label=ID ":" source=[State] "->" target=[State] ";" ;

State:
     "state" id=ID ";" ;

Здесь Xtext будет генерировать типы для Declaration, Transition и State, где Transition и State получены из Declaration.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...