我想暂停解析,而不停止主线程。由于PEGKit
具有无限回溯并且知道光标/头部在输入字符串的位置,因此应该可以恢复解析。
这将非常有用,因此我可以创建一步一步的解析器。因此,解析器必须等待ui操作,例如按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:)];
}
答案 0 :(得分:1)
PEGKit的开发人员。
我认为,当您考虑PEGKit +线程是您正在寻找的时候,这将是显而易见的。并且没有额外的功能需要添加到PEGKit中。
您正在寻找通过PEGKit暂停和恢复执行解析的能力。您已经可以使用线程访问此功能。
只需在后台线程上执行解析,并通过调用阻塞的方法暂停该线程,直到用户表明她想要继续。这基本上是终端提供的相同类型的环境/体验:在等待用户输入时执行和暂停。 (我自己用一些thread utils I posted here实现了这个。)
所以我认为将线程直接提供的所有功能添加到PEGKit将是错误的方法。
如果要跟踪PEGKit解析的状态,只需在解析器委托回调中管理一堆方法名称。