1

我想构建一个每次调用一个令牌的 ragel 语法/事物。

我对 Ragel 比较陌生(但对编译器等并不陌生)。

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

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

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

有人会认为状态机非常适合这种行为,但我还没有弄清楚如何在 Ragel 中实现这一点。

4

1 回答 1

0

您最好的选择可能是fbreak在每个令牌之后调用,然后再次调用机器而不重新初始化por cs

来自(Ragel 6.9)手册:

fbreak;– Advance p,将目标状态保存到cs并立即跳出执行循环。noend此语句与write 选项结合使用很有用。该语句可用于停止处理某个动作,而不是处理输入直到pe到达。fbreakfbreak语句之后,p变量将指向输入中的下一个字符。当前状态将是当前转换的目标。请注意,这fbreak会导致跳过目标状态的状态操作。

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

于 2016-01-07T01:16:01.983 回答