pyparsing:字典列表语法(erlang)

2024-06-07 03:06:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图构建一个语法来解析一个带有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不能解析为两个列表。在

有什么想法吗?在

编辑:对测试用例进行了调整,使其对预期输出更加明确。在


Tags: 列表foo语法bazdumpdictworkingerlang
2条回答

我不明白它为什么不起作用,因为您的代码看起来非常像JSON example,它可以很好地处理嵌套列表。在

但问题似乎发生在这条线上

erlangElements = delimitedList( erlangValue )

如果erlangValue是列表,它们将被追加而不是cons'd

^{pr2}$

这会在最上面的元素周围添加一个额外的列表层,但不会合并子列表。在

好的,我以前从未使用过pyparsing,所以如果我的解决方案没有意义,请原谅。开始吧:

据我所知,你需要的是三个主要结构。最常见的错误是对分隔列表进行分组。它们已经被分组了,因此出现了双重分组的问题。以下是我的定义:

对于{a,“b”}:

erlangTaggedTuple = Dict(Group(Suppress('{') + erlangAtom + Suppress(',') + erlangValue + Suppress('}') ))

对于[{a,“b”},{c,“d”}]:

^{pr2}$

其余的:

erlangList <<= Suppress('[') + delimitedList( Group(erlangDict|erlangList) ) + Suppress(']')

所以我对你的代码的修正是:

#!/usr/bin/env python2.7

from pyparsing import *

# Erlang config file definition:
erlangAtom = Word( alphas + '_')
erlangString = dblQuotedString.setParseAction( removeQuotes )

erlangValue = Forward()
erlangList = Forward()

erlangTaggedTuple = Dict(Group(Suppress('{') + erlangAtom + Suppress(',') +
                           erlangValue + Suppress('}') ))
erlangDict = Suppress('[') + delimitedList( erlangTaggedTuple ) + Suppress(']') 
erlangList <<= Suppress('[') + delimitedList( Group(erlangDict|erlangList) ) + 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()

其输出:

[['foo', 'bar'], ['baz', 'bar2']]
- baz: bar2
- foo: bar
b[0]: [['foo', 'bar'], ['baz', 'bar2']]
- baz: bar2
- foo: bar
b[1]: [['foo', 'bob'], ['baz', 'fez']]
- baz: fez
- foo: bob

希望有帮助,干杯!在

相关问题 更多 >