문제

컴파일러 수업을 위해 숙제를하고 있는데 다음과 같은 문제가 있습니다.

모든 문자열에 대한 정규 표현을 작성하십시오 '모래 홀수의 홀수를 포함합니다 홀수 또는 홀수 (또는 둘 다).

많은 화이트 보드 작업 후 다음 솔루션을 제시했습니다.

(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. 그 시점에서해야 할 일은 실제로 일치시키려는 가장 작은 문자열과 일치하는 끝에 무언가를 추가하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top