PyParsing Parser Alternation

时间:2017-08-29 16:41:25

标签: python parsing pyparsing

我正在使用PyParsing为我的语言(N)创建解析器。语法如下:(name, type, value, next)其中next可以包含该语法本身的实例。我的问题是我收到TypeError: unsupported operand type(s) for |: 'str' and 'str'错误。我看到|的PyParsing示例支持交替,就像在BNF表示法中一样。

代码:

from pyparsing import *

leftcol = "["
rightcol = "]"
leftgro = "("
rightgro = ")"
sep = ","+ZeroOrMore(" ")
string = QuotedString('"')
intdigit = ("0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9")
number = intdigit + ZeroOrMore(intdigit)
none = Word("none")
value = number | string | collection
collection = leftcol + (value + ZeroOrMore(sep + value)) + rightcol
parser = leftgro + string + sep + string + sep + (value) + sep + (parser | none) + rightgro

print(parser.parseString("""

"""))

1 个答案:

答案 0 :(得分:2)

"0"是一个普通的Python字符串,而不是ParseElement,字符串不具有|运算符的任何实现。要创建ParseElement,您可以使用(例如)Literal("0")|的{​​{1}}运算符接受字符串参数,隐式将其转换为ParseElement s,因此您可以写:

Literal

但更好的解决方案是更直接的:

intdigit = Literal("0") | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"