需要有关 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
相应地解析操作。
我们使用 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
相应地解析操作。