我尝试用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
之后)。在上面的符号中包含圆括号将最终到达字符串的末尾,但它总是在最后一个位置中断,再次期望“)”。你知道吗
我试图通过使用pp.printables
并排除以下括号来解决这个问题:
arg = pp.quotedString | pp.Word(pp.printables, excludeChars="()") | fnc
但这会产生类似的结果。
这就是我的问题。有没有什么东西(regex类型或其他类型)像quotedString
这样的东西是开箱即用的,但对于不带引号的字符串呢?我提前感谢您的建议/解决方案。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐