c++ - 使用正则表达式库在 C++ 中创建词法分析器?

标签 c++ regex lexical-analysis skeleton-code

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

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

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

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

我只是想在脑海中创建一个流程的框架,以便我可以开始处理它。我想听听其他人的意见,看看我是否正确地思考了这个问题。

如果有任何想法,我将不胜感激。非常感谢!

最佳答案

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

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

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

关于c++ - 使用正则表达式库在 C++ 中创建词法分析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39989483/

相关文章:

c++ - 提高编译器中 std::string 的效率

c++ - Visual C++ Express 2010 高亮显示

c++ - 为什么对 isnan 的调用没有歧义? a.k.a. 使用引入 2 次相似函数声明的关键字

javascript - 正则表达式 - 如何过滤数字和 "-"?

javascript - JS变量将其他变量拉入其中

javascript - Node.js 语法错误 : Unexpected identifier 'boolean' in ANTLR4 JavaScript Lexer

c++ - 如何在 C++ 中优化输入/输出

c++ - 如何对 float 的多维 vector 进行排序?

java - 正则表达式的替代品

c - 为什么 Flex 程序会永远等待并且不打印任何内容?