2017-07-31 145 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