0

I have this parser:

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)

And I hit it with abxc then why does it call the captured twice / the e twice, and how can I prevent this ?

ragel -R simple.rl && ruby simple.rb "abxc"
s1
e2
captured 1 2
e4
captured 1 4

on github: https://github.com/grosser/ragel_example

4

1 回答 1

1

这是您机器的图表,顺便说一句:http: //bit.do/stackoverflow-19621544(使用Erdos创建)。

对于“abxc”,("b" | "x" "c")+机器首先匹配“b”,然后是“xc”。当从“b”(到“x”)转换时,它第一次调用离开动作(ecaptured),当从“xc”(到EOF)转换时,它第二次调用离开动作(ecaptured)。

我猜该e动作应该设置结束指针以捕获 starts和 end之间的字符串e。如果是这样,那么 Ragel 多次调用该e动作并不是真正的问题,您只需像已经做的那样推进结束指针。

于 2013-11-04T17:58:57.180 回答