2013-10-27 75 views
0

我有這樣的解析器:防止Ragel從調用操作多次,同時匹配相同的字符串

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那麼爲什麼它叫捕獲兩次/電子兩次,我怎麼能防止這個?

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

在GitHub上:https://github.com/grosser/ragel_example

回答

1

這是給你的機器的圖,BTW:http://bit.do/stackoverflow-19621544(與Erdos創建)。

使用「abxc」,("b" | "x" "c")+機器首先匹配「b」,然後匹配「xc」。當從「b」(到「x」)轉換時,它首次調用離開動作(ecaptured),當從「xc」(到EOF)轉換時,它會調用離開動作(ecaptured)第二次。

我想e行動應該設置結束指針,以捕獲開始s和結束e之間的字符串。如果是這樣,那麼Ragel多次調用e行爲並不是一個真正的問題,你只是像你已經做的那樣提前結束指針。

+0

嗯好吧,所以如果我添加一些愚蠢的結束表達式字符,它會起作用: – grosser

+0

key_value =「a」%s(「b」|「x」「c」)+%e「z」%capture; – grosser

相關問題