gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:36:47 25 4
gpt4 key购买 nike

好吧,假设我正在解析一些 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/

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