Skip to content

Latest commit

 

History

History
118 lines (93 loc) · 3.7 KB

File metadata and controls

118 lines (93 loc) · 3.7 KB

独立程序分离总结

概述

成功将原来的单一parser_main程序分离为三个独立的目标程序,每个程序专注于不同的处理阶段:

  1. lexer_main - 词法分析器
  2. parser_main - 语法分析器
  3. interpreter_main - 解释器

程序功能

1. lexer_main (词法分析器)

  • 功能: 只进行词法分析,将源代码转换为词法单元序列
  • 输入: 源代码文件
  • 输出: 词法单元列表和统计信息
  • 特点:
    • 显示每个词法单元的行号、类型、值和位置
    • 提供词法单元类型分布统计
    • 使用timeout机制避免死循环

2. parser_main (语法分析器)

  • 功能: 进行词法分析和语法分析,生成AST
  • 输入: 源代码文件
  • 输出: AST结构和解析统计信息
  • 特点:
    • 支持-a参数显示详细AST结构
    • 显示语句类型分布统计
    • 验证语法正确性

3. interpreter_main (解释器)

  • 功能: 完整的解释执行流程
  • 输入: 源代码文件
  • 输出: 程序执行结果
  • 特点:
    • 包含词法分析、语法分析和解释执行
    • 支持插件系统
    • 提供完整的错误处理

技术实现

文件结构

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

优势

  1. 模块化: 每个程序专注于特定功能,便于调试和维护
  2. 独立性: 可以单独测试词法分析、语法分析或解释执行
  3. 调试友好: 可以逐步验证每个阶段的正确性
  4. 错误隔离: 问题可以快速定位到特定阶段
  5. 开发效率: 开发者可以根据需要选择测试特定功能

总结

成功实现了三个独立程序的目标,每个程序都能正确处理programs/目录下的真实测试文件。这种分离设计大大提高了代码的可维护性和调试效率,为后续的开发和测试工作奠定了良好的基础。