Pyparsing中具有相同名称的多个标记

2024-04-27 04:40:38 发布

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

我正在编写一个解析器来检查另一种脚本语言的有效性。解析本身正在按预期工作,但是我无法访问某些结果,尽管我可以看到解析器捕捉到了它们。在

function = Forward()
arg = function | condition | constant | attribute | variable
args = delimitedList(arg)
function <<= (functor("FUNCTOR") + lparen + Optional(args)("ARGS") + rparen)("FUNCTION")

我给它:

^{pr2}$

结果表明,它已经捕获并识别了函数中的variable和{}字段。在

在交互式提示中输入r.ARGS可以得到:

   (['@dec64', 'AES', '@empty', '@PASSWORD', '@empty', '0000000000000000', '@empty', '00000000000000000000000000000000'], {'VAR': ['@dec64', '@empty', '@PASSWORD', '@empty', '@empty'], 'STRING': ['AES', '0000000000000000', '00000000000000000000000000000000']}) 

我想访问VAR部分来验证变量是否已经声明(这个部分还不存在)

但是,如果我访问r.ARGS.VAR属性,我只得到列表中的最后一个元素。在

r.asList()r.asDict()这样的函数有相同的结果;我只得到VARSTRING中的最后一个元素。在

奇怪的是,r.asXML()函数确实提供了我想要的输出(每个变量或字符串都在它自己的元素中),但是这个解决方案似乎太老套了。深入研究pyparsing的代码,我发现这三个函数都使用__toklist来提取值,但是我自己访问它只会给我一个空字符串,即使我在r的子ParseResults实例上尝试过。在

必须有一种方法来访问VAR中的所有元素,因为对象显然是在存储和使用它们,但我找不到一种干净的方法来完成它。理想情况下,我会把它们都列在一个列表中,比如:

['@dec64', '@empty', '@PASSWORD', '@empty', '@empty']

r.dump()也显示了我想要的字段,但是在一个字符串中,这违背了使用解析器的全部目的。在


Tags: 函数字符串解析器元素stringvarargargs