python - pyparsing - 同一条语句的第二次执行抛出异常

标签 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

parseString 文档链接:https://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

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

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

最佳答案

在这种情况下,堆栈有多层深度。

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

关于python - pyparsing - 同一条语句的第二次执行抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48874455/

相关文章:

python - 如何在 linux 中安装 csvformat?

python - 对 unicode 字母进行 Pyparsing

python - 样式表未从 Django 中的相对路径加载

python - NGINX 背后的 AWS Redis + uWSGI - 高负载

python - float 随机(?!)精度怪癖

python - 使用 pyparsing 累积

python - 有选择地替换字符串中特定的嵌套定界符(括号),同时尊重嵌套

Python - 调用存储在字典中的对象的函数

javascript - 用方括号包裹单词而不是 sglQuotedString 或 dblQuotedString

python - 在嵌套大括号内添加自己的文本