1

我正在尝试用 C++ 编写 XML 扫描器。理想情况下,我想使用正则表达式库,因为它会容易得多。

但是,我对如何做到这一点感到有些困惑。因此,首先我需要为语言中的每个标记创建正则表达式。除了令牌的名称之外,我还可以使用映射来存储这些正则表达式对。

接下来,我将打开一个输入文件并希望使用一个迭代器来遍历我的文件中的字符串并将它们匹配到一个正则表达式。但是,在 XML 中,您没有空格来分隔字符串。

所以我的问题是这种方法是否有效?此外,正则表达式库究竟将如何满足我的需求?regex_match 是否足以以万无一失的方式满足我的需求,以免我的扫描仪被欺骗?

我只是想在我的脑海中创建一个过程的骨架,以便我可以开始研究这个。我想从其他人那里得到一些意见,看看我是否正确地考虑了这个问题。

我很感激对此的任何想法。非常感谢!

4

2 回答 2

0

词法分析通常通过顺序匹配标记来进行,其中每个标记对应于一组可能的正则表达式中最长的匹配。由于每个匹配都锚定在前一个标记结束的位置,因此不执行搜索。

在这里,我稍微松散地使用了“token”这个词;空格和注释也被匹配为标记,但在大多数编程语言中,它们在被识别后会被简单地忽略。但是,符合标准的 XML 标记器需要将它们识别为标记,因此对于您的问题域而言,使用将是精确的。

与其让自己沉浸在烦人的细节中,不如学习 (f)lex,它在给定一组正则表达式的情况下有效地实现了这个算法。它还负责缓冲区处理和其他一些细节,让您专注于理解词法分析过程的性质。

于 2016-10-12T16:57:31.190 回答
0

为此有一个名为 RE/flex 的工具,它可以生成扫描仪:

https://sourceforge.net/projects/re-flex

生成的扫描器使用正则表达式引擎,例如 Boost.Regex。Boost.Regex 通过 API 用于处理不同类型的输入,因此还有一些额外的 C++ 代码。不是您可能正在寻找的最简单的 Boost.Regex API 调用。

RE/flex 中包含的示例包括一个 C++ 中的 XML 扫描器,它可以帮助您入门。RE/flex 还支持正确扫描 XML 所需的 UTF-8 编码。

于 2016-11-28T03:00:56.403 回答