Ирония BnfExpression, которая производит различные нетерминалы, которые могут быть в любом порядке - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь создать грамматику, которая позволяет производить постановку в любом порядке.Например:

    <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 #, поскольку он выдает ошибку компилятора (выражение слишком длинное или сложное для компиляции).

Есть ли способ, которым я могу достичь «любого порядка» без необходимости перестановкивсе разные возможности.

1 Ответ

0 голосов
/ 24 декабря 2018

В основном нет.Лучше всего принять произвольные повторы нетерминалов, а затем проверить наличие повторений в соответствующем семантическом действии.

(В SO уже есть несколько ответов этой формы, но кажется, что они никогда не получают одобрения или голосования, что означает, что SO не примет их как дубликаты.)

...