Разработчик ParseKit здесь.Я могу внести две вещи:
1.
Я попробовал ваш пример, используя текстовый файл, созданный либо в TextMate, либо в TextWrangler (сохраненный в виде файла .txt), и все казалосьотлично работаетМои обратные вызовы -parser:didMatchEol:
и -parser:didMatchTexline:
были вызваны, как и ожидалось.
Если это не работает для вас, возможно, попробуйте начать с ввода строки в памяти, чтобы посмотреть, будет ли это работать по крайней мере:
NSString *s = @"foo bar\nbaz bat\n";
[parser parse:s];
В любом случае, вот мой код из DebugAppDelegate.m
, который работает для меня с вводом в память или на диск:
- (void)doTestGrammar {
NSString *g = @"@symbolState = '\n'; @start = textline*; textline = Any* eol; eol = '\n';";
PKParser *p = [[PKParserFactory factory] parserFromGrammar:g assembler:self];
//NSString *s = @"foo bar\nbaz bat\n";
NSString *path = [@"~/Desktop/text.txt" stringByExpandingTildeInPath];
NSString *s = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
[p parse:s];
}
- (void)parser:(PKParser *)p didMatchEol:(PKAssembly *)a {
NSLog(@"%s %@", __PRETTY_FUNCTION__, a);
}
- (void)parser:(PKParser *)p didMatchTextline:(PKAssembly *)a {
NSLog(@"%s %@", __PRETTY_FUNCTION__, a);
}
2.
Я на самом деле был немного удивлен тем, что ваш пример сработал, так как я думал, что использование вами Any*
будет жадно потреблять токены \n
в конце строки, таким образом, ничто не сравнится с производством eol
.
Однако, как я уже говорил, это не было проблемой, когда я запускал ваш пример (для ParseKit HEAD транка).
Тем не менее, для хорошей меры, я бы, вероятно, рекомендовал изменить вашу textline
производство к этому:
textline = ~eol* eol;
определение этого производства должно читаться как:
ноль или более токенов, НЕ соответствующих eol
, за которыми следует один токен, соответствующийeol
~
является логическим оператором отрицания в синтаксисе грамматики ParseKit.
После внесения этого изменения в мой пример кода все по-прежнему работает должным образом.
Если вы все еще не можете его получитьработая после этих двух советов, дайте мне знать.