2016-03-24 8 views
0

Ich brauche Hilfe beim Parsen einer benutzerdefinierten Datei strukturierte Datei. Wie Sie unten sehen können, ist die Struktur. Das Problem ist, dass ich nicht scheinen kann, die Struktur korrekt zu analysieren, nämlich myOriginalFormula & myBonusType in der gleichen Gruppe, wenn ich sie zum Beispiel getrennt haben möchte.Parsing benutzerdefinierte strukturierte Datei mit PyParsing

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 
      } 
     } 
    } 
} 

Mein Versuch ist Schlag. Könnte mir jemand helfen, diese Struktur korrekt zu analysieren?

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 

Antwort

0

Deine Definition von value ist zu gierig:

value = CharsNotIn("{};,") 

Ich weiß nicht, wie das mit dem Format arbeitet Sie parsen, aber ich bessere Ergebnisse dieses:

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