You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pyparsing中为禁用回溯的语法元素添加自定义错误信息?

问题

在pyparsing库(稳定版3.0.9)中,当语法规则里存在禁用回溯(用“-”标记)的元素,且该元素预期但未匹配时,能否为其设置“需要名称”这类自定义错误信息?还是只能捕获ParseException并通过位置信息处理?

示例代码如下:

from pyparsing import *

grammar = (
    Literal("//")
    - Word(alphanums)("name")
    + Suppress(White()[1,...])
    + Word(alphanums)("operation")
).leave_whitespace()

grammar.run_tests("""
//name op
// opnoname
""", print_results=True)

当前第二行输入的错误输出为通用提示,希望替换为“需要名称”这类自定义信息,目前想到的方案是捕获ParseException并修改message后重新抛出,想知道是否有更根本的解决方法。

注:此问题源于编写JCL(Job Control Language)解析器。

解答

有更根本的解决方法,无需捕获异常后修改信息,可直接通过pyparsing的setName()和setFailAction()方法,给指定元素绑定自定义错误提示逻辑:

  • 先用setName()给需要自定义错误的语法元素设置标识名称
  • 再用setFailAction()定义匹配失败时的处理逻辑,在其中抛出带有自定义信息的ParseException

修改后的示例代码:

from pyparsing import *

def name_required_fail_action(s, loc, expr):
    raise ParseException(s, loc, "需要名称")

grammar = (
    Literal("//")
    - Word(alphanums)("name").setName("name").setFailAction(name_required_fail_action)
    + Suppress(White()[1,...])
    + Word(alphanums)("operation")
).leave_whitespace()

grammar.run_tests("""
//name op
// opnoname
""", print_results=True)

运行后,第二行输入的错误提示会变为:

ParseException: 需要名称 (at char 2), (line:2, col:3)

这种方式直接在语法定义阶段绑定错误逻辑,比全局捕获异常再修改更精准,符合pyparsing的设计思路,也能避免位置信息匹配错误的问题。

如果想要更简洁的写法,也可以用lambda表达式简化fail action:

grammar = (
    Literal("//")
    - Word(alphanums)("name").setName("name").setFailAction(lambda s, loc, _: ParseException(s, loc, "需要名称"))
    + Suppress(White()[1,...])
    + Word(alphanums)("operation")
).leave_whitespace()

内容的提问来源于stack exchange,提问作者Kuba hasn't forgotten Monica

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:30:13