У меня есть следующие данные:Как я могу выразить этот формат в EBNF?
dbCon= {
main = {
database = "db1",
hostname = "db1.serv.com",
maxConnCount = "5",
port = "3306",
slaves = [
{
charset = "utf8",
client = "MYSQL",
compression = "true",
database = "db1_a",
hostname = "db1-a.serv.com",
maxConnCount = "5",
port = "3306",
}
{
charset = "utf8",
client = "MYSQL",
compression = "true",
database = "db1_b",
hostname = "db1-b.serv.com",
maxConnCount = "5",
port = "3306",
}
]
username = "user-1"
}
}
Я пытаюсь использовать Grako, чтобы преобразовать это в JSON, но я не могу получить формат EBNF правильно. Вот что у меня есть:
import grako
import json
grammar_ebnf = """
final = @:({ any } | { bracketed } | { braced });
braced = '{' @:({ bracketed } | { braced } | { any }) '}' ;
bracketed = '[' @:({ braced } | { bracketed } | { any }) ']' ;
any = /^[^\[\{\]\}\n]+/ ;
"""
model = grako.genmodel("final", grammar_ebnf)
with open('out.txt') as f:
ast = model.parse(f.read())
print (json.dumps(ast, indent = 4))
Однако, это просто печатает:
[
"dbCon = "
]
Где я буду неправильно? Я никогда не использовал Грако. Я просто хочу иметь возможность разбирать это во что-то полезное/доступное, не создавая статический парсер в случае изменения формата. Если формат меняется позже, кажется, проще обновить EBNF, а не перерабатывать весь парсер.
Перекрестная отвечал: http://cs.stackexchange.com/questions/43060/how-can-i-represent-this-in-ebnf. –
ну, ваша грамматика кажется неправильной ... но я предполагаю, что вы это уже знаете;) Некоторые вещи, которые я заметил: Нигде в вашей грамматике не появился токен для '=', который является фундаментальной частью вашего ввода. Я бы попытался добавить правило для пары ключ = значение. Я подумаю об этом чуть больше завтра. – PeterE
Вам нужно использовать grako? Или вы просто хотите преобразовать это в JSON в Python? – paulotorrens