我试图使用Pyparsing来解析aspatix(.apx)格式的文件(http://www.dbai.tuwien.ac.at/research/project/argumentation/systempage/docu.htm),我在将结果结构化到字典时遇到问题。在
我指定语法如下:
from pyparsing import *
ID = Word(alphanums)
arg_pair = Group(ID + Suppress(',') + ID)
value = Word(nums)
lineEnd = Suppress(').')
arg = Suppress('arg(') + ID + lineEnd
attack = Suppress('att(') + arg_pair + lineEnd
pref = Suppress('pref(') + arg_pair + lineEnd
val = Suppress('val(') + ID + Suppress(',') + value + lineEnd
valpref = Suppress('valpref(') + value + Suppress(',') + value + lineEnd
support = Suppress('support(') + arg_pair + lineEnd
apx = OneOrMore(arg.setName('arg') | attack.setName('att') | pref.setName('pref') | val.setName('val') | valpref.setName('valpref') | support.setName('support'))
我不确定如何使用setName()函数定义字典键,以便arg、attack等规则的每次出现都映射到定义的键。使用上面的代码不会产生可用的字典键。在
例如:
^{2}$将映射到:
{"arg": ["a","b"], "att":[["a","b"]]}
如果你能给我任何帮助,我将不胜感激。在
关于解析器的一些其他评论:
通常,您应该避免定义将关键字与相关标点符号相结合的文字。例如,将arg定义为
Suppress('arg(')
将专门查找“arg(”,如果关键字和左括号之间有空格,则失败。相反,我建议使用Keyword类定义关键字。如果您愿意,可以禁止这些,但是关键字将强制执行单词的完全匹配,并防止意外匹配“valpref”的前导“val”。将ID定义为
Word(alphanums)
将为ID和整数值之间的混淆打开大门。我希望标识符至少总是以字母字符开头,因此您可以使用Word的双参数形式将字母指定为允许的前导字符集,并将字母数字指定为允许的正文字符集。请参阅我对您帖子的评论:
setName()
vssetResultsName()
我稍微修改了一下解析器,使所有命令都有相同的键:“cmd”和“args”。这允许您编写多态代码,如本示例末尾的for循环。在
如果你想遵循你最初的命名计划,我想应该是这样的。在
^{pr2}$或者这个。在
正如您所看到的,有许多方法可以构造这些解析器和生成的解析结构,围绕个人风格以及正确与错误进行旋转。在最后两个示例中,没有定义“cmd”或“args”名称,因此必须从上面的for循环代码示例中删除它们。如果您正在寻找dict-key-like解析,我认为最后一个结构将最像您正在寻找的。但是,请注意,这个解析器将放弃命令的查找顺序。如果顺序很重要,您可能应该使用前两个示例中的一个,因为Group类将保持命令顺序不变。在
相关问题 更多 >
编程相关推荐