是否可以在xtext中实现免费的规则顺序?即:
A: b=B c=C;
必须处理
B C
和
C B
B和C是非常复杂的规则
答案 0 :(得分:2)
这个概念称为无序组,可以在文档中找到
A: b=B & c=C;
答案 1 :(得分:0)
是的,这是正确的。但我会非常小心地使用它!这些无序组导致解析器的大决策树。对于无序组的n个成员,您的解析器实现了2 ^ n种可能的解析方法。
在我看来,最好在语法中引入一个抽象的超级规则:
UnorderedElements:
A | B | C | D ...;
A:
...;
然后实现列表而不是无序组:
ModifiedUnorderedGroup:
elements+=UnorderedGroup*;
然后,可以在此列表中使每个元素多一次,但是您可以通过为每个元素实现验证规则来禁止这样做:
@Check
def checkA(A a) {
dar cnt = 0
(a.eContainer as ModifiedUnorderedGroup).elements.forEach [ el |
if (el.class == a.class) {
cnt++
}
]
if (cnt > 1) {
error('Elements of type A are allowed only once.', MyDskPackage.eINSTANCE.a_IdAddtribute)
}
}