/py2aardio

Py2aardio 是一个将 Python 语言源文件转换为 aardio 语言源文件的辅助工具, 主要功能是进行源代码格式转换的前期工作, 可较大程度地减少开发者的劳动强度. 目前, 本工具只转换源代码格式(将缩进转为缩进+花括号)和替换部分关键字, 并未实现语言语义和功能层面的精准翻译

Primary LanguagePython

Py2Aardio 转换助手(python to aardio conversion helper)

这是一个将 Python 语言源文件转换为 aardio 语言源文件的辅助工具, 主要功能是进行源代码格式转换的前期工作, 可较大程度地减少开发者的劳动强度. 目前, 本工具只转换源代码格式(将缩进转为缩进+花括号)和替换部分关键字, 并未实现语言语义和功能层面的精准翻译. 所以:

不保证源代码的格式转换完全正确, 也不保证生成的 aardio 源代码能正确运行! 开发者仍需对生成的源代码进行必要的手工修改!


本工具主要使用了 aardio 语言的模式匹配(pattern)和字符串替换(string.replace)功能, 能给初学者提供一定的参考.

Python 和 aardio 语言的语法比较, 可参阅 aardio IDE 内置的[代码段]-[范例程序]-[Python 语言]-[py,aardio语法比较]下的各篇介绍

特性

  1. 支持单个 python 源文件转换, 转换后在 Edit 窗口中即时产生目标 aardio 代码
  2. 支持文件夹转换, 可批量转换文件夹内所有 python 源文件
  3. 转换后将在 python 源文件的同一目录内, 生成同名 .aardio 源文件
  4. 提供"复制其它格式文件"选项, 方便进行项目的整体转换
  5. 提供: 行尾加分号, 下划线形式的变量名转换为驼峰式, 多级文件夹等转换选项
  6. 自动识别写成多行的 python 注释,列表[],元组(),字典{}和函数参数()等格式

样例

本助手能将所示 Python 源代码:

#!/usr/bin/python3
 
#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))
 
#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g  # 子类的新增成员: 年级
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
    #带有类型注解的函数声明
    def age(self, b:bool, c:pd.UInt_16) -> int:
        # do something...
        return self.age
        
if __name__ == "__main__":
    print("单元测试(Unit Test) in main module")
    """
    创建类的实例,并调用类的方法
    """
    s = student('Ken', 10, 60, 3)
    s.speak()
    
    print("main module end")

转换为如下所示 aardio 源代码:

//!/usr/bin/python3

//类定义
class people {
    //定义基本属性
    name = '';
    age = 0;
    //定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0;
    //定义构造方法
    ctor(n,a,w) {
        this.name = n;
        this.age = a;
        this.__weight = w;
    }
    speak = function() {
        console.log(string.format("%s 说: 我 %d 岁。", this.name,this.age));
    }
}

//单继承示例
class student {
    this = people(...);// 继承的父类 <--请把这行移入类的构造函数 ctor 内! {
    grade = '';
    ctor(n,a,w,g) {
        //调用父类的构函
        people.__init__(this,n,a,w);
        this.grade = g;  // 子类的新增成员: 年级
    }
    //覆写父类的方法
    speak = function() {
        console.log(string.format("%s 说: 我 %d 岁了,我在读 %d 年级", this.name,this.age,this.grade));
    }
    //带有类型注解的函数声明
    age = function(b/*:bool*/, c/*:pd.UInt_16*/)/*-> int*/ {
        // do something...
        return this.age;
    }
}

if (owner == null) {
    console.log("单元测试(Unit Test) in main module");
    /*
    创建类的实例,并调用类的方法
    */
    s = student('Ken', 10, 60, 3);
    s.speak();

    console.log("main module end");
}

更新记录:

  1. 2021-04-28 v0.9 初始版本发布: 基本实现源代码格式转化和关键字替换
  2. 2021-04-30 v1.0 版本发布, 增加对写成多行的列表[],元组(),字典{}和函数参数()等的支持
  3. 2021-05-01 v1.1 新增: 转换 except 和 finally; 完善: 替换保留字和加括号的欠缺; 修复: 'pass' 转换的 bug; 修复: 单个文件转换时不保存目标文件的 bug; 其它: 细节优化
  4. 2021-05-02 v1.2 新增: 按钮弹出菜单选择单个文件或文件夹
  5. 2021-05-04 v1.3 修复和优化
  6. 2021-05-06 v1.4 新增: 选项:复制其它非'.py'格式文件, 以便进行项目的整体转换
  7. 2021-05-07 v1.5 新增: 替换全局性的特定词句(例如: name == main)
  8. 2021-05-07 v1.6 新增: 支持带类型注解的函数声明
  9. 2021-05-07 v1.6.1 新增: 保留字 print 和导入别名(import as)
  10. 2021-05-07 v1.6.2 新增: 转换保留字 assert
  11. 2021-05-07 v1.6.3 新增: 行尾注释先去除再恢复; 新增转换保留字 del; 修复若干 bugs
  12. 2021-05-07 v1.6.4 新增: 转换对象属性相关方法 hasattr, getattr, setattr; 界面上增加"文件名改驼峰式"
  13. 2021-05-08 v1.6.5 新增:实现文件名驼峰化选项;非py文件提示确认
  14. 2021-05-09 v1.7 优化:改用Win7以上的新版[选择文件夹]对话框; 废弃core.pad改用string.repeat; 修复:去除行尾注释时的bug
  15. 2021-05-09 v1.8 新增:转换过程进度和文件数量的提示
  16. 2021-05-10 v1.8.1 新增: 显示转换过程状态(是否已完成)
  17. 2021-05-11 v1.8.2 修复: 转换导入(from . import)时的bug
  18. 2021-05-12 v1.8.3 优化: 转换 import; 修复: 转换except时的bug
  19. 2021-05-18 v1.9 新增: 对多行字符串的处理
  20. 2021-05-19 v1.9.1 新增: 对字符串重复拼接的转换
  21. 2021-05-20 v1.9.2 新增: 对可能被写成多行的冒号结尾的语句的处理
  22. 2021-05-21 v1.9.3 优化: 处理冒号后有单行注释再加回车和花括号的情况
  23. 2021-05-26 v1.9.4 优化: 修饰符替换问题
  24. 2021-06-05 v1.10.0 新增: 替换部分功能函数
  25. 2021-08-03 v1.11 修复: 多行注释内容为空时转换异常的bug
  26. 2021-08-20 v1.20 新增: 转换 @property 装饰符定义的只读属性

TODO 待办事宜

  1. Python 语言的列表推导式转换
  2. Python 语言的多行列表[]的转换(目前转换较混乱) 已完成√
  3. 行尾分号的精确添加到句尾(需考虑行尾带注释的情况) 已完成√
  4. Python 语言的 finally 语句处理 已完成√
  5. Python 语言的 except as 语句处理 已完成√
  6. Python 语言的 class 内部私有变量的处理
  7. 保存历史文件/项目到配置文件

建议和改进

  1. github 提 issue
  2. 欢迎 fork and pull request
  3. 发送邮件到 jimone@qq.com