Как насчет использования какого-нибудь расширенного BNF?
PERSON <- { "firstname": FIRSTNAMES, "lastname": LASTNAME, "age": AGE, "version": VERSION, "parents" <- PARENTS }
FIRSTNAMES <- [ FIRSTNAME+ ]
FIRSTNAME <- STRING
LASTNAME <- STRING
PARENTS <- [ PERSON{0,2} ]
AGE <- INTEGER
VERSION <- 1 | 2
Вам нужно будет определить значение атомарных описаний типов, таких как INTEGER и STRING где-нибудь.Если бы вы хотели добавить не жестко закодированные ключи для словарей, вы бы определили это следующим образом:
BREADLOOKUP <- { (TYPE : HOWMANY)+ }
TYPE <- "white" | "dark" | "french" | "croissant"
HOWMANY <- POSITIVE-INTEGER
Это позволило бы такие вещи, как
{ "white": 5,
"french": 2
}
, поскольку и регулярные выражения, и BNF довольноХорошо известно, что это может быть простой путь.?
, +
, *
, {n}
, {min,max}
были бы простыми способами указать количество элементов (взятых из регулярных выражений), а остальное - в значительной степени чистый BNF.
ЕслиВы сделали это достаточно строго, это может даже быть разборчивым для валидатора.