<p>当您成功地处理了输入字符串之后,让我建议您对语法进行一些改进。在</p>
<p>在定义递归语法时,通常需要在输出结果中保持某种结构。在您的例子中,结构的逻辑部分是每个对象的内容,它由左括号和右大括号包围。概念上:</p>
<pre><code>object_content = '{' + ZeroOrMore(attribute_defn | object_defn) + '}'
</code></pre>
<p>那么支持表达式只是(仍在概念上):</p>
^{pr2}$
<p>实际的Python/pyparsing如下所示:</p>
<pre><code>LBRACE,RBRACE,SEMI = map(Suppress, "{};")
word = Word(alphas, alphanums)
attribute = word
# expand to include other values if desired, such as ints, reals, strings, etc.
attribute_value = word
attributeDefn = Group(word("name") + value("value") + SEMI)
OBJECT = Keyword("object")
object_header = OBJECT + word("object_name")
object_grammar = Forward()
object_body = Group(LBRACE
+ ZeroOrMore(object_grammar | attributeDefn)
+ RBRACE)
object_grammar <<= Group(object_header + object_body("object_content"))
</code></pre>
<p><code>Group</code>为我们做了两件事:它将结果构造成子对象;它使一个级别的结果名称不与另一个级别的结果名称发生冲突(因此不需要<code>listAllMatches</code>)。在</p>
<p>现在,您可以使用<code>scanString</code>处理输入,而不是<code>scanString</code>:</p>
<pre><code>print(OneOrMore(object_grammar).parseString(string).dump())
</code></pre>
<p>给予:</p>
<pre><code>[['object', 'obj1', [['attr1', 'value1'], ['object', 'obj2', [['attr2', 'value2']]]]], ['object', 'obj3', [['attr3', 'value3'], ['attr4', 'value4']]]]
[0]:
['object', 'obj1', [['attr1', 'value1'], ['object', 'obj2', [['attr2', 'value2']]]]]
- object_content: [['attr1', 'value1'], ['object', 'obj2', [['attr2', 'value2']]]]
[0]:
['attr1', 'value1']
- name: attr1
- value: value1
[1]:
['object', 'obj2', [['attr2', 'value2']]]
- object_content: [['attr2', 'value2']]
[0]:
['attr2', 'value2']
- name: attr2
- value: value2
- object_name: obj2
- object_name: obj1
[1]:
['object', 'obj3', [['attr3', 'value3'], ['attr4', 'value4']]]
- object_content: [['attr3', 'value3'], ['attr4', 'value4']]
[0]:
['attr3', 'value3']
- name: attr3
- value: value3
[1]:
['attr4', 'value4']
- name: attr4
- value: value4
- object_name: obj3
</code></pre>
<p>我开始只是对你的代码做一些简单的修改,但是你的原始代码有一个致命的缺陷。您的解析器将左大括号和右大括号分隔成两个单独的表达式—虽然这样“有效”,但它无法定义结果的组结构。在</p>