具有讽刺意味的BnfExpression产生可以以任何顺序排列的不同非终端

时间:2018-12-24 04:49:08

标签: c# parsing grammar irony

我正在尝试创建一种语法,以使产生的内容可以按任何顺序排列。例如:

    <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#来说,它提示编译器错误(表达式太长或太复杂,无法编译),因此c#无法处理太多的事情。

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

1 个答案:

答案 0 :(得分:0)

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

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