2015-11-10 3 views
0

do (a + b) * и (a | B) * производят тот же DFA и тот же выход? В математике, где используется слово «или», мы используем оператор сложения. Значит ли это, что оба выражения эквивалентны?Компилятор DFA (a + b) * vs (a | b) * любая разница между обоими?

+0

Ну, если вы говорите, что первое является математическим обозначением, а второе - обозначением регулярных выражений, так что '+' в первом означает то же самое, что '' 'в последнем, то да, они эквивалентны. – Bergi

+0

Я говорю в терминах обозначения регулярных выражений. Пожалуйста, помогите мне с cfg CFG для (a + b) * будет s-> aSbS |^CFG для (a | b) * будет s-> aS | bS |^am Я работаю в правой направление? – user3001571

+0

Нет, '(a + b) *' is 'Repeat (Concat (Repeat (« a »,> = 1),« b »)),> = 0)' – Bergi

ответ

1

Это зависит от контекста, из которого вы получаете 2 регулярных выражения.

Если вы интерпретируете оба регулярных выражения в синтаксисе двигателей регулярных выражений реального времени, они имеют разные значения, такие как Ed Cottrell explained in his answer. + означает повторение один или несколько раз. | означает чередование.

Однако они могут означать одно и то же, если вы интерпретируете + в (a+b)* как чередовании после обозначения в большинстве книг по теории автоматов и | в (a|b)* как чередовании, следуя обозначения наиболее реальными долговечные двигатели.

1

No.

(a+b)* матчи по меньшей мере, один a следуют через b, ноль или более раз. Таким образом, для соответствия непустой строке строка должна в какой-то момент содержать ab.

(a|B)*a или b, ноль или более раз. Он может соответствовать пустой строке, строку всех a с, строку всех b с и т.д.

Второе выражение совпадает со всей строкой в ​​следующих примерах: a, aa, aaa, b, bb, bbb и т. д. Первое выражение технически соответствует (потому что строка нулевой длины будет соответствовать), но не соответствует всей строке. Захваченные группы разные.

Таким образом, нет, они не эквивалентны.

+0

спасибо! Так что я пытаюсь написать cfg для обоих. – user3001571

+0

CFG для (a + b) * будет s-> aSbS |^ CFG для (a | b) * будет s-> aS | bS |^ am Я работаю в правильном направлении? – user3001571

+0

@ user3001571: Нет, в обозначении регулярных выражений символ '+' означает «один или несколько», поэтому 'a +' = 'aa *' – Bergi