1

私はparsimoniousいくつかを解析するために使用していcsvます。私の問題は、生成された出力が期待どおりに出力されないことです。たとえば、入力文字列が

Load,File,Sample 

それから私は得ることを期待します:

import database from Sample

代わりに得られるものは次のとおりです。

from Sample import database

これは、試行するすべての入力で一貫した問題です。最初のトークンはエントリ OrderedDict の最後の項目ですが、その理由がわかりません。

これが私のコードです:

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')
4

1 に答える 1

0

OrderedDict が問題を引き起こしていると思います。{} の代わりに通常の辞書を使用してください。

基本的self.entry = OrderedDict()にはself.entry = {}

また、文法ベースの解析が機能する方法では、最初に最も内側の要素が一致し、次に一致した外側のルールに向かって移動します (値を返すという点で)。

したがって、適切な順序を正しく取得するには、スタックを使用する必要があります (または、通常のリストを使用して配列を逆にする必要があります)。

于 2015-04-14T18:02:17.547 に答える