이 정규식을 더 이상 단순화 할 수 있습니까?
-
07-07-2019 - |
문제
컴파일러 수업을 위해 숙제를하고 있는데 다음과 같은 문제가 있습니다.
모든 문자열에 대한 정규 표현을 작성하십시오 ㅏ'모래 비홀수의 홀수를 포함합니다 ㅏ홀수 또는 홀수 비(또는 둘 다).
많은 화이트 보드 작업 후 다음 솔루션을 제시했습니다.
(aa|bb)* (ab|ba|a|b) ((aa|bb)* (ab|ba) (aa|bb)* (ab|ba) (aa|bb)*)*
그러나 이것이 내가 얻을 수있는 가장 단순화 된 것입니까? 나는 그것이 단순화하는 데 도움이 될지 확인하기 위해 상태의 수를 최소화하려고 노력하는 DFA를 구성하는 것을 고려했지만 Regex 전문가에게 먼저 물어볼 것이라고 생각했습니다.
해결책
(AA)*로 시작하여 그곳에서가는 Greg D의 추천을 받으십시오. SEPP2K는 거의 그것을 가지고 있지만 실제 고려 사항은 다른 편지에 대해 신경 쓰지 않는다는 것입니다. 내 말은, "A의 홀수"제약 조건을보고있을 때, 당신은 당신의 끈에있는 B가 무엇인지에 대해 전혀 신경 쓰지 않는다는 것입니다. 따라서, 당신이 할 수있는 모든 곳에서 b*를 붙잡고 :)
SEPP2K의 답변은 거의 옳지 만 이것은 정확합니다.
b* a b* (a b* a b* )* | a* b a* (b a* b a* )*
자세히 설명하기 위해,이 regex는 홀수의 A (첫 번째 섹션)가있는 모든 문자열을 파악하고 OR은 홀수의 B를 포함하는 문자열이있는 문자열을 파악합니다.
다른 팁
이것은 작동해야합니다 :
b* a b* (a b* a b*)* | a* b a* (b a* b a*)*
나는 당신의 성분이 옳다고 믿지 않을까 두렵습니다. 문자열을 고려하십시오 :
aba
우리는 성냥에 대한 몇 가지 선택을 가지고 있지만, 홀수 길이라는 사실은 우리가 앞면의 고독한 A와 일치해야한다는 것을 의미합니다.
(a)(ba)
그러나 슬프게도 두 번째 메인 그룹이 일치하는 것은 불가능합니다 (BA).
이와 같은 제약을 다룰 때, 나는 핵심 제약 조건에서 시작하고 거기에서 가기가 더 쉽다는 것을 알았습니다. 이 경우 제약 조건은 "홀수"입니다.
a(aa)*
홀수의 강제 a
그리고 거기에서 가십시오. :)
문제에 다르게 접근해야한다고 생각합니다.
당신은 두 사람의 숫자가없는 것을 일치 시키려고 노력하고 있습니다. a
그리고 b
.
일치하는 무언가로 시작하는 것이 더 쉬울 것입니다. 조차 숫자 a
그리고 b
. 그 시점에서해야 할 일은 실제로 일치시키려는 가장 작은 문자열과 일치하는 끝에 무언가를 추가하는 것입니다.