确定假设我正在解析一些XML(在阅读任何“语言”时存在该问题,但XML是许多人熟悉的)。在C++中查找字符串中的子串标记
的XML如下所示:
<Tag>
<[CDATA[ blah blah]]>
<Tag2>
<Tag3/>
</Tag2>
<Tag>
现在我想找到那个流上的各种标记。重要的代币如下(请原谅我蹩脚的“代币”名称;))。
< = Open Token
<[CDATA[ = Open CDATA Token
]]> = Close CDATA Token
<! = Open Comment Token
/> = Close Open Token
</ = Open Close Token
> = Close Token
我的问题是,我有以上的数组,我试图正确地识别上述令牌之一,因为我在用字符的文件字符阅读。
所以我读了第一个字符'<'。即时的想法是,这与“Open Token”相匹配,所以我们会选择它。但是,这也与“打开关闭令牌”的第一个字符相匹配。因此,让我们说我们读了第二个字符和它的a'T'。所以我立即知道这是“Open Token”而不是“Open Close Token”。
同样在完成一个标签,例如“/>”。我读了第一个字符,并得到'/'。这匹配“关闭开放令牌”。但它不完整,所以我应该检查下一个字符,在这种情况下是'>'给我“/>”,它与Close Token匹配。
我的问题是,当这些令牌的数量显着增加时,很难跟踪可能的匹配项。有没有一个优雅的方式来做到这一点?或者我应该,只要当我遇到“标记字符串”之一的第一个字符时,将该标记推到一个向量上,然后只在随后的读取中检查这些标记?如果下一个字符不匹配,我可以清除令牌列表,然后重新开始。
这是解决问题的正确方法吗?有没有更好的办法?
(编辑:请不要指向我往Lexx,YACC等等......我想在这里学到一些基础知识)
任何帮助,将不胜感激:)
您提到的问题被称为预测和回溯。我认为,如果你想为解析器构建优雅的解决方案,那么你应该检查函数解析器和解析器组合器:这可以让你构建一个解析器,主要是声明语法生成规则。 – 2010-12-03 23:33:03