Ирония BnfExpression, которая производит различные нетерминалы, которые могут быть в любом порядке
Я пытаюсь создать грамматику, которая позволяет производить постановку в любом порядке. Например:
<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 factorial равно 720, это слишком много для обработки C#, так как он вызывает ошибку компилятора (выражение слишком длинное или сложное для компиляции).
Есть ли способ, которым я могу достичь "любого порядка", не переставляя все различные возможности.
1 ответ
В основном нет. Лучше всего принять произвольные повторы нетерминалов, а затем проверить наличие повторений в соответствующем семантическом действии.
(Есть несколько ответов этой формы уже в SO, но они никогда не получают одобрения или одобрения, что означает, что SO не примет их как дубликаты.)