检查Ragel是否与整个输入匹配

时间:2012-08-20 15:14:22

标签: ragel

是否有更好的方法要求Ragel消耗所有输入?以下是我现在使用的内容:

=begin
%%{
  machine my_lexer;
  # ...
  # extract tokens and store into `tokens`
  # ...
}%%
=end

class MyLexer

  %% write data;

  def self.run(string)
    data = string.unpack("c*")
    eof = data.length
    tokens = []
    %% write init;
    %% write exec;
    data.length == p ? tokens : nil
  end

end

data.length == p测试外,上述大多数都是样板文件。它有效 - 除了它没有验证词法分析器是否以最终状态结束。所以,即使没有成功解析整个输入,我也有测试用例可以返回令牌。

有更好的方法吗?

(直接测试最终状态可能会更好。我正在研究如何做到这一点。想法?)

2 个答案:

答案 0 :(得分:3)

您可以使用全局或本地错误操作来处理错误。

对于全局错误操作,您可以使用以下语法:

$!action

对于机器定义本地的本地错误操作,您可以使用以下语法:

$^action

如果您在操作上放置了一个标记,则可以检查该标记以检测错误。

答案 1 :(得分:1)

我只是从ragel开始,但你可能想看看EOF动作或错误动作,分别在输入结束或下一个角色不满足当前状态的转换时执行