在本项目"编译project2报告1"中,主要涉及的知识点集中在编译原理、JSON解析、矩阵计算表达式处理和C++编程技术。实验的主要目标是对矩阵计算的表达式进行求导,并生成对应的C++代码,以计算输入变量的导数。
一、实验内容
实验内容包括两个主要部分:
1. 解析JSON文件:这部分与project1类似,从JSON文件中读取输入(in)、输出(out)和计算表达式(kernel),现在还增加了对导数(grad_to)的处理。JSON类被扩展以容纳这些新增的属性。
2. 求导表达式生成:生成对输入变量的导数表达式,然后将其转化为C++代码,这主要在`dx.cc`文件中完成。
二、设计思路
设计思路采用了递归下降程序法进行语法分析,从最高级别的产生产生式(P)开始,通过解析表达式生成一个新的JSON配置,该配置包含了求导后的in、out以及新的求导表达式。在此过程中,使用`change_token`函数处理约束,如确保左端下标的简单性。
三、具体实现
1. JSON解析:读取JSON文件并解析出相关数据,包括输入、输出、数据类型、内核和导数到目标的映射。将这些数据存储在自定义的JSON类中。
2. 求导表达式生成:
- 主要变量:`ins`、`outs`和`grad_tos`用于存储新表达式的输入和输出信息;`tokens`存储词法分析后的Token流;`token_index`跟踪处理进度;`look`预览下一个Token;`need_to_handle`、`handle_result`、`merge_result`分别用于存储待处理的计算单元、处理结果和最终合并结果;`left_row`和`leftdiff`记录等式左侧的元素。
- 递归下降分析:从`P()`函数开始,对每个不可分割项求导,结果存入`handle_result`。
- `change_token`函数:根据表达式约束,如不允许左端下标为复杂表达式,进行调整。
- `te`函数:作为主要接口,它调用词法分析器,生成Token流,然后进行语法分析,生成求导表达式。
四、其他细节处理
这部分未在描述中详细展开,但可能涉及到错误处理、边界条件检查、优化或其他特定情况的处理。
五、C++编程知识
项目利用C++编程语言实现上述功能,包括类的设计、函数的调用、数据结构的使用(如vector)以及对JSON库的调用等。
六、小组分工
虽然未详细描述,但可以推断小组成员可能有专门负责解析JSON的、实现求导逻辑的、处理C++代码生成的等不同职责。
总结来说,这个项目结合了编译原理、JSON处理、矩阵计算表达式求导以及C++编程技术,旨在为矩阵计算的表达式求导提供自动化工具,生成可执行的C++代码以计算输入变量的导数。
评论0