首页 > 解决方案 > flex 生成的 c++ 解析器稳定吗?

问题描述

我大家,我正在读这本书,它说使用 flex 生成 c++ 词法分析器是一个有缺陷的实验性功能。

这本书出版于 2009 年,所以我想知道这个问题是否在过去 10 年中得到解决。

标签: c++flex-lexerlexer

解决方案


您不能对 C++ 使用拆分词法分析器 (=tokenizer) 和解析器,因为允许嵌套模板括号:

std::map<int,std::map<int,int>>

这是从 C++11 开始允许的,并且无法使用拆分 lexter/parser 方法干净地处理。问题是最后一个标记 ( >>),词法分析器(不了解语法)会将其视为右移运算符。在语法中修复它几乎是不可能的。

使用不区分字符和标记的解析方法可以解决此问题。这意味着不使用 flex 可以解决这个问题(以及许多其他问题)。

请注意,flex 主要是为了解决 bison/yacc 解析器的相当强的限制而发明的,这些解析器只能解析 LALR1 语言,前瞻为 1。二十年来,这种方法已经死了。

不要使用 flex/bison/yacc。请改用递归下降解析器 PEG(解析表达式语法)解析器,例如 PEGTL(https://github.com/taocpp/PEGTL)。


推荐阅读