更新 2
|**|
元の質問:バックトラッキングが必要ない場合、Ragel の使用を避けることはできますか?
()*
更新された回答: はい、バックトラッキングが必要ない場合は、簡単なトークナイザーを作成できます。
更新 1
私が行っていることは XML に固有のものではないため、XML のトークン化について尋ねるのは危険であることに気付きました。
更新を終了
次のようなファイルで FooBarEntity 要素を単純に検索する Ragel スキャナー/トークナイザーがあります。
<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