带有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
我希望他可以验证此代码。
答案 0 :(得分:1)
在您的DeclarativeStatement
规则中,您有component+=[Component|EString]
。这意味着“匹配EString
令牌;该令牌应为Component
的名称(意味着Component
类的实例)”。就解析器而言,这相当于component+=EString
-只有当我们到达链接器时,它才是交叉引用的事实。
这并不意味着“匹配Component
”。如果那是您想要的,您应该只写component+=Component
(或者最好是components+=Component
,因为列表应该使用复数名称)。
交叉引用适用于您期望在其他地方定义的内容的名称的情况。如果您期望整个过程,那么应该没有交叉引用。