2016-03-24 8 views
0

私はカスタムファイル構造化ファイルを解析するのに助けが必要です。あなたが見ることができるように、構造があります。問題は、構造を正しく解析することができないということです。つまり、同じグループ内で、たとえば別々にしたい場合は、myOriginalFormula & myBonusTypeです。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 
      } 
     } 
    } 
} 

私の試練は吹き荒れています。誰かが私にこの構造を正しく解析する手助けをすることができますか?

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 

答えて

0

valueのあなたの定義があまりにも貪欲です:

value = CharsNotIn("{};,") 

私は、これはあなたが解析しているフォーマットでどのように動作するかわからないが、私はこれで良い結果を得る:

value = quotedString | CharsNotIn("{};,\n") 
関連する問題