【项目开源在Gitee:木兰编程语言mulanrework】 去年对木兰编程语言的报错信息作了初步中文化与内容改进,原因见前文《一岁了!》。积累了几十个用例但一直没有纳入自动测试,本周整理后纳入了Gitee流水线测试,期间重温了各个报错信息性质,小结如下。报错分类 词法分析、语法分析、编译为可执行码(用Python的compile方法)、运行(用Python的exec方法)四个阶段都会报错,逐个举例。词法分析 c3 【给出行列号】分词时没认出这个词语法分析 a〔1,〕 【给出行列号】没认出这个词〕编译 例一:print(2)3 ValueError:expressionwhichcantbeassignedtoinStorecontext 例二:return 语法错误:returnoutsidefunction(函数外return。ul,line1)运行时 print(12)字符串只能拼接字符串,请将int先用str()转换见第1行:print(12)可用性分析词法或语法分析的报错信息内容相似,但是否在分词时认不出token恐怕对语言开发者更有用。最终用户应该只在乎为何认不出,以及如何修改。例子中可见,一些报错信息并未指向问题源头。比如a〔1,〕是因为〕之前多了个逗号。这种报错对用户并不友好。与上一条相关,在定位偏差之外,很多时候并未给出修改建议,这应该是用户最关心的。部分报错信息尚未中文化,尤其像某些编译时的报错非常晦涩,还有很大改进空间。之前的分词例子实际还包含了如下大块的回溯信息,这些对最终用户来说无大价值Traceback(mostrecentcalllast):Fileoptanaconda3libpython3。7sitepackages木兰分析器语法分析器。py,line1037,in分析节点self。分析器。parse(各词,stateself)【略去六行】rply。errors。LexingError:(None,SourcePosition(idx12,lineno3,colno6))Duringhandlingoftheaboveexception,anotherexceptionoccurred:Traceback(mostrecentcalllast):Fileoptanaconda3bin木兰,line8,inmodulesys。exit(中())【略去四行】木兰。分析器。错误。词法错误:文件测试错误处理词不识。ul,第3行,第6列,分词时没认出这个词c3 之后需针对这几项在使用中逐步改进。