2

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

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

document = {protocol}+ ;

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

我还尝试了一些变化:

document = protocol document | $ ;

但是,如果只有一个协议,这不会产生一个列表,也不会给出有用的错误消息,只有no available options: (...) document当任何协议包含错误时才说。

如何编写同时执行以下两项的规则?:

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

1 回答 1

1

这是解决方案:

document = {protocol ~ }+ $ ;

如果您不添加$for 解析器以查看文件结尾,则解析将使用一个或多个协议成功,即使还有更多要解析。

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

于 2016-10-06T01:39:52.440 回答