Pyparsing: синтаксический анализ вложенных текстовых данных в формате JSON.

У меня есть куча вложенных данных в формате, который напоминает JSON:

company="My Company"
phone="555-5555"
people=
{
    person=
    {
        name="Bob"
        location="Seattle"
        settings=
        {
            size=1
            color="red"
        }
    }
    person=
    {
        name="Joe"
        location="Seattle"
        settings=
        {
            size=2
            color="blue"
        }
    }
}
places=
{
    ...
}

Существует много разных параметров с разными уровнями глубины - это всего лишь небольшое подмножество.

Также может стоить отметить, что при создании нового подмассива всегда есть знак равенства, за которым следует разрыв строки, за которым следует открывающая скобка (как видно выше).

Есть ли какой-нибудь простой метод зацикливания или рекурсии для преобразования этих данных в дружественный к системе формат данных, такой как массивы или JSON? Я хочу избежать жесткого кодирования названий свойств. Я ищу что-то, что будет работать на Python, Java или PHP. Псевдокод тоже подойдет.

Я ценю любую помощь.

РЕДАКТИРОВАТЬ: я обнаружил библиотеку Pyparsing для Python, и, похоже, это может быть очень полезно. Я могу'Не найти примеров использования Pyparsing для анализа вложенных структур неизвестной глубины. Может ли кто-нибудь пролить свет на Pyparsing с точки зрения данных, которые я описал выше?

РЕДАКТИРОВАТЬ 2: Хорошо, вот рабочее решение в Pyparsing:

def parse_file(fileName):

#get the input text file
file = open(fileName, "r")
inputText = file.read()

#define the elements of our data pattern
name = Word(alphas, alphanums+"_")
EQ,LBRACE,RBRACE = map(Suppress, "={}")
value = Forward() #this tells pyparsing that values can be recursive
entry = Group(name + EQ + value) #this is the basic name-value pair


#define data types that might be in the values
real = Regex(r"[+-]?\d+\.\d*").setParseAction(lambda x: float(x[0]))
integer = Regex(r"[+-]?\d+").setParseAction(lambda x: int(x[0]))
quotedString.setParseAction(removeQuotes)

#declare the overall structure of a nested data element
struct = Dict(LBRACE + ZeroOrMore(entry) + RBRACE) #we will turn the output into a Dictionary

#declare the types that might be contained in our data value - string, real, int, or the struct we declared
value < (quotedString | struct | real | integer)

#parse our input text and return it as a Dictionary
result = Dict(OneOrMore(entry)).parseString(inputText)
return result.dump()

Ответы на вопрос(5)

Ваш ответ на вопрос