初始化嵌套实体的正确方法是什么?
What is right way to initialize nested entities?
带有 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
此代码出现错误 "missmatched input LED_PANEL",需要“;”
表现得好像他无法识别组件 LED_PANEL
我希望他能验证这个代码。
在您的 DeclarativeStatement
规则中,您有 component+=[Component|EString]
。这意味着 "match an EString
token; that token should be the name of a Component
(meaning an instance of the Component
class)"。就解析器而言,这等同于 component+=EString
- 它是交叉引用这一事实只有在我们到达链接器时才会发挥作用。
不代表"match a Component
"。如果那是你想要的,你应该只写 component+=Component
(或者更好 components+=Component
因为列表应该有复数名称)。
交叉引用适用于您期望 name 其他地方定义的内容的情况。如果你期待整个事情,应该没有交叉引用。
带有 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
此代码出现错误 "missmatched input LED_PANEL",需要“;” 表现得好像他无法识别组件 LED_PANEL
我希望他能验证这个代码。
在您的 DeclarativeStatement
规则中,您有 component+=[Component|EString]
。这意味着 "match an EString
token; that token should be the name of a Component
(meaning an instance of the Component
class)"。就解析器而言,这等同于 component+=EString
- 它是交叉引用这一事实只有在我们到达链接器时才会发挥作用。
不代表"match a Component
"。如果那是你想要的,你应该只写 component+=Component
(或者更好 components+=Component
因为列表应该有复数名称)。
交叉引用适用于您期望 name 其他地方定义的内容的情况。如果你期待整个事情,应该没有交叉引用。