개발자는 여기 ParseKit. 귀하의 질문에 모두 답변 드리겠습니다 :
1) 올바른 접근 방법을 취하고 있지만 이것은 까다로운 경우입니다. 몇 가지 작은 문제가 있으며 문법을 약간 변경해야합니다.
내가 나를 위해 노력하고 문법 개발 한
:
// Tokenizer Directives
@symbolState = '"' "'"; // effectively tells the tokenizer to turn off QuoteState.
// Otherwise, variables enclosed in quotes would not be found (they'd be embedded in quoted strings).
// now single- & double-quotes will be recognized as individual symbols, not start- & end-markers for quoted strings
@symbols = '${'; // declare '${' as a multi-char symbol
@reportsWhitespaceTokens = YES; // tell the tokenizer to preserve/report whitespace
// Grammar
@start = content*;
content = passthru | variable;
passthru = /[^$].*/;
variable = start name end;
start = '${';
end = '}';
name = Word;
이 그런 다음 어셈블러이 두 콜백을 구현을 :
- (void)parser:(PKParser *)p didMatchName:(PKAssembly *)a {
NSLog(@"%s %@", __PRETTY_FUNCTION__, a);
PKToken *tok = [a pop];
NSString *name = tok.stringValue;
// do something with name
}
- (void)parser:(PKParser *)p didMatchPassthru:(PKAssembly *)a {
NSLog(@"%s %@", __PRETTY_FUNCTION__, a);
PKToken *tok = [a pop];
NSMutableString *s = a.target;
if (!s) {
s = [NSMutableString string];
}
[s appendString:tok.stringValue];
a.target = s;
}
그리고 클라이언트/드라이버 코드는 같을 것이다 이 :
NSString *g = // fetch grammar
PKParser *p = [[PKParserFactory factory] parserFromGrammar:g assembler:self];
NSString *s = @"<img src=\"${image}\" />";
[p parse:s];
NSString *result = [p parse:s];
NSLog(@"result %@", result);
이 인쇄됩니다 :
result: <img src="" />
2) 예, 나는 확실히이 비교적 간단한 경우 직접 토크 나이를 사용하는 것이 훨씬 더 좋을 것이다 생각합니다. 성능은 엄청나게 좋아질 것입니다. 다음은 Tokenizer로 작업에 접근하는 방법입니다.
PKTokenizer *t = [PKTokenizer tokenizerWithString:s];
[t setTokenizerState:t.symbolState from:'"' to:'"'];
[t setTokenizerState:t.symbolState from:'\'' to:'\''];
[t.symbolState add:@"${"];
t.whitespaceState.reportsWhitespaceTokens = YES;
NSMutableString *result = [NSMutableString string];
PKToken *eof = [PKToken EOFToken];
PKToken *tok = nil;
while (eof != (tok = [t nextToken])) {
if ([@"${" isEqualToString:tok.stringValue]) {
tok = [t nextToken];
NSString *varName = tok.stringValue;
// do something with variable
} else if ([@"}" isEqualToString:tok.stringValue]) {
// do nothing
} else {
[result appendString:tok.stringValue];
}
}
감사합니다. Todd! 더 빠르고 덜 복잡한 구현으로 보이기 때문에 토큰 화 방법을 택할 것입니다. 그래도 어느 시점에서는 문법을 사용하기를 기대합니다. – pgb