我正在使用 Xtext,需要对以下两个问题提出建议。
问题 #1
假设我有三个规则a,b和c。我想允许这些规则的任何序列,除了 b 和 c 应该只出现一次。如何最好地写出这样的语法?
这是我想出的:
root:
a+=a*
b=b
a+=a*
c=c
a+=a*
;
a: 'a';
b: 'b';
c: 'c';
有没有更好的方法来编写根语法?b 和 c 仍然必须按严格的顺序排列,这并不理想。
问题 #2
看看这个语法:
root:
any+=any*
x=x
any+=any*
;
any:
name=ID
'{'
any+=any*
'}'
;
x:
name='x' '{' y=y '}'
;
y:
name='y' '{' z=z '}'
;
z:
name='z' '{' any+=any* '}'
;
使用这种语法,我希望能够编写如下语言:
a {
b {
}
c {
y {
}
}
}
x {
y {
z {
the_end {}
}
}
}
但是,由于节点“y”出现在“c”下,我收到错误消息。这是为什么?是不是因为现在“y”已经在其中一个规则中用作终端,它不能出现在语法的其他任何地方?
如何修正这个语法?