2013-10-10 1 views
0
이 게시물에 설명 된대로 나는 현재 정규 표현식을 사용하여 렉서를 쓰고

는 : Poor man's "lexer" for C#비 정규식 대안

그것은 내가 이미 가지고있는 것보다 훨씬 빠른 동안, 난 그냥 아직도 어떻게 일을 좋아하지 않았다 파일 당 약 500ms 걸렸습니다 (스톱워치로 100x36k 토큰 루프에서 시간 측정).

내 토큰의 우선 순위 주위를 이동 한 후에 이미 500ms를 반으로 줄 였고 대부분의 토큰에 "단순 일치"부울을 추가하여 추가로 50ms를 얻었습니다 (기본적으로 단순한 string.Contains(Ordinal) 대신 Regex.Match).

최상의 성능을 얻으려면 모든 전화기가 Regex.Match이 아니더라도 최대한 제거하고 싶습니다. 그게 가능하기 위해서는 Regex에 \b 태그를 시뮬레이트하는 무언가가 필요합니다. 그렇지 않으면 단어 경계로 알려져 있습니다 (단어 전체에만 일치해야 함).

"단순한 일치"전후의 문자가 단어가 아닌 문자인지 확인하는 간단한 방법을 쓰는 동안 .NET에이 기본 제공 기능이 있는지 궁금해하고 있었습니까?

만약 내가 내 자신의 방법을 써야한다면, 최선의 접근 방법은 무엇일까요? 내 단어 뒤에있는 문자의 색인을 선택하고 바이트 값이 무엇보다 낮 으면 확인하십시오. 이것에 관한 조언도 환영합니다!

+0

'\ b'는 단어가 문자, 숫자 및 밑줄로 구성된 경우에만 단어 경계와 일치합니다.다른 모든 경우에는 쓸모가 없습니다. – Joey

+0

나는 알고있다. 그러나 헤드 업에 감사한다! '\ b'의 정확한 동작을 시뮬레이트하는 한, 필자의 렉서 (lexer)는 내가 기대하는 정확한 출력을 만들어 낼 것이다. –

+1

정규식을 프리 컴파일하고 있습니까? 그러면 정규식 일치 속도가 빨라질 수 있습니다. 또한 [이 질문] (http://stackoverflow.com/questions/5039512/regex-match-in-c-sharp-performance-problem) 정규식이 처리하는 데 시간이 오래 걸리는 이유에 대한 통찰력을 얻을 수 있습니다. 표현을 보지 않고서는 알기가 어렵습니다. –

답변

1

내 초기 질문이 내게 왜 하찮다는 생각이 들지 모르겠다. 나는 Regex를 프로파일 링으로 고정시킨 후에도 가장 단순한 Regex조차도 내가 원하는 것보다 더 많은 것을 필요로한다는 것을 보여 주었다. 그것은 가난한 사람의 렉서일지도 모른다. 그러나 나는 여전히 그것이 가능한 한 최고로 수행되기를 바란다.

그러나 .NET에서 단어 경계에 대한 대안이 내장되어 있고, 그렇지 않은 경우 Regex를 사용하지 않고 직접 구현하는 방법에 대한 의문이있었습니다.

첫 번째 질문에 대한 대답은 아니요, 인 것으로 보입니다.

두 번째에 관해서는, 나는 char 클래스에 대한 확장-방법을 썼다 :

public static bool IsWordCharacter(this char character) 
{ 
    return (
     (character >= 'a' && character <= 'z') || 
     (character >= 'A' && character <= 'Z') || 
     (character >= '0' && character <= '9') || 
     character == '_'); 
} 

을 가장 정규식 문서에 따르면,이 모방 \w 플래그 (분명히 \W에서 ! 결과이 방법을 부정) 그 답례로 \b에서 사용되지만 결과에 일치하지 않습니다.

나는 다음과 같은 방법 무언가 이것을 사용 : 그것은 사용하거나 토큰을 삭제해야하는 경우

return 
    text.StartsWith(<needle>, StringComparison.Ordinal) 
    && !text[<length of needle>].IsWordCharacter() 
     ? <length of needle> 
     : 0; 

후 내 기본 코드는 알고있다.

면책 사항 : 전체 구현이 \b은 아니지만 제 목적을 달성 한 것으로 알고 있습니다.

또한이 방법으로 모든 Regex '를 변환 한 후 정확히 동일한 파일을 위해 250ms에서 50ms로갔습니다. 내 소유로 있어야하는 110 개의 스크립트 파일을 모두 합하면 파일 당 평균 약 7ms의 평균 시간이 필요하지 않습니다.