2016-03-24 11 views
0

Özel dosya yapılandırılmış bir dosyayı ayrıştırma konusunda yardıma ihtiyacım var. Aşağıda görebileceğiniz gibi yapıdır. Sorun şu ki, örneğin ayırmak istediğimde, yapıyı doğru bir şekilde ayrıştıramayacağım, yani myOriginalFormula & myBonusType aynı grupta.PyParsing ile özel yapılandırılmış dosya ayrıştırma

AttributeDictionary SomeDictName 
{ 
    myAttributeDefinitionCategories 
    { 
     AttributeDefinitionList SomeList 
     { 
      AttributeDefinition SomeDefinitioName <uid=8972789HHDUAI7> 
      { 
       myOriginalFormula "(A_Variable) * 10" 
       myBonusType FlatValue 
      } 
      AttributeDefinition UIBlankAttribute <uid=JIAIODJ7899> 
      { 
      } 
      AttributeDefinition SomeOtherDefinitionName <uid=17837HHJAJ7788> 
      { 
       myOriginalFormula 1 
       mySpecializations 
       { 
        Specialization "Some_Specialization 1" 
        { 
         myCondition "Something.MustEqual = 1" 
         myFormula 0 
        } 
        Specialization "SomeSpecialization 2" 
        { 
         myCondition "Something.MustEqual = 2" 
         myFormula 0.026 
        } 

       } 
       myBonusType FlatValue 
      } 
      AttributeDefinition SomeReal_Other_definition < uid=6768GYAG//() > 
      { 
       myOriginalFormula "(Some_Formula/Other_Variable) - 1" 
       myBonusType Percentage 
       myUINumDecimals 1 
       myHasAddSignUI FALSE 
      } 
     } 
    } 
} 

Denemem darbedir. Birisi bu yapıyı doğru şekilde bölmeme yardımcı olabilir mi?

def syntaxParser(): 

    # constants 
    left_bracket = Literal("{").suppress() 
    right_bracket = Literal("}").suppress() 
    semicolon = Literal(";").suppress() 
    space = White().suppress() 
    key = Word(alphanums + '_/"') 
    value = CharsNotIn("{};,") 

    # rules 
    assignment = Group(key + Optional(space + value)) 
    block = Forward() 
    specialblock = Forward() 
    subblock = ZeroOrMore(Group(assignment) | specialblock) 
    specialblock = (
     Keyword("Specialization") 
     + key 
     + left_bracket 
     + subblock 
     + right_bracket) 

    block << Group(
     Optional(Group(key + Optional(space + value))) 
     + left_bracket 
     + Group(ZeroOrMore(assignment | Group(block) | Group(specialblock))) 
     + right_bracket) 

    script = block 

    return script 

cevap

0

value Sizin tanımı çok açgözlü: bu ayrıştırma formatı ile nasıl çalıştığını

value = CharsNotIn("{};,") 

Bilmiyorum, ama bu daha iyi sonuçlar elde:

value = quotedString | CharsNotIn("{};,\n") 
İlgili konular