<p>我在你的代码中做了一些改动以使它能正常工作,我用注释来指明出了什么问题。在</p>
<pre><code>def parse_x_prot(text):
# Set up some shortcuts
lbra = pp.Literal('{').suppress()
rbra = pp.Literal('}').suppress()
lang = pp.Literal('<').suppress()
rang = pp.Literal('>').suppress()
dot = pp.Literal('.')
cstr = pp.quotedString.addParseAction(pp.removeQuotes)
# Define how a correct tag looks like (we use combine here to get the full tag in the output)
tag = pp.Combine(
lang +
pp.Word(pp.alphanums) +
pp.Optional(pp.Group(dot + pp.quotedString)) +
rang)
# Define legal value (first combine is for decimal values)
val = pp.Combine(pp.Word(pp.nums) + dot + pp.Word(pp.nums)) | cstr | pp.Word(pp.nums)
# Define the array with statement as recursion element
statement = pp.Forward()
array = pp.Group(pp.OneOrMore(tag) +
pp.OneOrMore(
(
# Note the one or more function here as we have
# a kind of list here which will have elements
(lbra + pp.OneOrMore(val | statement) + rbra) |
val |
(lbra + rbra)
)
)
)
statement << array
return statement.parseString(text)
</code></pre>