module-cparser
模块分析:cparser
1. 角色定位
cparser/ 负责从预处理后的 C 源码生成语义化的前端
AST,并执行一系列前端规范化与检查。
2. 核心流程(Parse.ml)
2.1 总体管线
preprocessed_file:- 读取文件全文(用于错误定位)
check_preprocessed检测非法的\-换行与??/-换行parse_string通过 Menhir 解析translation_unitElab.elab_file从Cabs转成简化、类型化 AST(C 模块)transform_program进行语法/结构规范化
2.2 transform_program
具体步骤
Unblock.program: 解除 block 结构中的语法形态限制SwitchNorm.program: switch 语句规范化(可选全/部分)PackedStructs.program: packed struct 的处理StructPassing.program: struct 参数传递相关处理Rename.program: 统一命名与冲突规避
3. 语义化阶段(Elab.ml)
- 负责将
Cabs解析树转换为简化/类型化的CAST - 环境维护:
top_declarations+top_environment追踪声明/定义global_defines处理重定义检测
- 类型合并与存储类处理:
combine_toplevel_definitions负责处理重复声明的类型合并Storage_*规则用于判断静态/extern 互斥等语义
- 错误/警告体系:
Diagnostics做统一的报错与定位
4.
检查与诊断(Checks.ml)
- AST 遍历工具:
fold_over_stmt(_loc),iter_over_stmt等 - 未知属性检查:
unknown_attrs_* - 未使用变量/参数警告:基于表达式/语句遍历统计引用
- 语义限制提示:对无法线性化的条件结构进行诊断
5. 清理阶段(Cleanup.ml)
- 去除未引用声明/定义
- 维持全局可见性规则:
- 可见的函数/全局变量优先保留
- 通过
referenced集合和saturate迭代传播引用
6. 产物
- 输出是
CAST(cparser 内部语义化表示) - 之后由
cfrontend/C2C.ml转为Csyntax(CompCert C)
7. 其他重要文件
Lexer.mll+Parser.vy+pre_parser.mly: 词法/语法Env.ml: 作用域与符号环境维护Diagnostics.ml: 错误与警告聚合