在pyparsing

时间:2017-06-06 20:48:34

标签: python pyparsing

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

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")')

并且结果表明它已捕获并识别函数中的variableconstant字段。

在交互式提示中输入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的函数来提取值,但是访问它本身只会给我一个空字符串,即使我在子ParseResults个实例上尝试它来自r

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

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

r.dump()也会显示我想要的字段,但是在字符串中会破坏使用解析器的全部目的。

0 个答案:

没有答案