我试图indentedBlock在pyparsing中使用(对我来说看起来很棒)来剖析一些嵌套的缩进,但是我在API参考中理解它的描述(或http://pyparsing.wikispaces.com下的更具体的例子)或提到如何用pyparsing解析缩进和dedents?).
有人可以指点我简要演示或解释如何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
Run Code Online (Sandbox Code Playgroud)
...进入一些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>
Run Code Online (Sandbox Code Playgroud)
......跟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]))
Run Code Online (Sandbox Code Playgroud)
我假设元素可以包含任意顺序的属性和元素.elementBlock将解析整棵树.
它展示了使用indentedBlockso,为了简化它,它不允许树外的注释,它只接受一个根元素(对于XML来说不是问题......)
关于indentStack:它保留当前缩进级别数的列表,列表的最后一个元素显示当前缩进列.正如文档所指出的那样,使用缩进的嵌套块的语法上的所有语句都应该共享相同的列表.由于只有一个,我刚刚在电话会议中直接创建了它indentedBlock.
我将结果转换为XML作为读者的练习:-P