pymatlab_interp 解释器开发教程第四部分: 自动代码生成器。
pymatlab_interp 解释器开发教程 (4) 自动代码生成器
引言
上一个教程中已经完成了表达式求值的整个流程。
之前我们曾提到,表达式类具有一致的结构,可以用自动代码生成而非手写。
示例代码中的auto_defs.py
实际是自动生成的结果。
这一节就简单叙述一下这个自动代码生成器。
这样安排可能有点怪,但是如果先讲代码生成器再实现 parser 和 interpreter 可能也很迷惑,而且代码自己写也不是不行,因此就这样安排了。
访问者模式(Visitor Pattern)
访问者模式是一种行为设计模式,它允许在不修改对象结构的情况下向一组现有对象添加新功能。 这种模式涉及一个访问者对象,它知道如何处理结构中的各个对象,并且可以访问对象的内部状态。
主要组成部分:
- Element(元素):定义一个accept操作,它以一个访问者作为参数。
- Visitor(访问者):实现具体的操作,这些操作与Element相关联,可以访问并操作Element的内部数据。
访问者模式分离了算法和对象结构,方便添加新的操作。
这正适合各种表达式 Expr
以及之后的语句 Stmt
等实现。
代码生成框架
使用如下函数构建框架,用于自动生成Python类定义,特别适用于实现数据类和访问者模式(Visitor Pattern)。
根据字典,自动生成 python类 代码, 字典每个 item 表示一个类:
- 字典
key : str
为类名- 类可以继承,由冒号 “
:
” 分割; - 前面部分为当前类名, 后面部分为父类名;
- 可以多继承,多个父类由逗号 “
,
” 分割。
- 类可以继承,由冒号 “
- 字典
value : str
为类变量- 多个类变量由逗号 “
,
” 分割; - 类变量可以限定类型,由冒号 “
:
” 分割。
- 多个类变量由逗号 “
基础函数:
_make_extend_str
此函数接收一个字符串,该字符串可能包含一个类名和它的基类名(如果有的话),通过冒号分隔。函数解析这个字符串并返回类名和其可能的基类名。_make_param_dict
该函数接收一个以逗号和空格分隔的参数字符串,其中每个参数可能包含类型注解。它会将这个字符串解析成一个字典,键是参数名,值是完整的参数定义(包括类型注解)。
生成代码的函数:
_make_class_defs
这个函数基于给定的类名和参数字典生成Python类定义的字符串。它首先确定类是否继承自其他类,然后构造类定义,包括初始化方法(__init__
),并在其中设置属性。最后,它还添加了一个__str__
方法,用于生成类实例的字符串表示。_make_accept_func
此函数生成一个accept
方法,这是访问者模式中的关键部分。它允许类实例接受一个访问者对象,并调用特定于该类的访问者方法。
拼接代码的函数:
make_data_class
这个函数遍历一个字典,其中键是类名,值是参数字符串。对于每个条目,它使用_make_param_dict
和_make_class_defs
来生成整个类定义,并将它们拼接起来。make_visitor_class
与make_data_class
类似,但除了生成类定义之外,它还会为每个类生成一个accept
方法,这是访问者模式的一部分。
代码实现如下:
1 |
|
代码框架的使用
可以使用上述框架,从字典自动生成代码。
根据之前的定义,字典定义如下:
1 |
|
为了定义的整体性,把错误处理代码和 token_type 枚举也直接存储进来。
1 |
|
再补充运行并生成代码的 __main__
函数如下:
1 |
|
运行即可自动生成 auto_defs.py
代码文件。
附录:generate_op_def.py 完整代码
1 |
|