Python pyparsing中具有相同名称的多个令牌

Python pyparsing中具有相同名称的多个令牌,python,pyparsing,Python,Pyparsing,我正在编写一个解析器来检查另一种脚本语言的有效性。解析本身正在按预期工作,但是我无法访问某些结果,即使我可以看到解析器已经捕获了它们 function = Forward() arg = function | condition | constant | attribute | variable args = delimitedList(arg) function <<= (functor("FUNCTOR") + lparen + Optional(args)("ARGS") +

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

function = Forward()
arg = function | condition | constant | attribute | variable
args = delimitedList(arg)
function <<= (functor("FUNCTOR") + lparen + Optional(args)("ARGS") + rparen)("FUNCTION")
结果表明,它捕获并识别了函数中的
变量
常量
字段

在交互式提示符中输入
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()
这样的函数具有相同的结果;我只获取
VAR
STRING
中的最后一个元素

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

必须有一种方法来访问
VAR
中的所有元素,因为对象显然正在存储和使用它们,但我找不到一种干净的方法来实现。理想情况下,我会将它们全部放回列表中,如:

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

r.dump()
也会显示我想要的字段,但字符串的形式违背了使用解析器的全部目的。

尝试将
Optional(args)(“args”)更改为
Group(Optional(args))(“args”)
谢谢Paul,但我得到了同样的结果。我觉得
\uu toklist
是解决这个问题的关键,但我不知道它是如何工作的。对不起,我误解了你的问题。定义VAR结果名称时,必须启用
listAllMatches
标志。如果显式调用
setResultsName
,则这是一个可选的关键字arg。如果使用
expr(name)
快捷方式,则在名称后面附加一个“*”,
variable=Word(“@”,alphanums)(“VAR*”)
。一般来说,我建议将这些结果名称定义进一步向下移动到解析器中,因为
variable
可能在语法中的其他地方使用。可能类似于
arg=function | condition | constant | attribute | variable('VAR*)
(对于其他表达式也可能类似)。并且
函数
必须被
覆盖,否则内部名称将被覆盖。太棒了。它现在的工作情况和预期的一样。我可以使用
r.ARGS.VAR[I]
获取变量。非常感谢您的帮助和模块。一旦你让它工作起来,它真的很强大。
['@dec64', '@empty', '@PASSWORD', '@empty', '@empty']