2011-06-08 16 views
4

更新2如何編寫簡單的Ragel標記器(無回溯)?

原來的問題:我能否避免使用Ragel的|**|如果我不需要回溯?

更新回答:是的,如果你不需要回溯,你可以用()*來寫一個簡單的分詞器。

更新1

我意識到,詢問有關XML標記化是一個紅鯡魚,因爲我在做什麼不是特定於XML。

末尾時更新

我有一個Ragel掃描儀/標記者,簡單地查找FooBarEntity元素文件,如:

<ABC > 
    <XYZ > 
    <FooBarEntity> 
     <Example >Hello world</Example > 
    </FooBarEntity> 
    </XYZ > 
    <XYZ > 
    <FooBarEntity> 
     <Example >sdrastvui</Example > 
    </FooBarEntity> 
    </XYZ > 
</ABC > 

掃描版本:

%%{ 
    machine simple_scanner; 
    action Emit { 
    emit data[(ts+14)..(te-15)].pack('c*') 
    } 
    foo = '<FooBarEntity>' any+ :>> '</FooBarEntity>'; 
    main := |* 
    foo => Emit; 
    any; 
    *|; 
}%% 

的非掃描儀版本(即使用()*代替|**|

%%{ 
    machine simple_tokenizer; 
    action MyTs { 
    my_ts = p 
    } 
    action MyTe { 
    my_te = p 
    } 
    action Emit { 
    emit data[my_ts...my_te].pack('c*') 
    my_ts = nil 
    my_te = nil  
    } 
    foo = '<FooBarEntity>' any+ >MyTs :>> '</FooBarEntity>' >MyTe %Emit; 
    main := (foo | any+)*; 
}%% 

我想通了這一點,並在https://github.com/seamusabshere/ruby_ragel_examples

你可以看到讀/緩衝代碼在https://github.com/seamusabshere/ruby_ragel_examples/blob/master/lib/simple_scanner.rlhttps://github.com/seamusabshere/ruby_ragel_examples/blob/master/lib/simple_tokenizer.rl

回答

3

寫測試它你不必用掃描儀來解析XML。我已經實施了simple XML parser in Ragel,沒有掃描儀。 Here是一個具有一定時間和更多信息的博客文章。

編輯:你可以做很多方法。你可以使用掃描儀。你可以解析單詞,如果你看到STARTANIMAL,你開始收集單詞,直到看到STOPANIMAL

+0

要求一個例子太多了嗎?我會給你買一杯咖啡,並要求你把它寫在餐巾紙上,但我懷疑你在威斯康星州麥迪遜:) – 2011-06-09 14:20:53

+0

http://code.google.com/p/libgdx/source/browse/trunk/gdx /src/com/badlogic/gdx/utils/Xml.rl此鏈接已損壞,對不起。 – h4ck3rm1k3 2012-04-16 10:24:18

+0

更新後的鏈接:https://code.google.com/p/libgdx/source/browse/trunk/gdx/src/com/badlogic/gdx/utils/XmlReader.rl – NateS 2012-04-26 16:02:40

1

改寫Occam:除非需要,否則不需要掃描儀。 如果沒有掃描儀,您可以一次處理一個符號,可能從沒有緩衝區的流中讀取它。