我正在尝试在pyparsing中使用indentedBlock(对我来说真棒)剖析一些嵌套的缩进,但是在理解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参数使用不同的otpions吗?)。非常感谢!

最佳答案

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

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将解析整个树。

它展示了indentedBlock的用法,简而言之,它不允许在树外进行注释,并且它将仅接受一个根元素(对于XML而言不是问题...)

关于indentStack:保留当前缩进级别数的列表,列表的最后一个元素显示当前缩进列。正如文档所指出的那样,语法上带有缩进嵌套块的所有语句应共享同一列表。因为只有一个,所以我只是在对indentedBlock的调用中直接创建了它。

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

关于python - 递归使用pyparsing的indentedBlock的简单演示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15418379/

10-11 07:39