Простой разбор разметки с использованием парсекита

Я пытаюсь разобрать действительно небольшое подмножество 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.

  1. Обратные вызовы ассемблера теперь имеют два аргумента.
  2. По умолчанию строка <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);
}
Другие вопросы по тегам