pyparsing:字典列表的语法(erlang)

戴夫

我正在尝试建立一种语法来解析带有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()

这给出:

[['foo', 'bar'], ['baz', 'bar2']]
- baz: bar2
- foo: bar

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

b[1]:
Traceback (most recent call last):
  File "./erl_testcase.py", line 39, in <module>
    print "b[1]:", b[1].dump()
  File "/Library/Python/2.7/site-packages/pyparsing.py", line 317, in __getitem__
    return self.__toklist[i]
IndexError: list index out of range

working工作,但broken不能解析为两个列表。

有任何想法吗?

编辑:调整了测试用例以更明确地显示预期的输出。

用户名

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

据我了解,您需要的是三个主要结构。您最常犯的错误是对delimitedLists进行分组。它们已经被分组,因此您遇到了双重分组的问题。这是我的定义:

对于{a,“ b”}:

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

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

erlangDict = Suppress('[') + delimitedList( erlangTaggedTuple ) + Suppress(']')

对于其余的:

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

希望能有所帮助,加油!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Pyparsing-递归语法

来自分类Dev

Pyparsing中的递归语法

来自分类Dev

pyparsing的嵌套字典输出

来自分类Dev

在逗号分隔列表中pyparsing递归语法空间分隔列表

来自分类Dev

pyparsing:示例JSON解析器无法获取字典列表

来自分类Dev

pyparsing的Markdown语法,获取正确的空格

来自分类Dev

将BNF语法转换为pyparsing

来自分类Dev

需要在pyParsing语法中保留注释

来自分类Dev

Pyparsing 二维列表

来自分类常见问题

YAML中空字典的语法

来自分类Dev

函数字典的语法?

来自分类Dev

字典与嵌套字典的列表

来自分类Dev

字典列表中的字典

来自分类Dev

从字典创建字典列表

来自分类Dev

Erlang记录单引号的语法

来自分类Dev

Erlang中的语法错误

来自分类Dev

Erlang记录单引号的语法

来自分类Dev

用嵌套列表作为值填充字典的正确语法是什么?

来自分类Dev

尝试输出字典或列表值时显示语法错误

来自分类Dev

Erlang数组与列表

来自分类Dev

Erlang练习,创建列表

来自分类Dev

从erlang列表中配对

来自分类Dev

Erlang列表元组匹配

来自分类Dev

每个列表的Erlang

来自分类Dev

pyparsing值列表的递归(ibm rhapsody)

来自分类Dev

如何使用pyparsing验证布尔表达式语法?

来自分类Dev

PyParsing嵌套语法不符合预期

来自分类Dev

PyParsing-在其他元素周围拆分的语法元素

来自分类Dev

PyParsing-在其他元素周围拆分的语法元素