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

标签 xml tokenize ragel

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

相关文章:

java - ContextCompat.getColor 方法忽略夜间模式

c++ - 在 C++ 代码库中使用 Ragel 解析字符串的原因是什么?

python - spaCy SPECIAL-1 token 覆盖后缀规则导致注释未对齐

c++ - 类不存在默认构造函数的错误

c++ - 是否有 cpp 文件的标记器

c - 如何让 Ragel EOF Action 起作用

java - 使用 hdmi 同时显示不同布局的 Android 应用程序

c# - MsBuild XmlPeek 结果拆分值

javascript - 在 JavaScript 中解析 A​​mazon S3 输出