我正在尝试用c++编写XML扫描器。理想情况下,我想使用regex库,因为它会更容易。
然而,我对如何做这件事有点困惑。因此,首先我需要为语言中的每个标记创建正则表达式。除了令牌的名称之外,我还可以使用映射来存储这些正则表达式对。
接下来,我将打开一个输入文件,并希望使用迭代器遍历文件中的字符串,并将它们与正则表达式进行匹配。但是,在XML中,您没有空格来分隔字符串。
所以我的问题是这个方法会有效吗?另外,正则表达式库究竟如何满足我的需求?regex_match是否足以以一种万无一失的方式满足我的需求,从而使我的扫描仪不被欺骗?
我只是试着在我的头脑中创建一个过程的框架,这样我就可以开始工作了。我想听听别人的意见,看看我对这个问题的思考是否正确。
我很感激任何关于这个的想法。非常感谢!
词法分析通常通过顺序匹配标记进行,其中每个标记对应于一组可能的正则表达式中的最长可能匹配。由于每个匹配都锚定在前一个令牌结束的地方,因此不执行搜索。
在这里,我使用"令牌"这个词有点松散;空格和注释也作为标记进行匹配,但在大多数编程语言中,它们在被识别后被忽略。但是,一致的XML标记器需要将它们识别为标记,因此对于您的问题域,使用将是精确的。
与其让自己沉浸在恼人的细节海洋中,不如学习(f)lex,它在给定一组正则表达式的情况下有效地实现了这个算法。它还负责缓冲区处理和其他一些细节,这些细节可以让您专注于理解词法分析过程的本质。
有一个叫做RE/flex的工具可以生成扫描器:
https://sourceforge.net/projects/re-flex 生成的扫描器使用正则表达式引擎,如Boost.Regex。提振。Regex通过一个API来处理不同类型的输入,因此有一些额外的c++代码。不是最简单的Boost。您可能正在寻找的Regex API调用。RE/flex中包含的示例包括c++中的XML扫描器,可以帮助您入门。RE/flex还支持UTF-8编码,您需要正确扫描XML。