我试图构建一个语法来解析一个带有Erlang标记的元组列表,并将其映射到pyparsing中的Dict。当我有一份口述清单时,我就有问题了。如果Dict只有一个元素,那么语法就可以工作,但是当我添加第二个元素时,现在无法让它解析。在
当前(简化语法代码(我删除了本例中不需要的语言部分):
#!/usr/bin/env python2.7
from pyparsing import *
# Erlang config file definition:
erlangAtom = Word( alphas + '_')
erlangString = dblQuotedString.setParseAction( removeQuotes )
erlangValue = Forward()
erlangList = Forward()
erlangElements = delimitedList( erlangValue )
erlangCSList = Suppress('[') + erlangElements + Suppress(']')
erlangList <<= Group( erlangCSList )
erlangTaggedTuple = Group( Suppress('{') + erlangAtom + Suppress(',') +
erlangValue + Suppress('}') )
erlangDict = Dict( Suppress('[') + delimitedList( erlangTaggedTuple ) +
Suppress(']') )
erlangValue <<= ( erlangAtom | erlangString |
erlangTaggedTuple |
erlangDict | erlangList )
if __name__ == "__main__":
working = """
[{foo,"bar"}, {baz, "bar2"}]
"""
broken = """
[
[{foo,"bar"}, {baz, "bar2"}],
[{foo,"bob"}, {baz, "fez"}]
]
"""
w = erlangValue.parseString(working)
print w.dump()
b = erlangValue.parseString(broken)
print "b[0]:", b[0].dump()
print "b[1]:", b[1].dump()
这样可以得到:
^{pr2}$也就是说,working
可以工作,但是broken
不能解析为两个列表。在
有什么想法吗?在
编辑:对测试用例进行了调整,使其对预期输出更加明确。在
我不明白它为什么不起作用,因为您的代码看起来非常像JSON example,它可以很好地处理嵌套列表。在
但问题似乎发生在这条线上
如果
^{pr2}$erlangValue
是列表,它们将被追加而不是cons'd这会在最上面的元素周围添加一个额外的列表层,但不会合并子列表。在
好的,我以前从未使用过pyparsing,所以如果我的解决方案没有意义,请原谅。开始吧:
据我所知,你需要的是三个主要结构。最常见的错误是对分隔列表进行分组。它们已经被分组了,因此出现了双重分组的问题。以下是我的定义:
对于{a,“b”}:
对于[{a,“b”},{c,“d”}]:
^{pr2}$其余的:
所以我对你的代码的修正是:
其输出:
希望有帮助,干杯!在
相关问题 更多 >
编程相关推荐