Ирония 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 не примет их как дубликаты.)

Другие вопросы по тегам