我正在编写一个解析器来检查另一种脚本语言的有效性。解析本身正如预期的那样工作,但即使我看到解析器已经捕获它们,我也无法访问某些结果。
function = Forward()
arg = function | condition | constant | attribute | variable
args = delimitedList(arg)
function <<= (functor("FUNCTOR") + lparen + Optional(args)("ARGS") + rparen)("FUNCTION")
我给它:
r = function.parseString('DecryptSymmetric(@dec64, "AES", @empty, @PASSWORD, @empty, "0000000000000000",@empty, "00000000000000000000000000000000")')
并且结果表明它已捕获并识别函数中的variable
和constant
字段。
在交互式提示中输入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的代码我发现所有三个函数都使用了一个名为__toklist
的函数来提取值,但是访问它本身只会给我一个空字符串,即使我在子ParseResults
个实例上尝试它来自r
。
必须有一种方法来访问VAR
中的所有元素,因为对象显然正在存储和使用它们,但我找不到干净的方法。理想情况下,我会将它们全部放回到以下列表中:
['@dec64', '@empty', '@PASSWORD', '@empty', '@empty']
r.dump()
也会显示我想要的字段,但是在字符串中会破坏使用解析器的全部目的。