gpt4 book ai didi

xml - 如何编写一个简单的 Ragel 分词器(无回溯)?

转载 作者:数据小太阳 更新时间:2023-10-29 02:07:06 30 4
gpt4 key购买 nike

更新 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com