2011-03-07 2 views
0

나는 사용자 정의 언어에 대한 파이썬 파서를 쓰고 있어요 내가 이런 일이 지금과 같이구문 분석 기술을 어떻게 향상시킬 수 있습니까?

re1 = re.compile(r"...") 
re2 = re.compile(r"...") 
re3 = re.compile(r"...") 
re4 = re.compile(r"...") 
... 
... 

지금은 입력 파일을 읽고 각 라인 오전 그때 내가 사용하고 특정 키워드를 찾을 경우 특정 정규 표현식. 나는이 같은 일을하고 있기 때문에 분명히, 이것은 내 인생 살아있는 지옥을하고있다 : 동시에

if line.find("keyword1") >= 0 
    # Uses re1 to match the string 
    invoke_handler1() 
elif line.find('keyword2") >= 0 
    # Uses re2 to match the string 
    invoke_handler2() 
... 

을, 나는 그것이 낭비 때문에 가능한 모든 정규 표현식 주어진 라인과 일치하지 않습니다 . 이 시점까지 내가 쓴 모든 것을 버리지 않고,이 문제를 해결하고 더 효율적이고 읽기 쉽도록 우아한 방법이 있습니까?

+1

당신은 진짜 [파서]을 사용하여 생각 해 봤나 (http://wiki.python.org/moin/LanguageParsing)? – nmichaels

+0

이 파서는 무엇입니까? 구문 분석 할 텍스트/코드의 복잡성에 대해 자세히 설명해 주시겠습니까? –

+0

@nmichaels : 좀 더 자세히 살펴 봐야 할 것 같습니다. 감사! @ Nicolas Buduroi : 바이트 코드 해체를 파싱 중입니다. – Legend

답변

3

보다는 파이썬에 사용할 수있는 many parser libraries 중 하나를 살펴 가질 수 사용하여 자신의 파서를 압연.

+0

+1 감사합니다! 그것은 꽤 많은 목록을 제공합니다. – Legend

2

나는 이것이 당신이 찾고있는 해답이라고 생각하지 않는다,하지만 난 당신이있을 거라고 생각 귀하의 언어를 파싱하기 위해 실제 Lexer 및 Tokenizer를 사용하는 것이 더 좋습니다. 나는이 유형의 작업을보고보고 PLY을 사용하는 방법을 제안합니다.

1

당신은 RE들에 데이터 구조를지도 키워드를 만들 수 있습니다. 하지만 솔직히 말해서, 나는 우선 순위를 매기는 RE를 빨리 만들고 모든 것을 반복 할 것입니다.

페일 빠른 RE의 예

은 첫 번째 문자가 "S"를 일치하지 않는 경우 다음 RE의 나머지 부분은 평가되지 않기 때문에 "^ Sometext"로 시작 하나가 될 것입니다.

관련 문제