是否有更好的方法要求 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
测试。它有效——除了它不验证词法分析器是否以最终状态结束。因此,即使没有成功解析整个输入,我也有一些测试用例可以返回令牌。
有没有更好的办法?
(直接测试最终状态可能会更好。我正在研究如何做到这一点。想法?)