2017-07-31 78 views
0

我們一直在使用pyparsing進行通用配置文件解析器一段時間。的配置解析器是這個樣子的內部塊:需要Pyparsing關於+ =符號的幫助

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

使用dictOf和delimitedList,我們結束了一個字典映射鍵(鍵1和鍵2)價值代幣的相應列表的等價物。

最近,我希望能延長分析器支持:

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

在這個例子中,我希望得到的字典映射鍵1 [value1.1,value1.2,value1.3,值1 .4,value1.5]。看看可用的pyparsing選項,我沒有看到任何明確的方法來做到這一點。谷歌搜索似乎也沒有發現任何東西。 (雖然有可能我不知道使用哪個搜索詞。)

有沒有一些鉤子,我失蹤了?是否有一些後期處理組合功能,我應該做的?任何人都可以建議什麼是最好的「pyparsing方式」接近這將是?

感謝

回答

0

Pyparsing這打擊了,因爲你基本上是在它扔了不同的語法。

中沒有任何pyparsing外的開箱即會處理這個問題,所以您將需要推出快譯通的自己的特殊版本,將採取key_expr '=' value_expr ';'線和理解是key_expr '+=' value_expr ';'旨在修改先前定義的關鍵。在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']} 

如果你發現你以後要添加的東西像「鍵4 =鍵2 + KEY3」或「鍵4 + =鍵2」中,你將重新使用表達式的支持解析key-value對,然後相應地擴展key_values表達式和​​解析操作。

+0

這正是我所需要的。非常感謝你的回覆。 – user8393708