Python pyparsing-第二次执行同一语句会引发异常

Python pyparsing-第二次执行同一语句会引发异常,python,pyparsing,Python,Pyparsing,你能解释一下为什么第二次执行完全相同的parseString时会抛出pyparsing.ParseException:不是子条目异常吗 代码: 致: 编辑2018-02-21 在第二次执行funcDef.parseString(code)之前添加indentStack.pop(),解决了这个问题 值得一提的是,它的indentStack=[1]并不能解决问题。这是一个非常有趣的案例,因此我创建了两个代码段来显示差异(我还向库中添加了一些额外的调试打印): 使用以下命令重置缩进堆栈:indent

你能解释一下为什么第二次执行完全相同的
parseString
时会抛出
pyparsing.ParseException:不是子条目
异常吗

代码:

致:

编辑2018-02-21 在第二次执行
funcDef.parseString(code)
之前添加
indentStack.pop()
,解决了这个问题

值得一提的是,它的
indentStack=[1]
并不能解决问题。这是一个非常有趣的案例,因此我创建了两个代码段来显示差异(我还向库中添加了一些额外的调试打印):

  • 使用以下命令重置缩进堆栈:
    indentStack=[1]
  • 使用以下命令重置indentStack:
    indentStack.pop()

在这种情况下,堆栈是多层次的


在第二次执行
funcDef.parseString(code)
之前添加
indentStack[:]=[1]
解决了这个问题。

我刚刚意识到第二次执行
parseTree=module\u body.parseString(data)
在pyparsing示例中与第一个不同。真正的问题是
indentedBlock
使用
indentStack
列表来保存当前列的状态。运行解析器一次后,
indentStack
包含
[1,5]
。如果在示例中添加另一行返回到第1列,或者显式地将
indentStack
重置回[1],则第二次
parseString
调用将成功。@gbajson。。。将您的编辑和解决方案(完整的工作代码;而不仅仅是解决方案本身中的一个场景)发布为自我回答,而不是在您的问题中。你可以更好地找到答案。否则,问题将在“未命名问题列表”中循环使用。您可以在几天内选择自己的答案作为最佳答案。啊,正确,您必须更改实际列表,而不仅仅是为名称指定一个新列表。如果堆栈有多个级别,请执行
del indentStack[1://code>或
indentStack[:]=[1]
,这两种操作都将重置
indentStack
,而不是分配一个新堆栈,因为您发现新堆栈不起作用。让这成为一个自我回答,你们将和Python和平共处,所以.Pyparsing不再托管在wikispaces.com上。去
from pyparsing import *
from pprint import pprint

indentStack = [1]
stmt = Forward()
suite = indentedBlock(stmt, indentStack)

funcDecl = "def" + Word(printables)
funcDef = Group( funcDecl + suite )

stmt << ( funcDef | "open" | "close")
module_body = OneOrMore(stmt)

code="""\
def process
    open
    close"""

# first execution - works fine, but modifies funcDef
pprint(funcDef)
f1 = funcDef.parseString(code)
pprint(f1)

# second execution
pprint(funcDef)
f2 = funcDef.parseString(code)  ### throws pyparsing.ParseException: not a subentry (at char 16), (line:2, col:5)
pprint(f2)


pyparsing.ParseException: not a subentry (at char 16), (line:2, col:5)
Group:({{"def" W:(0123...)} indented block})
Group:({"def" W:(0123...) indented block})