我都 我正在阅读this book,它说用flex生成c ++ lexer是一个有问题的实验功能。
这本书于2009年出版,所以我想知道这个问题在过去十年中是否得到解决。
答案 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)。