Я бы просто использовал Python для формата файла определения сообщения.
Пусть ваш файл определения сообщения представляет собой обычный файл Python:
# file messages.py
messages = dict(
struct1=[
dict(field="name", type="string", ignore=False),
dict(field="id", type="int", enums={0: "val1", 1: "val2"}),
],
struct2=[
dict(field="object", type="struct1"),
]
)
Ваша программа может импортировать и использовать эту структуру данных напрямую:
# in your program
from messages import messages
print messages['struct1'][0]["type"]
print messages['struct1'][1]['type']
print messages['struct1'][1]['enums'][0]
print messages['struct2'][0]['type']
Используя этот подход, вы позволяете Python выполнять анализ за вас.
И вы также получаете много возможностей. Например, представьте, что у вас (по какой-то странной причине) есть структура сообщения с 1000 полями с именем «field_N». Используя обычный формат файла, вам нужно будет добавить 1000 строк определений полей (если вы не создадите какой-то цикл в вашем анализаторе конфигурационных файлов - вы все равно будете на пути к созданию языка программирования). Используя для этого Python, вы можете сделать что-то вроде:
messages = dict(
...
strange_msg=[dict(field="field_%d" % i) for i in range(1000)],
...
)
Кстати, в Python 2.6 использование именованных кортежей вместо dict является опцией. Или используйте один из многочисленных доступных классов «Связка» (см. Кулинарную книгу Python для именованного кортежа для 2.5).
EDIT:
Ниже приведен код, который читает файлы определения сообщений, как указано в командной строке. Он использует execfile
вместо import
.
# file mainprogram.py
def read_messages_from_file(filename):
module_dict = {}
execfile(filename, module_dict)
return module_dict['messages']
if __name__ == "__main__":
from pprint import pprint
import sys
for arg in sys.argv[1:]:
messages = read_messages_from_file(arg)
pprint(messages)
Выполнение:
$ python mainprogram.py messages1 messages2 messages3
будет читать и распечатывать сообщения, определенные в каждом файле.