Irony BnfExpression 产生可以任意顺序的不同非终结符

Irony BnfExpression that produces different non terminals that can be in any order

我正在尝试创建一种允许作品以任何顺序出现的语法。例如:

    <NewObject>
     Name
     Type
     Value
    </NewObject>

    <NewObject>
     Value
     Name
     Type
    </NewObject>

两者都应该被接受。

到目前为止,我已经能够像这样使用每个产品的排列来摆脱困境:

The following code is written using the irony's BnfExpresion, where + means concatenation

A.Rule = B + C + D |
         B + D + C |
         C + B + D |
         C + D + B |
         D + B + C |
         D + C + B;

但是,当我尝试用 6 个不同的非终结符排列产生式时,这种方法就成了问题。 6 阶乘是 720,对于 C# 来说太多了,因为它会提示编译器错误(表达式太长或太复杂,无法编译)。

有什么方法可以实现 "any order" 而不必置换所有不同的可能性。

基本上没有。最好的办法是接受非终结符的任意重复,然后检查相关语义操作中的重复。

(SO 中已经有几个这种形式的答案,但它们似乎从未被投票或接受,这意味着 SO 不会接受它们作为重复项。)