Я изо всех сил пытаюсь разобрать вложенные структуры с помощью PyParsing. Я просмотрел множество "вложенных" примеров использования PyParsing, но не не вижу, как решить мою проблему.
Вот как выглядит моя внутренняя структура:
texture_unit optionalName
{
texture required_val
prop_name1 prop_val1
prop_name2 prop_val1
}
и вот как выглядит моя внешняя структура, но она может содержать ноль или более внутренних структур.
pass optionalName
{
prop_name1 prop_val1
prop_name2 prop_val1
texture_unit optionalName
{
// edit 2: showing use of '.' character in value
texture required_val.file.name optional_val // edit 1: forgot this line in initial post.
// edit 2: showing potentially multiple values
prop_name3 prop_val1 prop_val2
prop_name4 prop_val1
}
}
Я успешно разбираю внутреннюю структуру. Вот мой код для этого.
prop_ = pp.Group(pp.Word(pp.alphanums+'_')+pp.Group(pp.OneOrMore(pp.Word(pp.alphanums+'_'+'.'))))
texture_props_ = pp.Group(pp.Literal('texture') + pp.Word(pp.alphanums+'_'+'.')) + pp.ZeroOrMore(prop_)
texture_ = pp.Forward()
texture_ << pp.Literal('texture_unit').suppress() + pp.Optional(pp.Word(pp.alphanums+'_')).suppress() + pp.Literal('{').suppress() + texture_props_ + pp.Literal('}').suppress()
Вот моя попытка разобрать внешнюю структуру,
pass_props_ = pp.ZeroOrMore(prop_)
pass_ = pp.Forward()
pass_ << pp.Literal('pass').suppress() + pp.Optional(pp.Word(pp.alphanums+'_'+'.')).suppress() + pp.Literal('{').suppress() + pass_props_ + pp.ZeroOrMore(texture_) + pp.Literal('}').suppress()
Когда я говорю: pass_.parseString( testPassStr )
Я вижу ошибки в консоли, которые ожидались "}".
Я вижу, что это очень похоже на пример структуры C, но я не уверен, что отсутствует магия. Мне также любопытно, как управлять результирующей структурой данных при использовании nestedExpr.