暂停并恢复 Ragel 中的解析

Pausing and resuming parsing in Ragel

本文关键字:Ragel 恢复 暂停      更新时间:2023-10-16

我正在使用Ragel来解析C++中的字符串。我需要能够无限期地暂停解析,然后从我中断的地方继续解析。

现在,我正在尝试通过在完成操作结束时放置一个fbreak来做到这一点。这似乎工作正常,将控制权交还给父程序。但是,我不确定如何恢复解析。我认为仅调用%write exec生成的代码就足够了,但事实似乎并非如此。当它重新进入解析时,对原始字符串的引用似乎是错误的/丢失的。

不确定我在这里C++做错了什么(这不是我的母语),还是我对 Ragel 采取了错误的方法。

这是我的开始和恢复代码:

const char *p;
const char *pe;
void start()
{
    int len = theString.length();
    char chars[len+1];
    theString.toCharArray(chars, len+1);
    p = chars;
    pe = chars + len;
    resume();
}
void resume() {
    %% write exec;
}

我第一次调用start(),我的状态机最终fbreak出来,然后我打电话给resume()(希望)继续解析。

关于我可能做错了什么的任何指示?

看起来这是某种悬空指针问题。将theString的初始化移动到其他地方似乎已经解决了这个问题。所以基本上,我仍然对C很讨厌。