什么是初始化嵌套实体的正确方法?

时间:2019-05-07 13:33:14

标签: java eclipse dsl xtext

带有DSL插件的Eclipse,语法如下(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 个答案:

答案 0 :(得分:1)

在您的DeclarativeStatement规则中,您有component+=[Component|EString]。这意味着“匹配EString令牌;该令牌应为Component的名称(意味着Component类的实例)”。就解析器而言,这相当于component+=EString-只有当我们到达链接器时,它才是交叉引用的事实。

这并不意味着“匹配Component”。如果那是您想要的,您应该只写component+=Component(或者最好是components+=Component,因为列表应该使用复数名称)。

交叉引用适用于您期望在其他地方定义的内容的名称的情况。如果您期望整个过程,那么应该没有交叉引用。