2

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

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

1 回答 1

1

PEGKit 的开发者在这里。

我认为当您考虑它时会很明显,PEGKit + 线程就是您正在寻找的东西。并且不需要为此向 PEGKit 添加额外的功能。

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

只需在后台线程上执行解析,并通过调用阻塞的方法暂停该线程,直到用户表示她想继续。这本质上与终端提供的环境/体验类型相同:在等待用户输入时执行和暂停。(我已经用我在这里发布的一些线程实用程序自己实现了这个东西。)

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

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

于 2014-07-04T17:21:37.220 回答