我正在使用 grako(python 的 PEG 解析器生成器库)来解析一种简单的声明性语言,其中文档可以包含一个或多个协议。
最初,我将文档的根规则写为:
document = {protocol}+ ;
这会适当地返回协议列表,但仅在第一个协议中出现语法错误时才会给出有用的错误。否则,它会默默地丢弃无效协议及其之后的所有内容。
我还尝试了一些变化:
document = protocol document | $ ;
但是,如果只有一个协议,这不会产生一个列表,也不会给出有用的错误消息,只有no available options: (...) document
当任何协议包含错误时才说。
如何编写同时执行以下两项的规则?:
- 总是返回一个列表,即使只有一个协议
- 显示有关不成功匹配的有用错误消息,而不是仅仅说它是无效文档或静默删除损坏的协议