我写过以下语法
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工件时,它抱怨多个替代品。
请让我知道如何为此写出正确的语法规则。
答案 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])?