首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用EBNF表示这种格式?

如何用EBNF表示这种格式?
EN

Stack Overflow用户
提问于 2015-05-28 19:31:18
回答 1查看 674关注 0票数 1

我有以下数据:

代码语言:javascript
复制
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格式。我现在拥有的是:

代码语言:javascript
复制
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))

然而,这只是打印出来:

代码语言:javascript
复制
[
    "dbCon = "
]

我哪里出问题了?我从没用过Grako。我只希望能够将其解析为一些可用/可访问的东西,而无需设计静态解析器,以防格式发生变化。如果格式稍后更改,则更新EBNF似乎更容易,而不是重新处理整个解析器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-31 05:36:03

仅举一个例子就很难确定真正的语法是什么,但希望这足以让您完成对语法的调整,以处理任何奇怪之处。

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

作为一种建议,当在语法中命名规则时,用它们是什么(列表、数据等)来命名它们,而不是它们看起来的样子(括号内)。另外,首先要把事情分成很多规则。你以后总是可以把它们结合在一起。

代码语言:javascript
复制
#!/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)

这产生了下列产出:

代码语言:javascript
复制
{
    "dbCon": {
        "main": {
            "username": "user-1",
            "maxConnCount": "5",
            "slaves": [
                {
                    "maxConnCount": "5",
                    "hostname": "db1-a.serv.com",
                    "compression": "true",
                    "database": "db1_a",
                    "charset": "utf8",
                    "port": "3306",
                    "client": "MYSQL"
                },
                {
                    "maxConnCount": "5",
                    "hostname": "db1-b.serv.com",
                    "compression": "true",
                    "database": "db1_b",
                    "charset": "utf8",
                    "port": "3306",
                    "client": "MYSQL"
                }
            ],
            "database": "db1",
            "hostname": "db1.serv.com",
            "port": "3306"
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30515563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档