Приостановить / продолжить анализ PEGKit Parser?
У меня есть парсер, созданный из PEGKit (пример проекта здесь).
Я хочу приостановить разбор, не останавливая основной поток. поскольку PEGKit
имеет бесконечный возврат и знает, где курсор / голова находится во входной строке, должна быть возможность возобновить анализ.
Было бы очень полезно, чтобы я мог создать пошаговый парсер. Таким образом, синтаксический анализатор должен ждать действия пользовательского интерфейса, как нажатие UIButton
,
Как реализовать или приостановить, а затем возобновить анализ?
В качестве примера я хотел бы приостановить синтаксический анализ при достижении определенного символа. Вот бы после ;
(точка с запятой или EXPRESSIONPARSER_TOKEN_KIND_SEMI_COLON
).
Так что после токена ;
Это должно сохранить состояние, чтобы я мог вернуться и разобрать с этой позиции.
Код:
- (void)start {
[self main_];
[self matchEOF:YES];
}
- (void)__main {
while ([self speculate:^{ [self expression_]; }]) {
[self expression_];
}
[self fireDelegateSelector:@selector(parser:didMatchMain:)];
}
- (void)__expression {
if ([self speculate:...) {
if ([self predicts:...) {
[self _subExpression];
} else {
[self raise:@"No viable alternative found in rule 'expression'."];
}
}
[self match:EXPRESSIONPARSER_TOKEN_KIND_SEMI_COLON discard:NO];
[self fireDelegateSelector:@selector(parser:didMatchExpression:)];
}
1 ответ
Разработчик PEGKit здесь.
Я думаю, когда вы об этом подумаете, будет очевидно, что потоки PEGKit + - это то, что вы ищете. И что для этого не нужно добавлять дополнительные функции в PEGKit.
Вы ищете возможность приостановить и возобновить выполнение анализа с помощью PEGKit. У вас уже есть доступ к этой функции с потоками.
Просто выполните синтаксический анализ фонового потока и приостановите его, вызвав метод, который блокируется, пока пользователь не укажет, что он хочет продолжить. По сути, это тот же тип среды / опыта, который предоставляет терминал: выполнить и приостановить, ожидая ввода данных пользователем. (Я сам реализовал это с помощью некоторых утилит, размещенных здесь.)
Поэтому я думаю, что добавление всех функций, которые потоки предоставляют непосредственно в PEGKit, было бы неправильным подходом.
Если вы хотите отслеживать состояние анализа PEGKit, просто управляйте стеком имен методов в обратных вызовах делегата анализатора.