原來的問題:我能否避免使用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.rl和https://github.com/seamusabshere/ruby_ragel_examples/blob/master/lib/simple_tokenizer.rl
要求一個例子太多了嗎?我會給你買一杯咖啡,並要求你把它寫在餐巾紙上,但我懷疑你在威斯康星州麥迪遜:) – 2011-06-09 14:20:53
http://code.google.com/p/libgdx/source/browse/trunk/gdx /src/com/badlogic/gdx/utils/Xml.rl此鏈接已損壞,對不起。 – h4ck3rm1k3 2012-04-16 10:24:18
更新後的鏈接:https://code.google.com/p/libgdx/source/browse/trunk/gdx/src/com/badlogic/gdx/utils/XmlReader.rl – NateS 2012-04-26 16:02:40