解析一个或多个有用错误的表达式

时间:2016-10-05 18:55:04

标签: python parsing ebnf peg grako

我正在使用grako(用于python的PEG解析器生成器库)来解析一个简单的声明性语言,其中一个文档可以包含一个或多个协议。

最初,我将文档的根规则写成:

document = {protocol}+ ;

这适当地返回协议列表,但只有在第一个协议中出现语法错误时才会提供有用的错误。否则,它会无声地丢弃无效协议及其后的所有内容。

我还尝试了一些变体:

document = protocol document | $ ;

但如果只有一个协议,则不会产生列表,也不会提供有用的错误消息,只说no available options: (...) document任何协议包含错误。

如何编写执行以下两项操作的规则?:

  1. 总是返回一个列表,即使只有一个协议
  2. 显示有关不成功匹配的有用错误消息,而不仅仅是说它是无效文档或者无声地删除损坏的协议

1 个答案:

答案 0 :(得分:1)

这是解决方案:

document = {protocol ~ }+ $ ;

如果您没有为解析器添加$以查看文件末尾,则解析将使用一个或多个协议成功,即使还有更多要解析的内容。

添加 cut 表达式(~)使解析器提交到解析中最接近的选项/选项中解析的内容(闭包是X = a X|();的一个选项)。在protocol解析的内容中的其他 cut 表达式将使错误消息更接近输入中的预期故障点。