Xtext中的自由规则顺序

时间:2014-05-16 17:23:39

标签: xtext

是否可以在xtext中实现免费的规则顺序?即:

A: b=B c=C;

必须处理

B C 

C B

B和C是非常复杂的规则

2 个答案:

答案 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)
    }
}