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
表達式和解析操作。
這正是我所需要的。非常感謝你的回覆。 – user8393708