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

标签 python parsing ebnf peg grako

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

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

文档 = {协议(protocol)}+ ;

这会适本地返回一个协议(protocol)列表,但如果第一个协议(protocol)中存在语法错误,则只会给出有用的错误。否则,它会默默地丢弃无效协议(protocol)及其之后的所有内容。

我还尝试了一些变体:

document = protocol document | $ ;

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

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

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

最佳答案

这是解决方案:

document = {protocol ~ }+ $ ;

如果您不为解析器添加 $ 以查看文件末尾,则使用一个或多个协议(protocol) 解析将成功,即使有更多解析。

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

关于python - 解析一个或多个具有有用错误的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39881655/

相关文章:

python - tkinter 条目和从右到左的光标

Python Dateutil解析: Minimum number of components

java - 获取PDFBox中的文本颜色

parsing - 如何解析子节点?

json - 关于 EBNF 表示法和 JSON 的问题

python - 打开多个 Excel 文件,打开每个文件的每个工作表,然后保存图像

python - 日期时间值小于 datetime.min 是什么意思?

parsing - ANTLR 赋值表达式消歧

mysql - 读到行尾

parsing - 扩展的巴科斯诺尔形式 (EBNF) 能否描述一组无序的值?