木兰语言 0.0.17:着手由 Python 语法树生成木兰源码

来源: 投稿
作者: 吴烜2020
2021-04-04

刚开始实现从 Python 源码转为木兰源码,现在支持无参数函数定义以及函数调用等,刚在 pypi 发布了 ulang 0.0.17 版本包含此功能。

下面左侧为 Python 代码,运行 $ 木兰 -兰 XX.py 后生成右侧的对应木兰代码:

实现机制是扩展 Python ast 库的 NodeVisitor,对每个相关语法节点编写相关生成规则。以函数定义部分为例,可见 主体 将函数体内声明分行显示并以大括号包围:

    def visit_FunctionDef(self, 节点):
        self.另起一行(额外=1)
        self.另起一行(节点)
        self.编写('func ')
        self.编写('%s(' % 节点.name)
        self.编写(')')
        self.主体(节点.body)

    def 主体(self, 所有声明):
        self.编写(' {')
        for 声明 in 所有声明:
            self.visit(声明)

        self.另起一行()
        self.编写('}')

函数定义部分(visit_FunctionDef)现在看起来很简单,是因为仅仅复现了无参数函数定义,之后还需添加带参数、应变属性(attr)等等的支持,此部分将会逐渐复杂。主体部分也还需添加相应缩进。

通过复现这部分由语法树生成木兰源码的功能,从另一方面检验了之前重现的木兰语法。以标识符名称为例:

    def visit_Name(self, 节点):
        if 节点.id == 'print':
            self.编写('println')
        elif 节点.id == 'chr':
            self.编写('char')
        else:
            self.编写(节点.id)

可见内置函数除了 Python 的 print 和 chr 之外,都沿用了 Python 的名称,这与至今重现的内置函数部分一致。

与之前复现木兰语法时类似,针对每条语法生成规则编写了对应测试。在功能覆盖上,与之前积累的测试用例有相当交集,今后考虑将木兰测试用例在两部分复用。比如,从 Python 源码开始:

def echo(number):
    print(number)
echo(2)

转换后检查是否生成了如下目标木兰源码:

func echo(number) {
    println(number)
}
echo(2)

另一面,解析执行上述木兰源码检查结果是否为 2。

简而言之,对木兰语言的认识对这部分功能的复现有很大帮助,过程比想象中的顺利。当然之后应该会碰到尚未复现的语法功能,且行且看吧。

展开阅读全文
0 收藏
分享
加载中
精彩评论
实话说,只要不骗钱大家都支持
2021-04-04 14:06
13
举报
看作者勤勤恳恳更新了这么多次的基础上,给你点个赞吧。可惜所谓木兰语言的当事人早已被处分,所谓的重现木兰,更新再多也只不过是虚无缥缈的而已
2021-04-04 19:14
4
举报
大家是在意“钱”,不在意“套”。毕竟,都是玩山寨的。哈哈。
2021-04-04 17:48
3
举报
骗经费那个木兰吗
2021-04-04 15:55
3
举报
支持作者,做好自己事情坚持下去。在没有成功之前,许多人会认为这玩意儿是骗钱的。国内需要这些敢于创新的开发者。期待你的语言能够早日得到大家的认可。(互联网上一些媒体报道真真假假不可全信。)
2021-04-13 23:58
1
举报
最新评论 (35)
砖家叫兽?呵呵。有钱不赚王8蛋。你不是不想赚钱。你只是想赚更多的钱。。。。。
2021-04-15 18:09
0
回复
举报
支持作者,做好自己事情坚持下去。在没有成功之前,许多人会认为这玩意儿是骗钱的。国内需要这些敢于创新的开发者。期待你的语言能够早日得到大家的认可。(互联网上一些媒体报道真真假假不可全信。)
2021-04-13 23:58
1
回复
举报
谢谢支持,不过再强调一下本人并非木兰编程语言的原设计者和实现者。本开源项目旨在复现木兰语言的语法和功能。
2021-04-14 01:02
0
回复
举报
这个,中英混编不太好吧?变量名用用中文也就算了,英文对象用中文函数实在有点不伦不类。
2021-04-06 11:20
0
回复
举报
什么叫“英文对象用中文函数”?
2021-04-06 13:35
0
回复
举报
这玩意居然还在,如果不是用“木兰”这名字,我想就没多少人嘲讽了
2021-04-05 20:04
0
回复
举报
呵呵想嘲讽的总找得到由头。
2021-04-05 23:39
0
回复
举报
加油,什么时候有正式版。
2021-04-05 15:34
1
回复
举报
已可以从pypi安装ulang使用。常用的基本功能已具备,因为可以方便地调用各种python 库,个人已经将原本用python写的各种小工具逐步转用木兰编写。如遇到任何问题或有意见建议欢迎在源码库反馈。
2021-04-05 23:37
0
回复
举报
这中文水平就好像幼儿园的的小孩一样, 编写 改为 写, 另起一行改为 追加 不行, 即简短又顺口
中英文混杂体验非常糟糕, 就好像别人给你写了个底层你自己加一点东西上去, 没有一点技术含量
2021-04-05 11:28
0
回复
举报
底层在哪呢?
2021-04-05 12:08
0
回复
举报
这么说像 def self for in 这些关键字都是你自己实现的咯
2021-04-05 12:34
0
回复
举报
用中文命名标识符,改进代码可读性,也为您提供些吐槽命名的机会,少见多怪没关系,习惯了就好。
2021-04-05 12:43
0
回复
举报
你应该自己重复开发实现某个功能, 了解底层实现原理, 想象这个功能最终能实现什么效果, 然后为这个功能挑选合适命名, 这个才是最务实的, 不是胡乱翻译的
2021-04-05 13:04
0
回复
举报
请先搞清楚文章内容再指点江山。
2021-04-05 13:29
0
回复
举报
建议想实实在在的参与或评价, 看看美国CS四大有关编程语言, 编译器等等有关课程之后, 再来看看这些国产编程语言1
2021-04-05 09:33
0
回复
举报
我到堂上过 Chez Scheme作者Kent Dybvig教授的两门编译器课,你上过哪门?
2021-04-05 10:11
1
回复
举报
中英混合编程?
2021-04-04 23:54
0
回复
举报
就和技术文章里中英夹杂一样,习惯了就好
2021-04-05 00:03
0
回复
举报
看作者勤勤恳恳更新了这么多次的基础上,给你点个赞吧。可惜所谓木兰语言的当事人早已被处分,所谓的重现木兰,更新再多也只不过是虚无缥缈的而已
2021-04-04 19:14
4
回复
举报
一时不指望每人都能看到其他意义,至少先让更多人知道木兰和python的差别,以及技术上如何定制编程语言语法。这些“虚”么?
2021-04-04 23:59
0
回复
举报
不知道老哥跟吴涛是什么关系,希望这个也能有易语言那样的生态
2021-04-04 16:29
0
回复
举报
可以调用 Python 库。
木兰语法未使用中文关键词,当然不妨碍开发中文 API。
2021-04-04 16:45
0
回复
举报
更多评论
35 评论
0 收藏
分享
返回顶部
顶部