我想构建一个每次调用一个令牌的 ragel 语法/事物。
我对 Ragel 比较陌生(但对编译器等并不陌生)。
我已经为类似 json 的符号(三层深)编写了一个语法。它发出 C 代码。
我的输入是完整的字符串(无需跨越缓冲区边界)。
我想用输入字符串调用我的语法,让语法返回一个标记。然后再次调用它并让它返回下一个令牌,依此类推。直到字符串结束。然后,使用新字符串再次调用。
有人会认为状态机非常适合这种行为,但我还没有弄清楚如何在 Ragel 中实现这一点。
您最好的选择可能是fbreak
在每个令牌之后调用,然后再次调用机器而不重新初始化p
or cs
。
来自(Ragel 6.9)手册:
fbreak;
– Advancep
,将目标状态保存到cs
并立即跳出执行循环。noend
此语句与write 选项结合使用很有用。该语句可用于停止处理某个动作,而不是处理输入直到pe
到达。fbreak
在fbreak
语句之后,p
变量将指向输入中的下一个字符。当前状态将是当前转换的目标。请注意,这fbreak
会导致跳过目标状态的状态操作。
请注意,您实际上并不需要该noend
选项。该选项用于 ignoring pe
,在这种情况下这可能不是您想要做的,因为您希望解析器能够检测到它正在解析的字符串的结尾。