安装方法:pip install ulang
,使用方法与例程请见 pypi 项目首页(源于码云首页)。 注意:必需 python 3.7
木兰原始可执行文件的报错信息非常简单,并不包含出错位置和调用层级信息:
>ulang-0.2.2.exe 测试\错误处理\引用模块.ul
IndexError: list index out of range
这在交互环境或者源码文件单一很短时还可接受,但开发更长代码或者多文件项目时就使得排错十分困难。四个月前添加了一些中文报错信息,本周在对井字棋游戏进行重构时,发现多文件互相引用时未显示层级调用信息,颇为不便,于是进行了修正。现在的报错行为举例如下:
交互环境中仅提示出错所在位置简要信息:
> func a(n) { return n1+1 }
> func b(n) { print(n) }
> b(a(2))
😰 请先定义'n1'再使用, 见第1行
运行源码时,可见调用各层的详细信息:
$ 木兰 测试/错误处理/未定义变量于多层函数.ul
😰 请先定义'数1'再使用
见第2行:return 数1 + 1
调用层级如下
见第7行:输出(加(2))
如果错误发生在其他文件,可见文件名:
$ 木兰 测试/错误处理/引用模块.ul
😰 取列表内容时,索引超出范围
“测试/错误处理/下标越界函数.ul”第2行:print([][0])
调用层级如下
见第3行:a()
如果某被引用的模块加载出错,现在只能提示问题模块,今后将尝试加上该模块的具体问题和定位信息,另外还有个相关问题:
$ 木兰 测试/错误处理/引用问题模块.ul
😰 No module named '测试'
调用层级如下
见第1行:using * in 测试.错误处理.无此变量
如果错误可以定位到列,则也用醒目符号提示出错位置,木兰源码的层级调用信息将在之后版本清除:
$ 木兰 测试/错误处理/中文对齐.ul
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.7/bin/木兰", line 10, in <module>
sys.exit(中())
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/木兰/中.py", line 54, in 中
节点 = 分析器.分析(源码, 源码文件)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/木兰/分析器/语法分析器.py", line 972, in 分析
节点 = self.分析器.parse(各词, state=self)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/木兰/分析器/rply_parser.py", line 92, in parse
self.error_handler(state, lookahead)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/木兰/分析器/语法分析器.py", line 933, in error_handler
源码=self.源码)
木兰.分析器.错误.语法错误: 文件 "测试/错误处理/中文对齐.ul", 第1行, 第12列, 没认出这个词 "by"
print("铛铛" ✋by 2)
如果有大括号未匹配,会报 $end 错误于文件末尾,希望今后参考其他编译器进行改进:
$ 木兰 测试/错误处理/括号不匹配.ul
【前略】
木兰.分析器.错误.语法错误: 文件 "测试/错误处理/括号不匹配.ul", 第6行, 第2列, 没认出这个词 "$end"
*✋/
在重构井字棋的过程中发现,在 e 模块定义的 T 枚举类型有 X、O 两项,在 a 模块中赋值 aa 为 T.X,在 b 模块中判断 aa == T.X,结果返回 false。
现在规避的方法是在 a 模块中加一个接口用来判断 aa == T.X,来避免 b 模块对 T 的依赖。
尚需细究根源。详见此 issue
$ 木兰 --版本
0.0.14.4
$ 木兰 -版
0.0.14.4
继续对自带的木兰代码编辑器进行重构和改进,以尽早投入实用。
主要部分的代码行数统计,格式为:上次->现在。
分析器/语法分析器.py
:989 -> 990测试/运行所有.py
,检验所有木兰测试代码片段:187 -> 189分析器/语法树.py
:178 -> 188环境.py
,定义全局方法:157 -> 160中.py
,主程序:45 -> 74功用/调试辅助.py
,:56 -> 57功用/反馈信息.py
:49 -> 55setup.py
, 33 -> 34分析器/词法分析器.py
:198交互.py
,交互环境(REPL):138分析器/语法成分.py
,从语法分析器中提取出来的枚举常量:79分析器/错误.py
:17测试/unittest/语法树.py
,确保生成的语法树与原始版本一致:67测试/unittest/交互.py
,交互环境相关测试:28