木兰编程语言 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
木兰编程语言 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
木兰编程语言 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 GPL
开发语言 Python
操作系统 跨平台
软件类型 开源软件
所属分类 其他
开源组织
地区 国产
投 递 者 吴烜2020
适用人群 未知
收录时间 2020-06-12

软件简介

木兰编程语言是基于 Python 实现的编程语言,目前正在逐步实现木兰编程语言与交互环境的所有功能。

实现机制是将源程序转换为 Python 的中间表示(AST),可较便利地实现各种语法设计与周边功能。

代码中可以直接调用现有 Python 库,如下调用了草蟒的中文 API:

【运行演示】

 

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论

点击加入讨论🔥(40) 发布并加入讨论🔥
发表了资讯
2022/12/19 07:08

木兰语言 0.1.0 展示今年悬赏任务成果

【安装:pip install ulang,用法与例程请见 PyPI。源码位于开源中国。 注意:必需 python 3.7,源码文件需 UTF-8 编码】 2022年小结 去年,七月发布 0.0.22 版之后项目静默了一段时间。今年一月末开始 悬赏任务又开始大步推进。重现功能量较大,因此发布大版本。 感激所有参与者的合作、耐心和探究精神! 此版本重现功能 按各悬赏任务的完成先后顺序逐个介绍。 更多增量运算 早先完成了 += -=,现已完成余下的 *= ^= |= &= /=...

1
0
发表了资讯
2021/07/19 15:33

木兰语言 0.0.22 继续 py 转木兰;探路 py 3.8

之前复现了一部分由 Python 自动转换为木兰代码的功能,运行如下命令就能输出木兰代码:$ 木兰 -兰 某某.py,但尚缺失一些基本语法支持,该功能尚未达到实用程度。 这两天将插入和冒泡排序算法为目标,按需复原了相关部分,达成效果如下(左 Python 右木兰): 下面打算以 猜数字例程 为目标继续补完转换功能。 另外,前几天有位在项目首页加了 binder 在线环境,这才知道有这样的免费服务: 还干了件闲事。木兰重现项目伊始时,...

2
0
发表了资讯
2021/07/12 10:53

木兰语言 0.0.21 查缺补漏;rply 改进、接口中文化

今后也许会更身不由己,这段时间尽可能将 木兰重现项目 和其依赖的 rply 库中的一些纰漏解决、夯实基础。 木兰 支持 # 语法,等价于 len(),如 #[3,33] 输出 2。见此提交 输出数据结构时内部字符串略去引号:集合、多项; 字典。比如 d={1:'a'},python 中 print 输出 {1: 'a'},而木兰输出 {1: a} 报错中模块名为空问题 比较独特,逆向中看不出头绪,硬 加了个补丁 实现了与原始可执行文件行为一致 之前发现几处 re.DOTALL 不解...

2
0
发表了资讯
2021/06/01 11:06

木兰语言 0.0.19 补完二元运算;重现 yield 语法;赋值时可指定变量类型

这两周过的飞快,先上木兰代码截图,省得像上次似的一堆误会。 这是完成了的第二批悬赏任务之一的成果: ¥188 【进阶】重现所有 yield 相关语法 ¥128 重现语法——赋值时指定变量类型 ¥100 补完二元表达式(bin_expr)的四个运算符 下面主要记下合作期间的一些发现。 在 实现二元运算符时 ,发现与 Python 中的优先级有不同,需更全面评估。如位左移 << ,木兰中的优先级低于 < 而 python 相反。1<2<<3 在木兰中为 8 而 Pyth...

0
0
发表了资讯
2021/05/19 10:52

木兰语言 0.0.18 补完所有内置函数,悬赏任务合作顺利

在 Gitee Reward 发布的下列悬赏任务已经顺利完成: ¥100 【新人优先】重现一个内置函数——bytes ¥128 【进阶】补完余下三十多个内置函数 合作过程交流顺畅、效率颇高、成果符合预期。 因为之前个人一直主要在 mac 下开发,而合作者在 win10 下开发,在新人任务过程中就暴露了不少之前忽视了的跨平台问题,如 win 下部分测试不过。 另一个暴露的困惑已久的问题——Windows 下两种测试方式输出相差 \r,很惊喜地,合作者很快指...

0
1
发表了资讯
2021/05/14 09:30

木兰语言 0.0.17.4 发现依赖库风险、不支持 in;发布 Gitee Reward 首批悬赏任务

首先号外,刚在 Gitee Reward 发布了首批三个总值 ¥916 的悬赏任务,走过路过莫错过: ¥100 【新人优先】重现一个内置函数——bytes ¥128 【进阶】补完余下三十多个内置函数 ¥688 【老手】木兰源码转换为 Python 依赖库风险 不知从何时开始,运行原始木兰的 逆向项目 时,就会报 rply 警告 ParserGeneratorWarning: Token '|=' is unused 而且任何求值都报错 “IndexError: list index out of range”。 一直没细究,本周才...

0
1
发表了资讯
2021/05/07 15:57

木兰 0.0.17.3 支持不需 __init__ 的 super 调用

接续 前文,试着调整了几次优先级排序,除了 super 需在 ( 之下以外,没看出其他门道,于是暂时将两者分别放在优先级排序最高与最低,现在所有测试用例能通过,以观后效吧。个人感觉由于优先级与语法规则的勾连,想要生成一个针对某一优先级设置的测试用例颇为烧脑,先搁置吧。 接着,既然做到了 super 语法,就在语法树生成木兰源码部分功能中复现了 super。先上 Python 与转换出的木兰源码对比: 可见,在调用父类的构造方法时...

3
0
发表了资讯
2021/05/03 09:15

木兰语言 0.0.17.2 实现简易网页浏览器,又一次碰到语法歧义

上周试用木兰语言加 QtWebkit 实现简易网页浏览器(已开源在 Gitee ,81 行代码)时,发现需要复现带参数的 super: super(演示, self).__init__() 实现过程中,又一次遇到了这个头疼的报错: ParserGeneratorWarning: 1 shift/reduce conflict 去年碰到过几次,都是通过照着逆向工程设置词的优先级来规避,没有深究调试方法,这次决定下点功夫搞清楚缘由。 rply 的调试信息有限,貌似 七年前就是如此,包括 shift/reduce 在...

4
0
发表了资讯
2021/04/21 08:34

木兰语言 0.0.17.1:源码生成支持更多函数、类相关语法

这几个星期继续重现由 Python 语法树生成木兰源码的功能(0.0.17.1 已发布在 PyPI,可通过 pip install ulang 安装): 单参数、多参数、带默认值参数函数定义 类、类方法、构造方法、嵌套类、扩展类 引用属性、类方法 如下 Python 代码: class C1: class C2: def __init__(self): print(2) def __init__(self): print(1) C1() C1.C2() 可生成木兰源码: type C1 { t...

5
1
发表了资讯
2021/04/04 10:49

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

刚开始实现从 Python 源码转为木兰源码,现在支持无参数函数定义以及函数调用等,刚在 pypi 发布了 ulang 0.0.17 版本包含此功能。 下面左侧为 Python 代码,运行 $ 木兰 -兰 XX.py 后生成右侧的对应木兰代码: 实现机制是扩展 Python ast 库的 NodeVisitor,对每个相关语法节点编写相关生成规则。以函数定义部分为例,可见 主体 将函数体内声明分行显示并以大括号包围: def visit_FunctionDef(self, 节点): s...

35
0
发表了资讯
2021/02/20 06:59

木兰编程语言报错信息分类与可用性简析

【项目开源在 Gitee:木兰编程语言/mulan-rework】 去年对木兰编程语言的报错信息作了 初步中文化与内容改进,原因见前文《一岁了!》。积累了几十个用例但一直没有纳入自动测试,本周整理后纳入了 Gitee 流水线测试,期间重温了各个报错信息性质,小结如下。 报错分类 词法分析、语法分析、编译为可执行码(用 Python 的 compile 方法)、运行(用 Python 的 exec 方法)四个阶段都会报错,逐个举例。 词法分析 # c = 3 【给出...

0
0
发表了资讯
2021/02/10 15:17

木兰语言多次引用模块的行为小结

续 上文,对重复引用的各种方式作了更多测试,基于当前理解作一小结。 简言之,由于每次引用模块都对其执行(exec)一次,在多处引用同一模块的情况下,引用顺序和模块位置不同会导致不同结果。 比如在 TypeDef 模块中定义一个类: type Type1 { ; } 在同层目录下 Instance1 模块中声明一个个体: using * in TypeDef instance1 = Type1() 那么在另一模块中,先后引用 TypeDef 和 Instance1,如下的 isa 判断(对应 pyth...

2
0
发表了资讯
2021/01/21 08:56

木兰编程语言一岁了

测试覆盖的、重现了的部分木兰语法演示。用 VS Code 插件高亮,调用了草蟒库: 为木兰语言编写的在线开发环境原型的后端也用木兰编写,使用 Python 框架 tornado: 部分报错信息中文化: 用木兰改写了 Python 入门书籍的文字冒险游戏例程: 借助 Pygame 编写的小游戏: 以上代码可用 pip install ulang 安装木兰后运行。项目开源在 Gitee: 木兰编程语言/mulan-rework 一年前的悬赏仍在。...

60
0
发表了资讯
2021/01/18 14:29

重现木兰编程语言的基本 try……catch 语法

上个月初开始逐步对《Make Your Own Python Text Adventure: A Guide to Learning Programming》一书中的文字冒险游戏例程用木兰语言重写并改为中文标识符,由于接近该系列尾声,于是自己重现了 try……catch 最基本语法供例程所需(PyPI 0.0.16版本),当然余下还有try 相关与其他很多木兰功能悬赏待重现,随时恭候。 木兰的 try...catch 基本语法 可以 catch 所有错误,不用指定具体类型: try { print([][0]) } catch...

0
0
发表了资讯
2021/01/05 16:46

用木兰语言编写文字冒险游戏(十三、四章),又一个特性发现

继续改写 Python 文字冒险游戏,第十三章的主要添加了玩家在每格的行动限制: func 选择命令(位置, 玩家) { 行动 = nil while !行动 { 可选行动 = 取可选行动(位置, 玩家) 选择 = input("行动: ") 行动 = 可选行动.get(选择) if 行动 { // 为避免如此特殊处理, 其他行动也需加"环境"参数 if (行动 == 玩家.攻击) { 行动(位置.敌人...

24
0
发表了资讯
2020/12/30 08:52

木兰编程语言不同运行版本的 Python sys.path 差异小结

上文中的两个问题之一,是发布到 PyPI 的版本在运行时有个测试未通过:测试/引用/引用本地包内py.ul,而开发版和木兰原始可执行文件是通过的。 由于这是第一次发觉 PyPI 发布版本的行为差异,于是优先研究。 问题描述 测试源码如下: using test.package.module_py test.package.module_py.talk() 在项目根目录下(后文如无特别说明,命令运行都在根目录下),有如下测试包结构: test package module_py.py test_module_py...

0
0
发表了资讯
2020/12/24 13:41

木兰语言的引用相关功能与问题新发现

上周继续改写 Python 文字冒险游戏第十二章,期间发现个木兰编程语言在引用功能上的特别之处。 起因是这样。在 世界.ul 中添加了随机敌人: type 敌人位置 : 地块 { func $敌人位置(x, y) { 随机 = random.random() if 随机 < 0.50 { $敌人 = ch12.敌人.大蜘蛛() $提示出现 = "一只大蜘蛛从它的网上跳到你面前!" $提示死亡 = "死蜘蛛的尸体在地上发臭。" ...

36
0
发表了资讯
2020/12/15 15:37

木兰语言 0.0.15.1:继续改写 Python 冒险游戏;引用包路径规则小结

这几天在用木兰语言继续改写 Python 文字冒险游戏例程时,又体验到引用模块时使用的包路径与 Python 的差别,之前虽然写过相关测试但未整理成文档,在此小结一下。 以下面的文件目录为例(注意:不需在包目录中添加 __init__.py 之类的文件): 一级包 二级包 甲.ul 乙.ul 甲和乙为木兰源码,内容如下,甲.ul: a = 3 乙.ul 中引用甲模块: using 甲 print(甲.a) 如果在“二级包”目录下运行: $ 木兰 乙.ul 输出 3 无...

30
0
发表了资讯
2020/12/07 06:36

用木兰语言编写文字冒险游戏,期待合作者一同重现 try...catch 语法

上周开了两个支线,一是在整理和消化至今用到的正则表达式时,调研用中文 API 让正则表达式更易读写;二是基于一本编程入门书籍开始检验木兰当前发布版本的实用性。 正则表达式 API 如木兰中字符串插值部分用到的正则表达式 r'(\")((?<!\\)\\\1|.)*?\1',用设想中的 API 表达: 分段(双引号) .分段( 任一( 序列(反斜杠, 引用分段(1)).前面不是(反斜杠), 序列(非换行字符) ) ).若干().不贪() ...

9
0
发表了资讯
2020/11/26 16:26

为木兰开发环境雏形添加输入补全,功能测试大提速

之前用木兰代码基于 tornado 框架编写服务后端,完成了代码编辑、运行的最基本操作。本周为其添加了 sqlite 数据库,用于保存输入历史并提供简单的补全功能,效果如下(输入“运行”后下拉框提示以往包含“运行”的输入): 【木兰安装方法:pip install ulang,用法与例程请见 PyPI。源码位于开源中国。 注意:必需 python 3.7,源码文件需 UTF-8 编码】 下面是访问数据库以提供补全项的木兰代码: type 预估请求: SessionMi...

7
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了博客
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
发表了问答
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
暂无内容
40 评论
67 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部