c++ - 在 C++ 中查找字符串中的子字符串标记

标签 c++ xml parsing tokenize

好吧,假设我正在解析一些 XML(阅读任何“语言”时都存在问题,但 XML 是许多人都熟悉的一种语言)。

XML 如下所示:

<Tag>
  <[CDATA[ blah blah]]>
  <Tag2>
    <Tag3/>
  </Tag2>
<Tag>

现在我想在该流中找到各种标记。重要的 token 如下(请原谅我蹩脚的“ token ”名称;))。

<           = Open Token
<[CDATA[    = Open CDATA Token
]]>         = Close CDATA Token
<!          = Open Comment Token
/>          = Close Open Token
</          = Open Close Token
>           = Close Token

我遇到的问题是我有一个上述的数组,并且我在逐个字符地读取文件时试图正确识别上述 token 之一。

所以我读了第一个字符“<”。即时的想法是它与“开放 token ”相匹配,所以我们将选择它。然而,这也与“Open Close Token”的第一个字符相匹配。因此,假设我们读取了第二个字符及其“T”。所以我立即知道这是“打开 token ”而不是“打开关闭 token ”。

同样完成一个标签,例如“/>”。我读了第一个字符,得到了“/”。这与“关闭打开 token ”匹配。但它不完整,所以我应该检查下一个字符,在本例中是 '>' 给我“/>”,它确实匹配关闭 token 。

我的问题是,当这些标记的数量显着增加时,很难跟踪可能的匹配项。有没有一种优雅的方法可以做到这一点?或者我应该只是在遇到其中一个“ token 字符串”的第一个字符时将该 token 推到一个 vector 上,然后仅在后续读取时检查这些 token ?如果下一个字符不匹配,那么我可以清除 token 列表,然后重新开始。

这是处理问题的正确方法吗?有没有更好的办法?

(编辑:请不要将我指向 Lexx、YACC 等......我正在尝试在这里学习一些基础知识)

任何帮助将不胜感激:)

最佳答案

您需要在解析器中跟踪状态——我现在在哪里?接下来我期待什么? - 以特定于上下文的方式。当您看到接下来会得到什么时,您可以根据当前状态的有效值列表检查它,并可能存储一个完整的已解析数据项,并可能更改状态。

顺便说一下,仅解析 XML看起来很容易 - 如果您真的想自己动手完成这项工作,那么有很多极端情况需要处理。你的解析器是 Finite State Machine , 但这是一个不平凡的例子。

关于c++ - 在 C++ 中查找字符串中的子字符串标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4350784/

相关文章:

python - 使用python从xml数据中提取所有文本

xml - XPath 和 Jenkins Plot 插件

swift - 通过 getDataInBackgroundWithBlock 检索 PFFile 时出错

java - 如何通过Javax.xml库解析XML标签

c++ - iphlpapi/ifdef.h

c++ - WIN32 上 "iPhone"风格动画的最佳 2D 动画库/技术?

c++ - 如何将张量列表转换为 torch::Tensor?

c++ - 无效的空指针

c# - XML 命名空间 'ContentPage' 中的未知类型 'http://xamarin.com/schemas/2014/forms'

c++ - 在末尾使用值修饰符 ('-' 、 '%' ) 解析字符串