需要有关 Pyparsing about += symbol 的帮助

Need help about Pyparsing about += symbol

我们使用 pyparsing 作为通用配置文件解析器已有一段时间了。配置解析器的内部块看起来像这样:

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

使用 dictOf 和 delimitedList,我们最终得到相当于字典映射键(key1 和 key2)到相应的值标记列表。

最近,我希望扩展解析器以支持:

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

在此示例中,我希望生成的字典将 key1 映射到 [value1.1, value1.2, value1.3, value1.4, value1.5]。查看可用的 pyparsing 选项,我没有看到任何明确的方法来执行此操作。 Google 搜索似乎也没有找到任何结果。 (虽然我可能不知道为此使用哪个搜索词。)

有没有我缺少的钩子?我应该做一些 post 处理组合功能吗?谁能建议最好的 "pyparsing way" 方法是什么?

谢谢

Pyparsing 在这里失败了,因为你本质上是在向它抛出不同的语法。

开箱即用的 pyparsing 中没有任何东西可以处理这个问题,因此您需要推出自己的特殊版本的 Dict,它需要 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']}

如果您发现以后想要添加对 "key4 = key2 + key3" 或 "key4 += key2" 之类的支持,您将重新访问用于解析 key-value 对的表达式,然后扩展key_values 表达式和 assemble_dict 相应地解析操作。