如何使用 pyparsing 来解析带撇号的语言?
How do I use pyparsing to parse a language with apostrophes?
我正在尝试使用 pyparsing 解析一种带有撇号的小语言,一切都很顺利,直到我突然开始收到无法调试的神秘错误。
我已将我的解析器缩减到导致错误的最少部分:
作为我正在尝试做的事情的一个例子,考虑一种带有 ones 和 ones 的嵌套列表的语言。
例如1(11)1(1((11)1))
可以这样解析:
from pyparsing import *
sound=Regex(r"1")
beat=sound ^ nestedExpr(content=sound)
tune=OneOrMore(beat)
print(tune.parseString("1"))
print(tune.parseString("11"))
print(tune.parseString("(1)"))
print(tune.parseString("(1(1))"))
但是如果我尝试添加撇号,那么基本单位是 '1
而不是:
例如'1('1'1)'1('1(('1'1)'1))
sound=Regex(r"'1")
beat=sound ^ nestedExpr(content=sound)
tune=OneOrMore(beat)
#These all work as expected
print(tune.parseString("'1"))
print(tune.parseString("'1'1"))
print(tune.parseString("('1)"))
#but
print(tune.parseString("('1('1))"))
导致异常
pyparsing.ParseException: Expected {Re:("'1") ^ nested () expression}, found '1' (at char 5), (line:1, col:6)
任何人都可以告诉我如何使第二个示例像第一个示例一样工作,以便第一个接受的任何字符串在将每个 1
替换为 [=14= 后将被第一个接受]?
nestedExpr
的默认值为 ignoreExpr=quotedString
。这会尝试将前导 '
匹配为引号。通过设置 ignoreExpr=None
:
禁用它
>>> sound=Regex(r"'1")
>>> beat=sound ^ nestedExpr(content=sound, ignoreExpr=None)
>>> tune=OneOrMore(beat)
>>> print(tune.parseString("('1('1))"))
[["'1", ["'1"]]]
我正在尝试使用 pyparsing 解析一种带有撇号的小语言,一切都很顺利,直到我突然开始收到无法调试的神秘错误。
我已将我的解析器缩减到导致错误的最少部分:
作为我正在尝试做的事情的一个例子,考虑一种带有 ones 和 ones 的嵌套列表的语言。
例如1(11)1(1((11)1))
可以这样解析:
from pyparsing import *
sound=Regex(r"1")
beat=sound ^ nestedExpr(content=sound)
tune=OneOrMore(beat)
print(tune.parseString("1"))
print(tune.parseString("11"))
print(tune.parseString("(1)"))
print(tune.parseString("(1(1))"))
但是如果我尝试添加撇号,那么基本单位是 '1
而不是:
例如'1('1'1)'1('1(('1'1)'1))
sound=Regex(r"'1")
beat=sound ^ nestedExpr(content=sound)
tune=OneOrMore(beat)
#These all work as expected
print(tune.parseString("'1"))
print(tune.parseString("'1'1"))
print(tune.parseString("('1)"))
#but
print(tune.parseString("('1('1))"))
导致异常
pyparsing.ParseException: Expected {Re:("'1") ^ nested () expression}, found '1' (at char 5), (line:1, col:6)
任何人都可以告诉我如何使第二个示例像第一个示例一样工作,以便第一个接受的任何字符串在将每个 1
替换为 [=14= 后将被第一个接受]?
nestedExpr
的默认值为 ignoreExpr=quotedString
。这会尝试将前导 '
匹配为引号。通过设置 ignoreExpr=None
:
>>> sound=Regex(r"'1")
>>> beat=sound ^ nestedExpr(content=sound, ignoreExpr=None)
>>> tune=OneOrMore(beat)
>>> print(tune.parseString("('1('1))"))
[["'1", ["'1"]]]