3

是否有更好的方法要求 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测试。它有效——除了它不验证词法分析器是否以最终状态结束。因此,即使没有成功解析整个输入,我也有一些测试用例可以返回令牌。

有没有更好的办法?

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

4

2 回答 2

3

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

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

$!action

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

$^action

如果你在你的动作上加了一个标志,你可以检查这个标志来检测错误。

于 2013-06-06T10:10:08.647 回答
1

我只是从 ragel 开始,但您可能希望查看 EOF 动作或错误动作,分别在输入结束或下一个字符不满足从当前状态的转换时执行。

于 2012-08-23T07:14:52.740 回答