【发布时间】:2010-12-03 23:17:04
【问题描述】:
好吧,假设我正在解析一些 XML(阅读任何“语言”时都会出现问题,但 XML 是许多人都熟悉的一种)。
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
我遇到的问题是我有一个上述的数组,并且我试图在逐个字符地读取文件时正确识别上述令牌之一。
所以我读到了第一个字符'
同样在完成标签时,例如“/>”。我读了第一个字符,我得到了'/'。这与“关闭打开令牌”相匹配。但它不完整,所以我应该检查下一个字符,在这种情况下是 '>' 给我“/>”,它与关闭令牌匹配。
我的问题是,当这些令牌的数量显着增加时,很难跟踪可能的匹配项是什么。有没有一种优雅的方式来做到这一点?或者我应该只是当我遇到一个“标记字符串”的第一个字符时将该标记推到一个向量上,然后只在后续读取时检查这些标记?如果下一个字符不匹配,那么我可以清除标记列表,然后重新开始。
这是解决问题的正确方法吗?有没有更好的办法?
(编辑:请不要将我指向 Lexx、YACC 等...我正在尝试在这里学习一些基础知识)
任何帮助将不胜感激:)
【问题讨论】:
-
您所指的问题称为前瞻和回溯。我认为,如果您想要构建解析器的优雅解决方案,那么您应该检查功能解析器和解析器组合器:这可以让您构建一个主要声明语法生成规则的解析器。