2

この気の利いたライブラリを使用して BigIP 構成ファイルを解析する方法を見つけようとしています...文法は次のようになります。

stanza :: name { content }
name   :: several words, might contain alphas nums dot dash underscore or slash
content:: stanza OR ZeroOrMore(printable characters)

もう少し複雑にするために、1 つの例外があります。

名前が「ルール」で始まる場合、内容を「スタンザ」にすることはできません

私はこれから始めました:

from pyparsing import *
def parse(config):
    def BNF():
        """
        Example:
        ...
        ltm virtual /Common/vdi.uis.test.com_80_vs {
            destination /Common/1.2.3.4:80
            http-class {
                /Common/http2https
            }
            ip-protocol tcp
            mask 255.255.255.255
            profiles {
                /Common/http { }
                /Common/tcp { }
            }
            vlans-disabled
        }
        ...
        """        
        lcb, rcb, slash, dot, underscore, dash = [c for c in '{}/._-']
        name_word = Word(alphas + nums + dot + underscore + slash + dash)
        name = OneOrMore(name_word).setResultsName("name")
        stanza = Forward()
        content = OneOrMore(stanza | ZeroOrMore(OneOrMore(Word(printables)))).setResultsName("content")
        stanza << Group(name + lcb + content + rcb).setResultsName("stanza")
        return stanza


    return [x for x in BNF().scanString(config)]

上記のコードは、いくつかの無限ループでロックアップしているようです。また、「name」が「rule」で始まる場合に「stanza」を探すことを除外するという私の要件もありません。

4

1 に答える 1