首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OrderedDict代表节俭

OrderedDict代表节俭
EN

Stack Overflow用户
提问于 2015-04-15 01:51:01
回答 1查看 194关注 0票数 1

我正在使用parsimonious来解析一些csv。我的问题是生成的输出没有按照预期的顺序输出。例如,如果输入字符串是

代码语言:javascript
复制
Load,File,Sample 

然后我希望得到:

代码语言:javascript
复制
import database from Sample

相反,我得到的是:

代码语言:javascript
复制
from Sample import database

对于我尝试的每个输入,这都是一个始终如一的问题:第一个令牌是条目OrderedDict中的最后一项,但我不知道为什么。

下面是我的代码:

代码语言:javascript
复制
from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
from collections import OrderedDict

class EntryParser(NodeVisitor):
    def __init__(self, grammar, text):
        self.entry = OrderedDict()
        ast = Grammar(grammar).parse(text)
        self.visit(ast)
    def visit_alt(self, n, vc):
        self.entry['alt'] = "alter "
    def visit_load(self, n, vc):
        self.entry['load'] = "import database "
    def visit_app(self, n, vc):
        self.entry['app'] = "application "
    def visit_db(self, n, vc):
        self.entry['db'] = "database "
    def visit_filter(self, n, vc):
        self.entry['filter'] = "filter "
    def visit_group(self, n, vc):
        self.entry['group'] = "group "
    def visit_obj(self, n, vc):
        self.entry['obj'] = "object "
    def visit_trigger(self, n, vc):
        self.entry['trigger'] = "trigger "
    def visit_user(self, n, vc):
        self.entry['user'] = "user "
    def visit_sql(self, n, vc):
        self.entry['sql'] = "connect as "
    def visit_file(self, n, vc):
        self.entry['file'] = "from "
    def visit_dbname(self, n, vc):
        self.entry['dbname'] = n.text + " "
    def generic_visit(self, n, vc):
        pass

grammar = """\
ts0 = alt / load
sep = ","
alt = "Alt" sep altdomain
altdomain = app / db / filter / group / obj / trigger / user
load = "Load" sep loaddomain
loaddomain = (sql / file) sep dbname
sql = "SQL"
file = "File"
app = "App"
db = "DB"
filter = "Filter"
group = "Group"
obj = "Object"
trigger = "Trigger"
user = "User"
dbname = ~"[A-z]+"
"""

text = """\
Alt,Filter
Alt,App
Alt,DB
Alt,Group,
Alt,Object
Alt,Trigger
Alt,User
Load,SQL,Sample
Load,File,Sample
"""

for line in text.splitlines():
    for v in EntryParser(grammar, line).entry.values():
        print(v, end="")
    print('\n')
EN

回答 1

Stack Overflow用户

发布于 2015-04-15 02:02:18

我认为是OrderedDict造成了问题。只需使用常规字典而不是{}。

基本上将self.entry = OrderedDict()更改为self.entry = {}

同样,基于语法的解析工作方式,首先将匹配最里面的元素,然后它将移动到外部匹配的规则(根据返回值)。

因此,为了获得正确的顺序,您必须使用堆栈(或使用常规列表并颠倒数组)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29634153

复制
相关文章

相似问题

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