如何在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
相关产品推荐
相关产品推荐

