我正在使用grako(用于python的PEG解析器生成器库)来解析一个简单的声明性语言,其中一个文档可以包含一个或多个协议。
最初,我将文档的根规则写成:
document = {protocol}+ ;
这适当地返回协议列表,但只有在第一个协议中出现语法错误时才会提供有用的错误。否则,它会无声地丢弃无效协议及其后的所有内容。
我还尝试了一些变体:
document = protocol document | $ ;
但如果只有一个协议,则不会产生列表,也不会提供有用的错误消息,只说no available options: (...) document
任何协议包含错误。
如何编写执行以下两项操作的规则?:
答案 0 :(得分:1)
这是解决方案:
document = {protocol ~ }+ $ ;
如果您没有为解析器添加$
以查看文件末尾,则解析将使用一个或多个协议成功,即使还有更多要解析的内容。
添加 cut 表达式(~
)使解析器提交到解析中最接近的选项/选项中解析的内容(闭包是X = a X|();
的一个选项)。在protocol
解析的内容中的其他 cut 表达式将使错误消息更接近输入中的预期故障点。