在c++中使用regex库创建词法分析器
Using regex library to create lexical analyzer in C++?
我正在尝试用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。
- Flex:尝试使用 Flex 生成C++词法分析器; "unrecognized rule"错误
- 编写词法分析器:词法分析器找不到"
- Flex 词法分析器规则,对包含连字符和斜杠的字母数字字符串具有积极的前瞻断言
- 将词法分析器字符串累加器移植到新版本的 Quex 时出现问题
- 将 flex 2.5.4a 迁移到 2.6(词法分析器生成器)
- 词法分析器不断跳过最终令牌
- 词法分析器项目 - 矢量未正确输出
- C++词法分析器
- 需要帮助解决C++中扫描仪/词法分析器代码部分中的分割错误
- 如何在编译器野牛/词法分析器中打印字符串
- boost::当词法分析器令牌> 10 时出现精神编译错误
- HTML词法分析器在c++中如何打印结果
- 用于从文件填充类的词法分析器/解析器的语法规则
- 我是否需要词法分析器来消除关键字的歧义?(boost::精神)
- 增强精神与列数动态词法分析器
- 在c++中使用regex库创建词法分析器
- 我无法在 Boost Spirit 的词法分析器功能中获得语义操作来编译
- 为什么qi::skip处理来自词法分析器的令牌时会失败?
- 使用c++的词法分析器
- 在分析器中创建日志的格式