Как правильно инициализировать вложенные объекты? - PullRequest
0 голосов
/ 07 мая 2019

Eclipse с плагином для DSL со следующей грамматикой (xtext)

AbstractStatement returns AbstractStatement:
    IfStructureStatement | DeclarativeStatement | BreakStatement | EqualityStatement | SignalStatement;

Component returns Component:
    LED_Panel | Switch | Timer | LED_Light;

Setup returns Setup:
    {Setup}
    'SETUP BEGIN'
        ( abstractstatement+=AbstractStatement ( "\r" abstractstatement+=AbstractStatement)* )?
    'SETUP END';

DeclarativeStatement returns DeclarativeStatement:
    {DeclarativeStatement}
    'DECLARE'
    ( component+=[Component|EString] ( "," component+=[Component|EString])* )?
    ( variable+=[Variable|EString] ( "," variable+=[Variable|EString])* )?
    ( constant+=[Constant|EString] ( "," constant+=[Constant|EString])* )?";";

LED_Panel returns LED_Panel:
    {LED_Panel}
    'LED_PANEL'
    ElementName=EString
    ('{'
        'PanelWidth' PanelWidth=EInt
        'PanelHeight' PanelHeight=EInt
        'PanelText' PanelText=EString
        'ON' '{' pin+=Pin ( "," pin+=Pin)* '}' 
    '}')?;

И следующий исходный файл:

SETUP BEGIN
DECLARE LED_PANEL p;
SETUP END

Этот код выдаёт мне ошибку "несоответствующий вход LED_PANEL", ожидая ";" Он действует так, будто не может распознать Компонент LED_PANEL

Я ожидаю, что он сможет подтвердить этот код.

1 Ответ

1 голос
/ 07 мая 2019

В вашем правиле DeclarativeStatement есть component+=[Component|EString].Это означает «соответствовать токену EString; этот токен должен быть именем Component (что означает экземпляр класса Component)».Что касается синтаксического анализатора, это эквивалентно component+=EString - тот факт, что это перекрестная ссылка, вступает в действие только после того, как мы доберемся до компоновщика.

Это не означает "соответствовать Component",Если это то, что вы хотите, вы должны просто написать component+=Component (или даже лучше components+=Component, поскольку списки должны иметь множественное число имен).

Перекрестные ссылки предназначены для ситуаций, когда вы ожидаете имя чего-то определенного в другом месте.Если вы ожидаете всего этого, не должно быть перекрестных ссылок.

...