10

我正在尝试indentedBlock在 pyparsing 中使用(这对我来说看起来很棒)来剖析一些嵌套缩进,但是在理解 API 参考中的描述(或者http://pyparsing.wikispaces.com下的更具体示例或How do I parse indents and dedents with pyparsing? 中提到的。

有人可以指点我一个关于如何indentedBlock递归使用的简明演示或解释,或者在这里提供一个吗?例如,我们如何转换 YAMLish 之类的东西......

- a1_el
    - b1_el
        x1_attr: 1
        x2_attr: 2
    - b2_el
        - c1_el # I am a comment
    - b3_el
        x1_attr: 1 

...进入一些 XML 表示,例如 ...

<a1_el>
    <b1_el x1_attr="1" x2_attr="2"/>
    <b2_el>
        <c1_el/><!-- I am a comment -->
    </b2_el>
    <b3_el x1_attr="1"/>
</a1_el>

...与indentedBlock?(另外:在什么实际情况下我需要indentStack参数的不同选项?)。非常感谢!

4

1 回答 1

6

这有点旧,但这是部分答案:

from pyparsing import *

COMMENT   = pythonStyleComment
OPCOMMENT = Optional(COMMENT)
IDENT     = Word(alphas, alphanums + '_')

attribute    = IDENT + Suppress(':') + Word(alphanums) + OPCOMMENT
element      = Suppress('-') + IDENT + OPCOMMENT
elementBlock = Forward()
blockContent = attribute|elementBlock|COMMENT
elementBlock << element + Optional(indentedBlock(blockContent, [1]))

我假设元素可以包含任意顺序的属性和元素。elementBlock将解析整棵树。

它展示了indentedBlockso 的使用,为了简短起见,它不允许在树外添加注释,并且它只接受一个根元素(对于 XML 来说不是问题......)

About indentStack:它保留当前缩进级别数的列表,列表的最后一个元素显示当前缩进列。正如文档所指出的,使用缩进嵌套块的语法上的所有语句都应该共享相同的列表。因为只有一个,所以我直接在调用indentedBlock.

我将结果转换为 XML 作为读者的练习:-P

于 2014-01-29T16:31:56.163 回答