XText交叉引用

时间:2014-01-06 09:11:09

标签: eclipse parsing dsl xtext

我写过以下语法

Model:
package = PackageDec?
greetings+=Greeting*
usage+=Usage* ;

PackageDec:
   'package' name=QualifiedName ;

Greeting:
'greet' name=ID '{' ops += Operation* '}' ;

Operation:
'op' name=ID ('(' ')' '{' '}')? ;

QualifiedName:
ID ('.' ID)*;

Usage: 
   'use';

上面我可以写下面的脚本。

package p1.p2
  greet G1 {op f1 op f2 }

现在我需要写这样的东西:

  package p1.p2
  greet G1 {op f1 op f2 op f3}
  use p1.p2.G1.f1
  use p1.p2.G1
  use p1.p2.G1.f3

支持我改变了这样的用法规则

Usage:
'use' head=[Greet|QualifiedName] =>('.' tail=[Operation])?

然而,当我生成xtext工件时,它抱怨多个替代品。

请让我知道如何为此写出正确的语法规则。

1 个答案:

答案 0 :(得分:1)

这是因为QualifiedName消耗了点数(.)。添加('.' ...)?有两种选择。考虑输入

a.b.c

这可以解析为

  • head="a" tail = "b.c"
  • head="a.b" tail = "c"

如果我理解您使用谓词=>的意图,那么您只需要替换

head=[Greet|QualifiedName]

head=[Greet]

在这种情况下,您将无法使用点解析引用。

作为一种解决方案,我建议用其他角色替换你的点。例如使用冒号:

Usage:
'use' head=[Greet|QualifiedName] (':' tail=[Operation])?