【问题标题】:Ragel - how to return one token at a timeRagel - 如何一次返回一个令牌
【发布时间】:2015-04-13 10:17:32
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: parsing tokenize ragel


    【解决方案1】:

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

    来自 (Ragel 6.9) 手册:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多