2012-02-20 9 views
8

렉서에 DFA 최소화기를 구현하려고하지만 해당 DFA가 이미 최소 DFA 인 것처럼 보이지 않는 DFA를 생성 할 수 없습니다. 표현.유효하지 않은 상태 또는 불필요한 상태로 DFA를 생성하는 정규식

나는 후미 정규 표현식에서 톰슨 구조를 사용하여 작성된 NFA에서 DFA를 구성하고 있습니다. 용 책에 묘사 된 내용은 거의 정확히 그대로입니다. 렉서를 만들려면 NFA의 몇 개가 시작 상태에서 엡실론 전환을 사용하여 결합됩니다. 이 결합 된 NFA에서 DFA 알고리즘이 적용됩니다.

그래서 죽은 상태 제거 및 상태 최소화를위한 멋진 테스트 베드를 만드는 DFA를 생성하는 "알려진"정규 표현식이 있습니까?

물론 이상한 DFA를 해킹하고 알고리즘을 적용 할 수는 있지만 실제로 적절한 테스트 케이스는 아니겠습니까? DFA를 구성하는 메소드가 죽은 상태가 발생하지 않도록하려면 해당 정보도 가치가있을 것입니다. 그 이후로 상태 제거 기능을 모두 구현하지 않아도됩니다.

편집 : 정확하게 대답하기 위해 구현 세부 사항을 필요로 경우, 코드가, 특히 NFA.csDFA.cs 클래스 github 볼 수 있습니다. 또한 내가 도움이된다면, 내가 사용하고있는 건설 알고리즘에 대한 blog posts에 관한 시리즈를 썼다.

답변

3

좋아, 그래서 나는 이것을 완전히 원형으로 발견했다. 파서에서 꽤 좋은 디버그 출력을 얻었 기 때문에 정규 표현식을 시각화하기위한 도구를 만들었습니다. 도구에 표시 (a+b+c+)+|abc

: http://regexvisualizer.apphb.com/?Regex=%28a%2Bb%2Bc%2B%29%2B%7Cabc&NfaSize=300&DfaSize=250#

이 도구는 현재 어떤 최적화없이 똑바로 톰슨 건설을 수행이 적절 표준 톰슨 건설 기술을 사용하여 당신에게 꽤 바보 오토마타를 줄 것 같은 표정을 보여줍니다. 완전히 불필요한 표현식 부분 인 |abc을 제거하면 표현식은 그대로 유지됩니다. 그렇지 않습니다.