我有这个解析器:
class Parser
%%{
machine test_lexer;
action s { s = p; puts "s#{p}" }
action e { e = p; puts "e#{p}" }
action captured {
puts "captured #{s} #{e}"
}
key_value = "a" %s ("b" | "x" "c")+ %e %captured;
tags = ("x"+)? key_value;
main := tags*;
}%%
def initialize(data)
data = data
eof = data.length
%% write data;
%% write init;
%% write exec;
end
end
Parser.new(ARGV.first)
然后我用abxc命中它为什么它会两次调用捕获的两次/ e,我怎么能阻止它?
ragel -R simple.rl && ruby simple.rb "abxc"
s1
e2
captured 1 2
e4
captured 1 4
答案 0 :(得分:1)
以下是您的计算机的图表,BTW:http://bit.do/stackoverflow-19621544(使用Erdos创建)。
使用“abxc”,("b" | "x" "c")+
机器首先匹配“b”,然后匹配“xc”。当从“b”(到“x”)过渡时,它第一次调用离开动作(e
和captured
),当从“xc”(到EOF)转换时,它调用离开行动(e
和captured
)第二次。
我想e
操作应该设置结束指针,以便捕获start s
和end e
之间的字符串。如果是这样,那么Ragel多次调用e
动作并不是一个真正的问题,你就像你已经做的那样推进结束指针。