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

时间:2018-02-19 21:29:52

标签: python pyparsing

你能解释为什么第二次执行完全相同的parseString会引发pyparsing.ParseException: not a subentry例外吗?

代码:

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)

我试图简化pyparsing wiki中可用的示例: http://pyparsing.wikispaces.com/file/view/indentedGrammarExample.py

完整的堆栈跟踪:https://pastebin.com/QXF5ZJZ7

链接到parseStringhttps://pythonhosted.org/pyparsing/pyparsing.ParserElement-class.html#parseString

的文档

编辑2018-02-20

我将代码扩展了pprint(funcDef),我发现在第一次执行之后 funcDef.parseString(code) funcDef的定义已更改为:

从:

Group:({{"def" W:(0123...)} indented block})

为:

Group:({"def" W:(0123...) indented block})

编辑2018-02-21

indentStack.pop()的第二次执行之前添加funcDef.parseString(code)解决了问题。

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

1 个答案:

答案 0 :(得分:1)

在这种情况下,堆栈有多个层次。

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