Простой разбор разметки с использованием парсекита
Я пытаюсь разобрать действительно небольшое подмножество HTML-разметки.
PKSequence *parrser = [PKSequence sequence];
[parrser add:[PKSymbol symbolWithString:@"<title>"]];
PKWord *word = [PKWord word];
[word setAssembler:self selector:@selector(workOnWordAssembly:)];
[parrser add:word];
[parrser add:[PKSymbol symbolWithString:@"</title>"]];
PKAssembly *result = [parrser bestMatchFor:[PKTokenAssembly assemblyWithString:@"<title>teeest</title>"]];
-(void)workOnWordAssembly:(PKAssembly *)a {
NSLog(@"We entered this");
}
но workOnWordAssembly
не вызывается.
1 ответ
Решение
Разработчик ParseKit здесь. Убедитесь, что вы используете голову ствола в коде Google.
- Обратные вызовы ассемблера теперь имеют два аргумента.
- По умолчанию строка
<title>
не будет маркироваться как токен с одним символом. Это был бы один<
Символ токен, одинtitle
Слово токен и один>
Символ токена. Однако вы можете настроить это поведение.
Пожалуйста, прочтите документацию по ParseKit, в частности, документы по токенизации, чтобы понять, как работает токенизация в ParseKit.
Вот что не хватает для выполнения вашей основной задачи выше. Однако я не уверен, что это лучший подход для решения реальных задач. Я думаю, что чтение упомянутых выше документов поможет объяснить это.
PKTokenizer *t = [PKTokenizer tokenizerWithString:@"<title>foobar</title>"];
[t.symbolState add:@"<title>"];
[t.symbolState add:@"</title>"];
PKAssembly *a = [PKTokenAssembly assemblyWithTokenizer:t];
PKSequence *p = [PKSequence sequence];
[p add:[PKSymbol symbolWithString:@"<title>"]];
PKWord *word = [PKWord word];
[word setAssembler:self selector:@selector(parser:didMatchWord:)];
[p add:word];
[p add:[PKSymbol symbolWithString:@"</title>"]];
PKAssembly *result = [p bestMatchFor:a];
-(void)parser:(PKParser *)p didMatchWord:(PKAssembly *)a {
NSLog(@"%s %@", __PRETTY_FUNCTION__, a);
}