2012-03-10 3 views
3

ParseKit 문법 구문 (데모 응용 프로그램에서 놀고)을 조금 쥐고 있어야하는데, 지금은 나만의 미니 데모를 만들려고 노력하고 있지만, 지금까지별로 성공하지 못했습니다. 어셈블러 콜백이 호출되지 않습니다.ParseKit 어셈블러 콜백이 호출되지 않습니다. 무엇이 잘못 되었나요?

다음은 관련 코드의 요약본입니다. testParse을 실행하면 파서가 정상적으로 작동하고 내 문자열을 내 anything 프로덕션 (정확하게 데모에서 작동 함)과 정확하게 일치 시키지만 didMatchAnything :은 그냥 호출되지 않습니다.

#import <Foundation/Foundation.h> 

@class PKParser; 

@interface FileParserThing : NSObject { 
    PKParser* _parser; 
} 
- (void)testParse; 
@end 


#import <ParseKit/ParseKit.h> 
#import "FileParserThing.h" 

@interface FileParserThing() 
@property (nonatomic, retain)PKParser* parser; 
- (void)didMatchAnything:(PKAssembly *)a; 
@end 

@implementation FileParserThing 

@synthesize parser = _parser; 

-(id)init 
{ 
    if (!(self = [super init])) return nil; 

    NSString *g = @"@start = anything; anything = Any+;"; 
    self.parser = [[PKParserFactory factory] parserFromGrammar:g assembler:self]; 

    return self; 
} 

- (void)testParse 
{ 
    NSString *s = @"Foo Bar"; 
    NSLog(@"test parse with: %@", s); 
    [self.parser parse:s]; 
} 

- (void)didMatchAnything:(PKAssembly *)a 
{ 
    NSLog(@"Hooray!"); 
} 

@end 

나는 assembler이 전무이기 때문에, 실행되지 않는

[assembler performSelector:assemblerSelector withObject:self withObject:a]; 

PKParser

의 라인 (129)을 참조 ParseKit 코드 주위에 수 파고. 차례 차례로 나를 파서 공장으로 안내합니다. 무슨 일이 벌어지고 있는지에 대한 나의 이해가 실패하기 시작하는 곳.

면책 사항; 알아요, 아마 을 읽을 필요가 있지만 한 번에 한 가지만 읽으십시오. 나는 프로젝트가 비 스타터 인 경우 다시 읽지 못할 수도있는 책 30 마리를 포크하기 전에 작은 개념 증명 작업을 원합니다 :)

답변

5

Developer of ParseKit here.

  1. 현재 토큰을 일치 파서 :

    얼마 다시 나는 인수를 허용하도록 어셈블러 콜백의 서명을 변경했습니다.

  2. 어셈블리 입력 구문 분석의 현재 상태가 들어 있습니다.

이전에는 하나의 인수 만있었습니다. 어셈블리.

문서가이를 반영하도록 완전히 업데이트되었는지 모르겠습니다.

그래서 난 당신이 단순히이에 어셈블러 콜백 방식을 변경하는 경우, 그것은 작동합니다 의심 :

- (void)parser:(PKParser *)p didMatchAnything:(PKAssembly *)a { 
    NSLog(@"%s %@", __PRETTY_FUNCTION__, a); 
} 

그렇지 않다면, 알려, 나는 더 디버그에 도움이됩니다.


배경에 대 한 : 내 어셈블러 콜백이 정말 현재의 경기를 만들었다 파서을 검사하는 데 필요한 상황으로 실행하기 때문에이 변경을했다.

또한 더 밀접하게 항상 첫 번째 인수로 위임자 개체가 위임 콜백의 강한 코코아 규칙 정렬됩니다. 뒤늦은 견해로는 나는 전체 개념을 으로 바꾸고 싶다. ParseKit의대표자으로 바꾼다. 코코아 어법에서, 그것은 기본적으로 Assemblers입니다.

+0

리치, 여기에 제 제안 조정을 적용하여 예제를 설정했는데 제대로 작동하는 것처럼 보입니다. –

+0

좋은 물건, 그랬어. 빨리 답변 해 주셔서 대단히 감사합니다! – Rich

+0

웹 사이트를 오류 : params 및 새 파서 : param의 사용법을 포함하여 최신 예제로 업데이트 할 수 있다면 좋을 것입니다. 그렇지 않으면 ParseKit이 멋지게 보입니다! – Grimless