Debugging pyparsing能否吐出导致ParseException的文本?

Debugging pyparsing能否吐出导致ParseException的文本?,debugging,exception,text-parsing,string-parsing,pyparsing,Debugging,Exception,Text Parsing,String Parsing,Pyparsing,我尝试用一个复合表达式解析一些文本,如 a = pp.Word(pp.alphas).setResultsName('A') b = pp.Word(pp.nums).setResultsName('B') c = pp.Word(pp.alphas).setResultsName('C') expr = a + b + c 并且,parseString异常失败 ParseException: Expected W:(0123...) (at char 7), (line:1, col:8)

我尝试用一个复合表达式解析一些文本,如

a = pp.Word(pp.alphas).setResultsName('A')
b = pp.Word(pp.nums).setResultsName('B')
c = pp.Word(pp.alphas).setResultsName('C')
expr = a + b + c
并且,
parseString
异常失败

ParseException: Expected W:(0123...) (at char 7), (line:1, col:8)
到目前为止还不错。但是,为了更好地理解发生了什么,是否可以要求
pyparsing
/
parseString
直接告诉我输入字符串中的哪个字符不匹配?(当然,我可以根据例外文本中的信息自行计算。)


此外,是否可以看到在哪个子表达式(a、b或c)中引发了异常?

解析异常包括一个方法markInputline(),该方法将打印输入字符串的最后一行以及异常发生的标记:

import pyparsing as pp
a = pp.Word(pp.alphas).setResultsName('A')
b = pp.Word(pp.nums).setResultsName('B')
c = pp.Word(pp.alphas).setResultsName('C')
expr = a + b + c
try:
    expr.parseString("lskdjf lskdjf sdlkfj")
except ParseException as pe:
    print(pe.markInputline())

lskdjf >!<lskdjf sdlkfj
还有几点:

  • 我已经使用setName()为表达式本身命名,因此异常消息更具可读性。请注意setName和setResultsName之间的区别

  • 我使用了调用语法来定义结果名称。在实践中(或者只是出于懒惰),我发现“.setResultsName”方法调用确实会影响代码的语法定义部分。因此,您可以只编写
    expr('xyz')
    ,而不是
    expr.setResultsName('xyz')


谢谢!努力工作使用
setName
也很好,但是写
.a.setName('a')
.b.setName('b')
.c.setName('c')
有点痛苦。。。如果ParseRelation`对象可以检查它所引用的变量名,那就太好了——但这在Python中是不容易做到的……记住,为表达式保留setName(在本例中,只保留alphaword和numword),您不需要每次使用它们时都调用它。但是,是的,我研究了自动命名表达式的各种选项,包括调用堆栈和检查包含赋值的行,但是它们都相当危险,并且在不同版本或Python实现中不可靠。祝你好运
alphaword = pp.Word(pp.alphas).setName('alphaword')
numword = pp.Word(pp.nums).setName('numword')
expr = alphaword('A') + numword('B') + alphaword('C')
try:
    expr.parseString('sldkj slkdj sldkj')
except ParseException as pe:
    print(pe.line)
    print(' '*(pe.col-1) + '^')
    print(pe)

sldkj slkdj sldkj
      ^
Expected numword (at char 6), (line:1, col:7)