Ragel - 如何一次返回一个令牌

时间:2015-02-12 15:37:37

标签: parsing tokenize ragel

我想建立一个每个令牌一个令牌的ragel语法/东西。

我对Ragel来说相对较新(但对编译器来说并不陌生)。

我已经为类似json的符号写了一个语法(三层深)。它发出C代码。

我的输入有完整的字符串(不需要跨越缓冲区边界)。

我想用输入字符串调用我的语法,让语法返回一个标记。然后再次调用它并让它返回下一个标记,依此类推。直到字符串结尾。然后,再次使用新字符串调用。

有人会认为状态机非常适合这种行为,但我还没有能够在Ragel中找到如何实现这一目标。

1 个答案:

答案 0 :(得分:0)

您最好的选择可能是在每个令牌后拨打fbreak,然后再次呼叫该计算机,而无需重新初始化pcs

来自(Ragel 6.9)手册:

  

fbreak; - 提前p,将目标状态保存到cs并立即退出执行循环。此语句与noend写入选项一起使用时非常有用。而不是在到达pe之前处理输入,fbreak语句可用于停止从动作处理。在fbreak语句后,p变量将指向输入中的下一个字符。目前的状态将是当前转型的目标。请注意,fbreak会导致跳过目标状态的状态操作。

请注意,您实际上并不需要noend选项。该选项用于忽略pe,这可能不是您在这种情况下想要做的事情,因为您希望解析器能够检测到它解析的字符串的结尾。