2017-07-31 24 views
0

私たちはしばらくの間、一般的な設定ファイルパーサーにpyparsingを使用してきました。コンフィグパーサの内部ブロックは、このような何かを見て:dictOfとdelimitedListを使用してPyparsingについての助けが必要+記号=

{ 
key1 = [ value1.1, value1.2, value1.3 ]; 
key2 = [ value2.1, value2.2, value2.3 ]; 
} 

を、我々は値トークンの対応するリストにマッピングする辞書キー(KEY1とKEY2)の同等で終わります。

最近、私がサポートするために、パーサーを拡張するために期待していた。

{ 
key1 = [ value1.1, value1.2, value1.3 ]; 
key1 += [ value1.4, value1.5 ]; 
key2 = [ value2.1, value2.2, value2.3 ]; 
} 

をこの例では、私は結果のdictは[value1.1、value1.2、value1.3、VALUE1にKEY1をマップしたいです.4、値1.5]。利用できるpyparsingオプションを見て、私はこれを行う明確な方法を見ていませんでした。 Googleの検索でも何も表示されませんでした。 (可能性はありますが、これに使用する検索語はわかりませんでしたが)

私は行方不明のフックがありますか?いくつかの後処理が私がやっているはずの機能を結合していますか?誰かがこれに近づく最高の "pyparsing way"を提案することができますか?あなたは、本質的にそれで別の文法を投げているのでPyparsingが、この時に吹くまで

答えて

0

感謝。

pyparsingには何もありませんすぐにあなたがkey_expr '=' value_expr ';'ラインを取るとkey_expr '+=' value_expr ';'は、以前に定義されたキーを変更することを意図していることを理解することをDictの独自の特別なバージョンをロールバックする必要がありますので、これを処理します。 pyparsingでは、定義と更新を含むZeroOrMore式全体に添付された解析アクションを使用してこれを行います。

import pyparsing as pp 

LBRACE,RBRACE,LBRACK,RBRACK,SEMI = map(pp.Suppress, "{}[];") 
key_expr = pp.Word(pp.alphas, pp.alphanums) 
value_atom = pp.Word(pp.alphas, pp.alphanums + '._') 
value_list = LBRACK + pp.delimitedList(value_atom) + RBRACK 

key_defn = pp.Group(key_expr("key") + '=' + value_list("value") + SEMI) 
key_update = pp.Group(key_expr("key") + '+=' + value_list("value") + SEMI) 

# using the trailing '*' will support saving multiple expressions under the same results name 
# in this case, it will sort out the "x = []" definitions vs "x += []" updates 
key_values = pp.ZeroOrMore(key_defn("defns*") | key_update("updates*")) 

# parse action to build a dict beginning with all definitions, and then 
# adding updates 
def assemble_dict(t): 
    ret = {kv.key: kv.value.asList() for kv in t.defns} 
    for kv in t.updates: 
     ret[kv.key] += kv.value.asList() 
    return ret 
key_values.addParseAction(assemble_dict) 

kv_expr = LBRACE + key_values("vars") + RBRACE 

test = """ 
{ 
key1 = [ value1.1, value1.2, value1.3 ]; 
key1 += [ value1.4, value1.5 ]; 
key2 = [ value2.1, value2.2, value2.3 ]; 
} 
""" 

print(kv_expr.parseString(test).dump()) 

プリント:

[{'key1': ['value1.1', 'value1.2', 'value1.3', 'value1.4', 'value1.5'], 'key2': ['value2.1', 'value2.2', 'value2.3']}] 
- vars: {'key1': ['value1.1', 'value1.2', 'value1.3', 'value1.4', 'value1.5'], 'key2': ['value2.1', 'value2.2', 'value2.3']} 

あなたが後で「KEY4 =キー2 + KEY3」または「KEY4 + =キー2」のようなもののためのサポートを追加することを見つけた場合、あなたが使用される式を再訪しますkey-valueのペアを解析し、それに応じてkey_values式と​​の解析アクションを拡張します。

+0

これは私が必要としていたものです。あなたのお返事ありがとうございました。 – user8393708

関連する問題