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