2013-03-02 7 views
1

단어의 접두어처럼 ParseKit을 사용하여 부분 문자열을 구문 분석하려고한다고 가정 해보십시오. 예를 들어 '미리보기'와 '검토'를 구문 분석하고 싶습니다. 그래서 내 문법는 다음과 같을 수 있습니다 하위 문자열을 토큰 화하기 위해 ParseKit에서 PKTokenizer를 사용자 지정하려면 어떻게해야합니까?

@start = prefix 'view'; 
prefix = 'pre' | 're'; 

지금 ParseKit를 수정하지 않고 내가 '미리보기'와 '다시보기'가 아니라 '미리보기'또는 '검토'를 일치시킬 수 있습니다. 문서를 보면서 필자는 PKTokeinzer의 단어 상태를 사용자 정의해야 할 필요가 있다고 생각합니다. 'Word'토큰을 종료하기 위해 공백을 찾고 있기 때문입니다. 어떻게해야합니까?

답변

1

개발자는 ParseKit입니다.

나는이 질문을 완전히 이해하고 있는지 확신 할 수 없지만, 다소 잘못된 것으로 생각됩니다.

하위 토큰 또는 문자를 일치시키는 방법을 찾고있는 경우 정규식이 ParseKit보다 더 적합 할 수 있습니다.

ParseKit 문법은 ParseKit 토큰 라이저 (PKTokenizer 클래스)가 생성 한 토큰과 일치합니다. 개별 문자가 아닙니다.

PKTokenizerpreview의 입력에서 preview 토큰을 생성 할 수 없다는 것이 아닙니다. 그러나 나는 현명하지 않고 불필요하게 복잡한 코드를 사용자 정의해야 할 것입니다. 나는 그것이 나쁜 생각이라고 생각한다.

어쨌든 ParseKit (Regex가 아닌)을 사용하려는 경우 어셈블러 콜백 (문법 대신)에서 하위 구문 분석을 간단하게 수행 할 수 있습니다. 그래서 문법에

:

@start = either; 
either = 'preview' | 'review'; 

그리고 ObjC의 :

- (void)parser:(PKParser *)p didMatchEither:(PKAssembly *)a { 
    PKToken *tok = [a pop]; 
    NSString *str = tok.stringValue; 

    if ([str hasPrefix:@"pre"]) { 
     ... // handle 'preview' 
    } else { 
     ... // handle 'review' 
    } 
} 

또한 ParseKit 문법은 정규식을 통해 일치하는 토큰을 지원하는 것을 기억하십시오. 따라서 끝나는 단어가 모두 view 인 경우

@start = anyView; 
anyView = /\b\w*?view\b/; 

희망 사항을 찾으십시오.