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

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

内容简介:木兰原始可执行文件的报错信息非常简单,并不包含出错位置和调用层级信息: >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:中文报错信息规整,枚举引用新发现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Algorithms + Data Structures = Programs

Algorithms + Data Structures = Programs

Niklaus Wirth / Prentice Hall / 1975-11-11 / GBP 84.95

It might seem completely dated with all its examples written in the now outmoded Pascal programming language (well, unless you are one of those Delphi zealot trying to resist to the Java/.NET dominanc......一起来看看 《Algorithms + Data Structures = Programs》 这本书的介绍吧!

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

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码