暂停/继续解析PEGKit Parser?

时间:2014-07-03 15:00:38

标签: ios objective-c parsing pegkit

我有一个从PEGKit创建的解析器(示例项目here)。

我想暂停解析,而不停止主线程。由于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:)];
}

1 个答案:

答案 0 :(得分:1)

PEGKit的开发人员。

我认为,当您考虑PEGKit +线程是您正在寻找的时候,这将是显而易见的。并且没有额外的功能需要添加到PEGKit中。

您正在寻找通过PEGKit暂停和恢复执行解析的能力。您已经可以使用线程访问此功能。

只需在后台线程上执行解析,并通过调用阻塞的方法暂停该线程,直到用户表明她想要继续。这基本上是终端提供的相同类型的环境/体验:在等待用户输入时执行和暂停。 (我自己用一些thread utils I posted here实现了这个。)

所以我认为将线程直接提供的所有功能添加到PEGKit将是错误的方法。

如果要跟踪PEGKit解析的状态,只需在解析器委托回调中管理一堆方法名称。