c++ - flex 生成的 c++ 解析器稳定吗?
解决方案
您不能对 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)。
推荐阅读
- sql - 具有汇总统计数据的 SQL 查询,按日期分组
- javascript - 使用动态变量映射数据
- python - 如何在 X 轴上制作带有重复标签的图?
- c++ - 我的 QuickSort 代码不适用于 1000000 多个元素(一百万个元素或更多)
- regex - 正则表达式匹配两个字符串之间的所有字符,包括尾部
- c - 为什么 _Generic 检查所有情况的值?
- python - 从 QDockWidget 附加和分离外部应用程序时的问题
- powerbi - 使用两个切片器值面对 KPI
- google-chrome-extension - Firefox 浏览器插件/扩展的麦克风权限
- c# - 与 Xamarin 绑定到自定义索引器时引发的 TargetParameterCountException