2012-06-24 5 views
8

뭔가fsm으로 regexp를 변환 할 수있는 컴파일러가 있습니까? 또는 인간의 단어로 변환 할 수 있습니까? 변환 할 수 있습니다

r"a+|(?:ab+c)" 

{ 
    (1, 'a') : [2, 3], 
    (2, 'a') : [2], 
    (3, 'b') : [4, 3], 
    (4, 'c') : [5] 
} 

또는 더 읽기에 정규 표현식을 인쇄 당신은 debug flag

유사한 2

+1

우리의 이론 CS 클래스에서는 정규식을 FSM으로 변환하는 방법을 사용했습니다. 결국 어쨌든 정규 표현식 엔진이 무엇을해야만하는지 정확히 알 수 있습니다. – Joey

답변

4

이 작업을 수행 할 수있는 코드가 있습니다. 문서화가 잘되어 있지 않고 지원되지 않습니다. 관심이 있으시면 언제든지 살펴 보시기 바랍니다.

라이브러리는 rxpy라고하고, 저장소는 http://code.google.com/p/rxpy

당신이 "점의 언어"에서 그래프를 얻을 것과 당신이 결과에 repr(...)를 호출하면 않는 구문 분석이 http://code.google.com/p/rxpy/source/browse/rxpy/src/rxpy/parser/pattern.py#871

에서 parse_pattern 인 루틴입니다 - https://en.wikipedia.org/wiki/DOT_language

예를 들어, 내가 무엇을 의미하는지 보여 http://code.google.com/p/rxpy/source/browse/rxpy/src/rxpy/parser/_test/parser.py#47

로 테스트를 참조하십시오의 테스트를 살펴 보자 http://code.google.com/p/rxpy/source/browse/rxpy/src/rxpy/parser/_test/parser.py#234에있는 'ab*c'입니다 : 0에서 시작하는

"""digraph { 
0 [label="a"] 
1 [label="...*"] 
2 [label="b"] 
3 [label="c"] 
4 [label="Match"] 
0 -> 1 
1 -> 2 
1 -> 3 
3 -> 4 
2 -> 1 
}""" 

있는가 "는"이 상태 1로 이동 일치시킬 수 있습니다. 여기에서 "b"와 일치하여 2 상태로 이동하거나 "c"를 사용하여 3 상태로 이동할 수 있습니다. 상태 2은 다른 "b"등을 소비 할 수있는 1으로 다시 전환됩니다. 수동으로 읽으려면 약간 추합니다. 그러나 테스트가 실패하면 화면에 작은 그래프가 표시됩니다.

또한 라이브러리에는이 그래프에 대해 문자열을 일치시키는 다양한 "엔진"이 있습니다 (정규 표현식 일치도 마찬가지입니다). 하지만 파이썬 라이브러리보다 훨씬 느립니다 (순수 파이썬이므로).

이것은 지원되지 않으며 매우 명확하지 않을 수 있습니다. - 죄송합니다.하지만 원하는대로 가깝고 유용한 경우 (MPL 또는 LGPL 라이센스) 사용할 수 있습니다.

6

5 받아들이는 무엇인가 형태 :

>>> import re 
>>> re.compile(r"a+|(?:ab+c)", flags=re.DEBUG) 
branch 
    max_repeat 1 65535 
    literal 97 
or 
    subpattern None 
    literal 97 
    max_repeat 1 65535 
     literal 98 
    literal 99 
<_sre.SRE_Pattern object at 0x0000000002325328> 
관련 문제