flex生成的c ++解析器稳定吗?

时间:2019-02-24 18:57:49

标签: c++ flex-lexer lexer

我都 我正在阅读this book,它说用flex生成c ++ lexer是一个有问题的实验功能。

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

1 个答案:

答案 0 :(得分:1)

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

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

从C ++ 11开始,这是允许的,并且不能使用分离式词法分析器/解析器方法彻底处理。问题是最后一个标记(>>),词法分析器(不了解语法)将其视为右移运算符。在语法上对此进行修复几乎是不可能的。

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

请注意,flex主要是为解决bison / yacc解析器的强大限制而开发的,该解析器只能解析前一种的LALR1语言。这种方法自二十年来一直无效。

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