是否有更好的方法要求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
测试外,上述大多数都是样板文件。它有效 - 除了它没有验证词法分析器是否以最终状态结束。所以,即使没有成功解析整个输入,我也有测试用例可以返回令牌。
有更好的方法吗?
(直接测试最终状态可能会更好。我正在研究如何做到这一点。想法?)
答案 0 :(得分:3)
您可以使用全局或本地错误操作来处理错误。
对于全局错误操作,您可以使用以下语法:
$!action
对于机器定义本地的本地错误操作,您可以使用以下语法:
$^action
如果您在操作上放置了一个标记,则可以检查该标记以检测错误。
答案 1 :(得分:1)
我只是从ragel开始,但你可能想看看EOF动作或错误动作,分别在输入结束或下一个角色不满足当前状态的转换时执行