0

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

    <NewObject>
     Name
     Type
     Value
    </NewObject>

    <NewObject>
     Value
     Name
     Type
    </NewObject>

两者都应该被接受。

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

以下代码是使用讽刺的 BnfExpresion 编写的,其中 + 表示连接

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

然而,当我尝试用 6 个不同的非终端置换一个产品时,这种方法成为一个问题。6阶乘是720,对于c#来说太多了,因为它会提示编译器错误(表达式太长或编译太复杂)。

有没有办法我可以实现“任何顺序”而不必排列所有不同的可能性。

4

1 回答 1

1

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

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

于 2018-12-24T06:11:43.567 回答