木兰编程语言 0.0.14.4:中文报错信息规整,枚举引用新发现

栏目: 软件资讯 · 发布时间: 4年前

内容简介:木兰原始可执行文件的报错信息非常简单,并不包含出错位置和调用层级信息: >ulang-0.2.2.exe 测试\错误处理\引用模块.ul IndexError: list index out of range 这在交互环境或者源码文件单一很短时还可接受,...

木兰原始可执行文件的报错信息非常简单,并不包含出错位置和调用层级信息:

>ulang-0.2.2.exe 测试\错误处理\引用模块.ul
IndexError: list index out of range 

这在交互环境或者源码文件单一很短时还可接受,但开发更长代码或者多文件项目时就使得排错十分困难。四个月前添加了一些中文报错信息,本周在对井字棋游戏进行重构时,发现多文件互相引用时未显示层级调用信息,颇为不便,于是进行了修正。现在的报错行为举例如下:

1 报错信息

交互环境中仅提示出错所在位置简要信息:

> 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"
*✋/ 

2 其他

2.1 问题还是本意:枚举值在不同模块中不相等

在重构井字棋的过程中发现,在 e 模块定义的 T 枚举类型有 X、O 两项,在 a 模块中赋值 aa 为 T.X,在 b 模块中判断 aa == T.X,结果返回 false。

现在规避的方法是在 a 模块中加一个接口用来判断 aa == T.X,来避免 b 模块对 T 的依赖。

尚需细究根源。详见此 issue

2.2 命令添加了取版本信息选项“--版本”:

$ 木兰 --版本
0.0.14.4
$ 木兰 -版
0.0.14.4 

下一步

继续对自带的木兰代码编辑器进行重构和改进,以尽早投入实用。


附录:代码量统计

主要部分的代码行数统计,格式为:上次->现在。

  • 木兰代码量 2873
    • 编辑器,实现与测试都是木兰代码:381 -> 402
    • 木兰测试用例,包括部分实用小程序(如井字棋):2304 -> 2471

 

  • Python 代码量(木兰实现与测试框架):2473 -> 2523
    • 分析器/语法分析器.py:989 -> 990
    • 测试/运行所有.py,检验所有木兰测试代码片段:187 -> 189
    • 分析器/语法树.py:178 -> 188
    • 环境.py,定义全局方法:157 -> 160
    • 中.py,主程序:45 -> 74
    • 功用/调试辅助.py,:56 -> 57
    • 功用/反馈信息.py:49 -> 55
    • setup.py, 33 -> 34
    • 未变
      • 分析器/词法分析器.py:198
      • 交互.py,交互环境(REPL):138
      • 分析器/语法成分.py,从语法分析器中提取出来的枚举常量:79
      • 分析器/错误.py:17
      • 测试/unittest/语法树.py,确保生成的语法树与原始版本一致:67
      • 测试/unittest/交互.py,交互环境相关测试:28

以上所述就是小编给大家介绍的《木兰编程语言 0.0.14.4:中文报错信息规整,枚举引用新发现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Effective Python

Effective Python

布雷特·斯拉特金(Brett Slatkin) / 爱飞翔 / 机械工业出版社 / 2016-1 / 59

用Python编写程序,是相当容易的,所以这门语言非常流行。但若想掌握Python所特有的优势、魅力和表达能力,则相当困难,而且语言中还有很多隐藏的陷阱,容易令开发者犯错。 本书可以帮你掌握真正的Pythonic编程方式,令你能够完全发挥出Python语言的强大功能,并写出健壮而高效的代码。Scott Meyers在畅销书《Effective C++》中开创了一种以使用场景为主导的精练教学方......一起来看看 《Effective Python》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具