我正在尝试使用pyparsing实现(可选)嵌套函数语法。使用像here这样的简单语法,我立即启动并运行。
我的语法定义如下:
fnc = pp.Forward()
arg = pp.quotedString | pp.Word(pp.alphanums) | fnc # + ' []:=&!*#$/+'
fnc << pp.Group(pp.Word('!$#&') + pp.Word(pp.alphanums) + pp.Literal('(') + pp.Optional(pp.delimitedList(arg)) + pp.Literal(')'))
因此,根据我在测试中收集到的内容,quotedString
可以完全匹配任何类型的文本而没有任何问题,并且空格也可以正确处理。上面的fnc
解析器几乎可以处理任何事情。例如"&foo(arg1, arg2)"
(指向pp.Word(pp.alphanums)
)或"&foo('$Test,*Option1', &foo(arg2))"
(第一个arg指向quotedString
。此处额外符号"$,*"
由quotedString处理我相信虽然我没有在某处明确定义它们。第二个arg指向fnc
)。
当我写一些不在引号中的东西时,我的问题就出现了。例如,考虑一个带有关键字参数的函数:&foo(1,2.5,3.635, mode='multiply', decimals=3)
。这已经引发了expecting ")" (at char 8)
的异常,因为上面的arg
中没有定义点。 (如果我把每个参数都放在引号中,这个例子就可以了!)
所以,我开始通过添加我想要解析的所有特殊字符来使arg
越来越明确:
arg = pp.quotedString | pp.Word(pp.alphanums + ' \'[].:=&!*#$/+') | fnc
现在的问题是,当我这样做时,函数递归会中断。示例"&foo('$arg1', &foo(arg2))"
抛出异常expecting ")" (at char 18)
(紧靠内部foo
之后)。在上面的符号中包括括号将最终到达字符串的末尾,但它总是在最后一个位置处断开,期待&#34;)&#34;试。
我试图通过使用pp.printables
来解决这个问题,并排除这样的括号:
arg = pp.quotedString | pp.Word(pp.printables, excludeChars="()") | fnc
但这会产生类似的结果。
因此我的问题。是否有任何(正则表达式或类似的东西),如quotedString
开箱即用,但对于不带引号的字符串?我提前感谢您提出任何指示/解决方案。