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

Java 初始化嵌套实体的正确方法是什么?,java,eclipse,dsl,xtext,Java,Eclipse,Dsl,Xtext,Eclipse带有用于DSL的插件,具有以下语法xtext AbstractStatement returns AbstractStatement: IfStructureStatement | DeclarativeStatement | BreakStatement | EqualityStatement | SignalStatement; Component returns Component: LED_Panel | Switch | Timer | LED_Ligh

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_面板,期望; 他表现得好像无法识别组件LED_面板

我希望他能验证这段代码。

在您的声明声明规则中,您有component+=[component | EString]。这意味着匹配一个限制标记;该标记应该是组件的名称,表示组件类的实例。就解析器而言,这相当于component+=EString——这是一个交叉引用的事实,只有在我们到达链接器时才会起作用

这并不意味着匹配一个组件。如果这是您想要的,您应该只写component+=component,或者更好的components+=component,因为列表应该有复数名称


交叉引用适用于您希望在其他地方定义的名称的情况。如果您希望看到整个过程,则不应进行交叉引用。

您从哪个输入中得到该错误?这也是你的全部语法吗?如果AbstractStatement是您的开始规则,这会很奇怪,因为源文件通常包含多个语句,那么看起来您不允许组件出现在任何地方。还请注意,DeclarativeStatement的定义非常模糊;设置结束这是输入。这不是完整的语法,而是包含多个AbstractStatement实例的根概念。DeclarativeStatement是AbstractStatement类的具体化,在这个类中我有多个组件实例。LED_面板是组件抽象类的具体化。哦,对不起,我没有看到你在语法末尾已经包含了源代码。无论如何,声明LED_面板p;根据你的语法,看起来不是有效的语法。DECLARE后面应该跟一个字符串,不管它是什么-通常是一个类型,而不是一个标记或分号。为什么?component+=[component | EString]这是否意味着在声明后我可以使用component或EString?如果没有,怎么做D