我正在使用 grako(一个用于 python 的 PEG 解析器生成器库)来解析一种简单的声明性语言,其中一个文档可以包含一个或多个协议(protocol)。
最初,我将文档的根规则写为:
文档 = {协议(protocol)}+ ;
这会适本地返回一个协议(protocol)列表,但如果第一个协议(protocol)中存在语法错误,则只会给出有用的错误。否则,它会默默地丢弃无效协议(protocol)及其之后的所有内容。
我还尝试了一些变体:
document = protocol document | $ ;
但是如果只有一个协议(protocol),这不会产生列表,也不会给出有用的错误消息,只说 no available options: (...) document
如果有协议(protocol)包含错误。
如何编写执行以下两项操作的规则?:
- 总是返回一个列表,即使只有一个协议(protocol)
- 显示有关不成功匹配的有用错误消息,而不是仅仅说它是无效文档或静静地丢弃损坏的协议(protocol)
最佳答案
这是解决方案:
document = {protocol ~ }+ $ ;
如果您不为解析器添加 $
以查看文件末尾,则使用一个或多个协议(protocol) 解析将成功,即使有更多解析。
添加 cut 表达式 (~
) 使解析器提交解析中最接近的选项/选择中解析的内容(闭包是 的一个选项>X = X|();
). protocol
解析内容中的额外cut 表达式将使错误消息更接近输入中的预期故障点。
关于python - 解析一个或多个具有有用错误的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39881655/