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ツリー全体を解析します。

これは so の使い方をindentedBlock示しています。簡潔に言うと、ツリーの外側にコメントを入れることはできず、ルート要素を 1 つしか受け付けません (XML の問題ではありません...)。

About indentStack: 現在のインデント レベル数のリストを保持し、リストの最後の要素は現在のインデント列を示します。ドキュメントが指摘しているように、インデントを使用してネストされたブロックを持つ文法のすべてのステートメントは、同じリストを共有する必要があります。1 つしかないので、 への呼び出しで直接作成しましたindentedBlock

読者の演習として、結果を XML に変換したままにします :-P

于 2014-01-29T16:31:56.163 に答える