使用pyparsing解析s表达式时出现错误

4

我正在尝试使用Python(v3.4.0)和pyparsing(v2.0.1)解析s表达式。我思考了以下代码很长时间,但是仍然收到ParseException的错误信息。该代码可以解析例如“a(”之类的内容,但无法解析“(a(b))”。

import pyparsing as pp

# S-expression grammar
w = pp.Word(pp.alphanums)
lp = pp.Suppress("(")
rp = pp.Suppress(")")
sexp = pp.Forward()
sexp_list = pp.Forward()
sexp_list << (sexp | (sexp + sexp_list))
sexp << (w | (lp + sexp_list + rp))

s = "(a (b))"

try:
  pr = sexp.parseString(s)
  print(pr)
except pp.ParseException as e:
  print(e)
1个回答

2

这个diff对你是否有效?

9,10c9,10
< sexp_list << (sexp | (sexp + sexp_list))
< sexp << (w | (lp + sexp_list + rp))
---
> sexp_list = pp.Group(lp + pp.ZeroOrMore(sexp) + rp)
> sexp << (w | sexp_list)

谢谢,它有效。不过我想了解一下,原始代码是否存在问题,还是这是一个pyparsing的bug? - Hermann Speiche
1
不是 bug,而是 pyparsing 已知的问题。你并没有确切说明问题是什么,但我会猜测一下。你所指定的是一个左递归语法,因此 pyparsing 会无限递归直到用尽堆栈空间为止。pyparsing 处理列表的惯用方法就像 Kenji 在这里展示的那样,使用 OneOrMore 或 ZeroOrMore(或者更近期的乘法重载)。 - PaulMcG
@AnthonyKong - pyparsing重载了'<<'运算符,以便将解析表达式“注入”到先前定义的Forward占位符中。这是必要的,因为Python不允许将“=”赋值重载为运算符。 - PaulMcG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接