1

我正在尝试创建一个可以解析以下内容的语法:

reference: java.util.String

但同样

reference: {java.util.String, java.lang.Integer}

换句话说,我希望它既解析限定名称列表,又解析一个项目(在这种情况下不标记为“{”)。

我尝试的是这样的:

Reference:
    'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | (values+=QualifiedName);

但是,我收到一个错误:在使用第一种引用形式(不带 {)时,在 'java' 处缺少 '{'。有什么建议我应该尝试吗?

编辑:也试过

Reference:
    'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | ((!'{')values+=QualifiedName);

但在输入“!”时没有可行的选择 语法定义错误。

EDIT2:“逗号分隔列表”没有问题,我单独尝试过,效果很好。我唯一的问题是根据“{”字符区分规则的两个部分。

4

2 回答 2

9

这可以解决问题:

Reference:
'reference' ':' (
     '{' values+=QualifiedName (',' values+=QualifiedName)* '}' 
   | values+=QualifiedName
);

请注意组和替代方案的优先级。

于 2012-02-16T11:22:56.977 回答
0

我对 Xtext 很陌生,所以试一试:

Reference:
    'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | (values=QualifiedName);

或者

Reference:
    'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)+ '}') | (values=QualifiedName);
于 2012-02-16T10:06:52.157 回答