регулярное выражение NFA для неопределенного порядка токенов

Я пишу простой синтаксический анализатор регулярных выражений, который создает NFA. Это НЕ анализатор строк, но он используется для проверки строк. Из этой статьи http://www.codeproject.com/Articles/5412/Writing-own-regular-expression-parser, Я получил основы, основанные на моих собственных требованиях. то есть. оператор OR (token1 | token2) и оператор AND (token1, token2).

Следующий оператор бросил мне слепой удар, главным образом потому, что, и я искал много статей, не существует простого выражения регулярного выражения. ЛИБО оператор.

Я хочу разобрать что-то вроде этого (token3, token1, token2). Один из каждого должен присутствовать, но порядок не важен.

Мне не нужно выражение регулярного выражения для этого, мне нужно знать, как я могу реализовать это в NFA. Как узлы должны соединяться вместе.

Пожалуйста, не слишком технические ответы. Я все еще коплюсь на узлах пенни / гальки и эпсилона.

Позвольте мне повторить вопрос. Как NFA реализует не определенный порядок сопоставления токенов? Когда я упомянул узлы выше, я не спрашивал код, я говорил о целой конструкции круга и пенни, которую используют многие учебные пособия.

Возможное решение:

Ручку и бумагу под рукой и вспоминаю, когда я впервые написал красное черное дерево. Я мог бы цветовой код узлов. При прохождении через NFA ведро заполняется каждым узлом, к которому можно получить доступ из текущего. При наличии необязательного узла (a | b) указатель на оба узла добавляется, если входные данные соответствуют одному из них, выполняется шаг, и область памяти снова заполняется. Я назову это «необязательный узел», может быть, «зеленый». Если я изменю цвет, изменив его на «строгий узел», может быть, «янтарный», я могу заставить анализатор не выходить ни при каких условиях, а скорее выходить, когда корзина пуста.

-3

Решение

Следующий DFA распознает любой порядок (1,2,3), используя состояния A .. J и конечное состояние Z, Я не думаю, что есть гораздо более эффективный способ, чем в основном перечислять все заказы в DFA или NFA.

A ---- 1 --> B -- 2 --> E -- 3 --> Z
\            \-- 3 --> F -- 2 --> Z
\--- 2 --> C -- 1 --> G -- 3 --> Z
\          \-- 3 --> H -- 1 --> Z
\- 3 --> D -- 1 --> I -- 2 --> Z
\-- 2 --> J -- 1 --> Z
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]