ParseKit . :
1) , . , .
, :
@symbolState = '"' "'";
@symbols = '${';
@reportsWhitespaceTokens = YES;
@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;
}
- (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 =
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 . . 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;
} else if ([@"}" isEqualToString:tok.stringValue]) {
} else {
[result appendString:tok.stringValue];
}
}