成功将原来的单一parser_main程序分离为三个独立的目标程序,每个程序专注于不同的处理阶段:
- lexer_main - 词法分析器
- parser_main - 语法分析器
- interpreter_main - 解释器
- 功能: 只进行词法分析,将源代码转换为词法单元序列
- 输入: 源代码文件
- 输出: 词法单元列表和统计信息
- 特点:
- 显示每个词法单元的行号、类型、值和位置
- 提供词法单元类型分布统计
- 使用timeout机制避免死循环
- 功能: 进行词法分析和语法分析,生成AST
- 输入: 源代码文件
- 输出: AST结构和解析统计信息
- 特点:
- 支持
-a参数显示详细AST结构 - 显示语句类型分布统计
- 验证语法正确性
- 支持
- 功能: 完整的解释执行流程
- 输入: 源代码文件
- 输出: 程序执行结果
- 特点:
- 包含词法分析、语法分析和解释执行
- 支持插件系统
- 提供完整的错误处理
tests/main/
├── lexer_main.cpp # 词法分析器主程序
├── parser_main.cpp # 语法分析器主程序
├── interpreter_main.cpp # 解释器主程序
└── CMakeLists.txt # 构建配置
- 每个程序都有独立的CMake目标
- 正确的库依赖关系:
lexer_main: 依赖lexer库parser_main: 依赖lexer,parser,interpreter库interpreter_main: 依赖lexer,parser,interpreter库
- 在
ScopeManager中添加了内置函数重复定义的检查 - 当尝试重定义内置函数时,会输出明确的错误信息
- 支持类方法的内置函数冲突检测
使用programs/目录下的真实测试程序:
test_class_definition_only.txt- 简单类定义test_simple_function.txt- 简单函数定义test_builtin_function_redefinition.txt- 内置函数重定义测试
创建了test_separate_programs.sh脚本,支持:
- 自动测试所有三个程序
- 使用timeout机制避免死循环
- 显示详细的测试结果
✅ lexer_main: 成功进行词法分析,输出101个词法单元
✅ parser_main: 成功进行语法分析,生成AST结构
✅ parser_main -a: 成功显示详细AST信息
✅ interpreter_main: 成功执行程序并输出结果
✅ 内置函数重定义检测: 正确识别并报告错误
cd build
make lexer_main parser_main interpreter_main -j4# 词法分析
./build/bin/lexer_main programs/test_file.txt
# 语法分析
./build/bin/parser_main programs/test_file.txt
./build/bin/parser_main -a programs/test_file.txt # 显示AST
# 解释执行
./build/bin/interpreter_main programs/test_file.txt
# 批量测试
./test_separate_programs.sh programs/test_file.txt- 模块化: 每个程序专注于特定功能,便于调试和维护
- 独立性: 可以单独测试词法分析、语法分析或解释执行
- 调试友好: 可以逐步验证每个阶段的正确性
- 错误隔离: 问题可以快速定位到特定阶段
- 开发效率: 开发者可以根据需要选择测试特定功能
成功实现了三个独立程序的目标,每个程序都能正确处理programs/目录下的真实测试文件。这种分离设计大大提高了代码的可维护性和调试效率,为后续的开发和测试工作奠定了良好的基础。