在 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
的重复只会不断地找到空的 restOfLine
s,所以 indentedBlock
永远循环。
目前的解决方法是,在修复并发布此错误之前,将 line
的定义从:
更改为
line = ungroup(restOfLine)
到
line = ungroup(~StringEnd() + restOfLine)
我正在尝试使用 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
的重复只会不断地找到空的 restOfLine
s,所以 indentedBlock
永远循环。
目前的解决方法是,在修复并发布此错误之前,将 line
的定义从:
line = ungroup(restOfLine)
到
line = ungroup(~StringEnd() + restOfLine)