如何用EBNF表示这种格式?

2024-09-27 00:20:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据:

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格式。以下是我所拥有的:

^{pr2}$

但是,这只是打印出:

[
    "dbCon = "
]

我哪里出错了?我从没用过格拉科。我只希望能够将其解析为可用/可访问的内容,而无需设计静态解析器以防格式更改。如果以后格式发生更改,那么更新EBNF似乎比重写整个解析器更容易。在


Tags: comclienttrueport格式mysqlutf8database
1条回答
网友
1楼 · 发布于 2024-09-27 00:20:52

仅仅用一个例子很难确定真正的语法是什么,但希望这已经足够了,你可以完成对它的修改,以处理任何奇怪的事情。在

我们需要Semantics类来处理将键/值对及其列表转换为字典的问题。小心使用@:否则就可以了。在

作为一个建议,当在语法中命名规则时,用它们的名称(list、dict等)而不是它们的样子(用括号括起来)。另外,先把事情分成许多规则。你可以以后再合并它们。在

#!/usr/bin/python

import grako
import json

grammar = """
final = kvpair;
kvpair = key '=' value;
key = /[^\s=]+/;
value = @:(dict | list | string) [','];
list = '[' @:{ value } ']';
string = '"' @:/[^"]*/ '"';
dict = '{' @:{ kvpair } '}';
"""

class Semantics(object):
    def kvpair(self, arg):
        key, ignore, value = arg
        return { key: value }
    def dict(self, arg):
        d = { }
        for v in arg:
            d.update(v)
        return d

model = grako.genmodel("final", grammar)

with open('out.txt') as f:
    ast = model.parse(f.read(), semantics=Semantics())
    print json.dumps(ast, indent=4)

这将产生以下输出:

^{pr2}$

相关问题 更多 >

    热门问题