更新 2
原始问题:如果我不需要回溯,我可以避免使用 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
最佳答案
您不必使用扫描仪来解析 XML。我已经实现了 simple XML parser in Ragel,没有扫描仪。 Here是一篇包含一些时间安排和更多信息的博文。
编辑:您可以通过多种方式做到这一点。你可以使用扫描仪。您可以解析单词,如果您看到 STARTANIMAL
,您将开始收集单词,直到您看到 STOPANIMAL
。
关于xml - 如何编写一个简单的 Ragel 分词器(无回溯)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6274424/