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 不会接受它们作为重复项。)
我正在尝试创建一种允许作品以任何顺序出现的语法。例如:
<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 不会接受它们作为重复项。)