Обычная грамматика для моего регулярного выражения/DFA

У меня есть следующее регулярное выражение: ((abc)+d)|(ef*g?)

Я создал DFA (надеюсь, это правильно), который вы можете увидеть здесь

http://www.informatikerboard.de/board/attachment.php?attachmentid=495&sid=f4a1d32722d755bdacf04614424330d2

Задача состоит в том, чтобы создать обычную грамматику (иерархия Хомского, тип 3), и я ее не понимаю. Но я создал обычную грамматику, которая выглядит так:

S → aT

T → b

T → c

T → dS

S → eT

S → eS

T → ε

T → f

T → fS

T → gS

С наилучшими пожеланиями Патрик


person AustriaWien    schedule 14.01.2015    source источник
comment
Разве тип 3 Хомского не является в точности классом обычных грамматик, допускающих только правила A -> aA и A -> a? Если да, то это уже в форме Хомского...   -  person ShellFish    schedule 14.01.2015
comment
Я не знаю, как я уже сказал: я не понимаю... поэтому и спрашиваю.   -  person AustriaWien    schedule 14.01.2015
comment
Ваш DFA правильный :) Не стесняйтесь использовать много нетерминалов, иногда вам нужно много, чтобы регулярное выражение работало.   -  person ShellFish    schedule 14.01.2015
comment
Большое спасибо, вы очень помогли!   -  person AustriaWien    schedule 14.01.2015
comment
С удовольствием, вы можете поблагодарить меня, приняв ответ, и проголосовать (только), если вам это нравится!   -  person ShellFish    schedule 14.01.2015
comment
Важное примечание: правило эпсилон S -> eps может быть допустимым правилом ТОЛЬКО для типа 3 Хомского, если пустая строка принимается регулярным выражением!!   -  person ShellFish    schedule 14.01.2015
comment
У меня есть еще вопрос, вы выбрали названия штатов, такие как S, T, U и так далее... имеет ли значение, как эти штаты названы? могу ли я назвать их так же, как я назвал свои состояния в DFA? это будет выглядеть так: Z1 → aZ2 Z2 → bZ3 Z3 → cZ4 Z4 → cZ2 Z4 → dZ5 Z5 → ε Z1 → eZ6 Z6 → ε Z6 → fZ7 Z6 → gZ8 Z7 → ε Z7 → fZ7 Z7 → gZ8 Z8 → ε ε = Окончательное/пустое состояние?   -  person AustriaWien    schedule 14.01.2015
comment
Вы можете назвать их как угодно! Обычно ни один математик не беспокоится о такой семантике, если вы последовательны!   -  person ShellFish    schedule 14.01.2015
comment
Хорошо, я понял. Но в вашем примере: V -> d не будет ли правильно сделать так: V -> dW W -> ε Разве ε не является конечным состоянием?   -  person AustriaWien    schedule 14.01.2015
comment
Эпсилон - это не состояние, это переход. Вы бы написали эпсиолон не в вершине, а на ребре. Это означает пустой ввод. В контексте грамматик на самом деле нет состояний, только терминалы и нетерминалы. Когда у вас есть правило A -> a, строка перестает строиться, потому что нет нового нетерминала (следовательно, терминал ‹-› завершается). Наличие правила A -> eps означает, что вы добавляете пустой ввод, и вы больше ничего не можете с ним сделать, поскольку эпсилон является терминальным символом.   -  person ShellFish    schedule 14.01.2015
comment
Я хотел бы рассказать вам больше, но комментарии начинают спамить, поэтому объедините несколько вопросов и создайте новый вопрос или войдите в чат. Пожалуйста, также примите ответ!   -  person ShellFish    schedule 14.01.2015
comment
Ладно, последний вопрос по этой теме. В вашем решении второй части ef*g? Вы ничего не пропустите? Так не будет ли правильно так: Z1->eZ6 Z1->e Z6->fZ7 Z6->f Z6->g Z7-fZ7 Z7->g ?   -  person AustriaWien    schedule 16.01.2015
comment
Нет, это правильно, я считаю, ваше тоже правильно, но не минимально. Какую строку вы не можете сделать или какую можете сделать недействительной?   -  person ShellFish    schedule 16.01.2015
comment
Извините, я не понял вашего последнего предложения? Так что мое решение не является неправильным?   -  person AustriaWien    schedule 16.01.2015
comment
Нет, это не неправильно, это просто не оптимально. Чем меньше правил, тем оптимальнее.   -  person ShellFish    schedule 16.01.2015


Ответы (1)


Тип 3 Хомского — это класс регулярных грамматик, ограниченный использованием следующих правил:

X -> aY
X -> a,

в котором X — произвольный нетерминал, a — произвольный терминал. Правило A -> eps разрешено только в том случае, если A не присутствует ни в одной из правых сторон.

Строительство

Мы заметили, что регулярное выражение состоит из двух вариантов: (abc)+d или ef*g?, поэтому наши первые правила будут S -> aT и S -> eP. Эти правила позволяют нам начать создавать одну из двух возможностей. Заметим, что нетерминалы обязательно разные, это совершенно разные дизъюнктные пути в соответствующем автомате. Далее мы продолжаем работать с обоими регулярными выражениями по отдельности:

(abc)+ У нас есть по крайней мере одна последовательность abc, за которой следует 0 или более вхождений, нетрудно понять, что мы можем смоделировать это следующим образом:

S -> aT
T -> bU
U -> cV
V -> aT   # repeat pattern
V -> d    # finish word

ef*g? Здесь у нас есть буква e, за которой следует ноль или более символов f и необязательное значение g, поскольку у нас уже есть первый символ (это дает нам одно из первых двух правил), мы продолжаем, как это:

S -> eP
S -> e    # from the starting state we can simply add an 'e' and be done with it,
          # this is an accepted word!
P -> fP   # keep adding f chars to the word
P -> f    # add f and stop, if optional g doesn't occur
P -> g    # stop and add a 'g'

Заключение

Соедините их вместе, и они сформируют грамматику языка. Я попытался записать ход мыслей, чтобы вы могли его понять.

В качестве упражнения попробуйте следующее регулярное выражение: (a+b*)?bc(a|b|c)*

person ShellFish    schedule 14.01.2015