几个报错问题比较原始

高优先在前

### 语法部分

[木兰编程语言待重现语法和功能](https://gitee.com/MulanRevive/mulan-rework/issues/I1SEU5)

#### 待确认

- 如何将源码的相关语法规则列出来? 比如下面仅在交互模式可行，想查看 a:str 涉及的语法规则：
  ```
  > a=10
  > a:str
  10
  ```
- 如何获得一个包含某个或某些语法规则的源码？比如 expr: yield_expr（需要语法正确）或者单个 str 作为 expr。
- 完善线程和 sleep/delay/delayMicroseconds 相关测试
- 多个父类使用 super() 时与 python 的行为比较
- 无 sorted 内置函数，只能用列表的 .sort() ？
- 支持函数指定返回数组类型：`func shout(id): Person [A, B]`
- [变长参数](http://www.yourownlinux.com/2016/12/python-function-args-kwargs.html#:~:text=Variable%20Length%20Arguments%20A%20Python%20function%20can%20use,function%20can%20accept%20keyworded%20variable%20length%20argument%20list.) (* args)
- 不支持slice: `print([1, 2, 3, 4, 5][slice(1, 3)])`，但可以：`print([1, 2, 3, 4, 5][1:3])`
- 语法规则：`slice : exprs , expr`, 是否为列表取元素如`a[1, 3, 5]`？ 但`print([1, 2, 3, 4][0, 2, 3])` 报错："TypeError:
  list indices must be integers or slices, not tuple"
- 原可执行文件同样不支持字典最后一项末尾逗号: `{1 : 'a', 3 : 'c',}`
- print("`('X' if true)`z") // 没认出这个词 "if"
- python 库中如有与关键词同名的 API，如 sqlalchemy 库中的 func 方法，如何调用？https://zhuanlan.zhihu.com/p/313557385
- 命令行中，“想的”是个体还是类型属性？
- 2 + 3 - 4 / 5 // 6 生成有误
- python测试框架无法使用，已试过 unittest，testify

### 自动从python转木兰

- a = b = c 失败，`a = b = 1` 会转为 `a, b = 1`，仍无法运行，需手工改为 `a, b = 1, 1`
- a, b = c, d 转为了 a, b= tuple(c, d)，实际上不用变
- 已确认与原始相同
  - 条件都加了括号，如 if (a>b) 或 while (a>0)
  - 内置函数需自行修正，如 isinstance、不支持 type()等
  - 带括号运算中的括号不会保留，如 `(2 + 3)*4` 转为 `2 + 3 * 4`

- 尚未实现
  - 字符串插值，如 `f'{c}测试'` 转为 `'`c`测试'`

### 反馈信息中文化

- 报错信息规整化
- 引用带.木兰模块. 待确认: 模块名不能为'module'否则报语法错误?
- 引用木兰模块时, 如果模块有语法错误, 应该提示该语法错误与位置
    - 引用 python 模块时, 报错: `invalid syntax (test_module_py.py, line 7)`, 但引用木兰时仅报错`No module named xxx`
    - 多级引用时，比如模块 a 引用 b， b 引用 c，如果 b 引用 c 出错，那么调用 a 时只报 no module named b。需研究 python 是如何报错。

- 如果少了个匹配的 }:

```
没认出这个词 "$end"
```

- 语法树.取末位() 为何被调用两次?
- 可以利用“括号不匹配”判断哪个括号未匹配(超出重现范畴)

[
1, // 多了逗号
]

```
分析器.错误.语法错误: 文件 "测试/实用/规划/形状.ul", 第27行, 第3列, 没认出这个词 "]"
  ],
  ^
```

需要输出错误类型, 比如`ValueError`:

```
>>> [1, 1].index(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
```

- 类型错误：

```
> using larger
> larger(5,6)
 😰 TypeError：'module' object is not callable，见第1行
```

```
using BeautifulSoup in bs4

  try 文件=open('原型/测试/before.html') {
      原内容=文件.read()
  }

页面 = BeautifulSoup(原内容, 'html.parser')
print(页面.final_all('p'))
> 😰 TypeError：'NoneType' object is not callable
见第10行：print(页面.final_all('p')) 

因为 final_all 不存在
```

```
> for a in nil { pass }
 😰 TypeError：'NoneType' object is not iterable，见第1行
```

需与代码内容保持一致，比如下面代码中并无 len：

```
> #1
 😰 TypeError：object of type 'int' has no len()
```

需更易定位何处哪个字符问题

```
临时/编码错误.ul
 😰 UnicodeDecodeError：'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
```

多余层级信息：

```
$ 木兰 测试/错误处理/匿名函数变量未定义.ul
 😰 请先定义‘nn’再使用
见第1行：print(list(filter(n -> -nn, [2,3])))
调用层级如下
见第1行：print(list(filter(n -> -nn, [2,3])))
```

词法分析时, 报错需要更精准简短, 见[此例](../测试/错误处理/不可见字符.ul)

在报错信息中添加相关变量信息, 比如下面, 最好告知 a 是 list

```
> a=[]
> a.find('c')
 😰 list没有属性‘find’，见第1行
```

### 其他

- 编辑器
    - 根据输入内容更新高亮
    - [参考](https://code.visualstudio.com/blogs/2016/11/15/formatters-best-practices)
      实现格式化。重用交互环境的“括号已配对”部分逻辑？词法和语法两种机制[参考](http://beza1e1.tuxen.de/articles/formatting_code.html)
    - 显示当前打开文件的文件名
    - 检查不配对括号/词法错误等等(比如 && 不识别)
    - 可以查看（搜索）当前测试用例
    - 记录开发过程
        - 记录所有操作，如所有鼠标键盘事件(可供之后分析, 优化补全等功能减少键入), 打开文件、读代码、编辑代码等等，包括时间
        - 期间的建议（补全、警告、疑问、报错等等）
        - 可以对操作过程进行录制、重复、修改
- 自动测试木兰代码，尤其是错误处理部分
- 项目搭建 CI, 包括单元和集成测试
- 基于例程和 API 文档的组织的开发环境
- 对 Python、木兰代码实现中英互转，rpython 需要 python2
- 木兰代码生成(逆向中 ulgen.py ), 可用冒险游戏中的代码作测试(python 转木兰)并与手工版对比

### 维护

codegen 已八年未更新。需要时可考虑使用 astor

### 设计参悟

函数无参数时定义可省去括号, 与应变属性调用时无需括号, 是否有联系?
