在 pyparsing 中尝试简单的 indentedBlock 表达式时无限循环

Infinite loop while trying simple indentedBlock expression in pyparsing

我正在尝试使用 pyparsing 和 indentedBlock

来解析缩进块

这是我的代码

from pyparsing import *

indent_stack = [1]
line = ungroup(restOfLine)
block = ungroup(indentedBlock(line, indent_stack))

# Work
data = """  foo
  bar
  tar
"""

block.parseString(data).pprint()

问题是 parseString 不会 return。它似乎在等待更多输入,或者我可能进入了无限循环。如果我在代码块中放置一条未定义的行,开始工作

data = """  foo
  bar
  tar

end
"""

但我希望能够解析到未缩进的行(工作情况)或字符串结尾(非工作情况)

我无法弄清楚为什么代码会这样做。我什至在调试模式下尝试 运行 它并暂停,但它甚至不会暂停,这样我就可以看到它卡在哪里了。

您现在可以使用的解决方法是修改数据以添加未缩进的行:

from pyparsing import *

indent_stack = [1]
line = ungroup(restOfLine)
block = ungroup(indentedBlock(line, indent_stack))

# Work
data = """  foo
  bar
  tar
"""

block.parseString(data + "\nend").pprint()

# Result: [['foo'], ['bar'], ['tar']]

这是 pyparsing 中的错误。 indentedBlock 在内部使用 OneOrMore 来实现嵌入行的重复。但是 restOfLine 如果它在一行的末尾就不会失败,所以一旦你到达字符串的末尾,indentedBlock 的重复只会不断地找到空的 restOfLines,所以 indentedBlock 永远循环。

目前的解决方法是,在修复并发布此错误之前,将 line 的定义从:

更改为
line = ungroup(restOfLine)

line = ungroup(~StringEnd() + restOfLine)