【问题标题】:How do I implement this in ply, given how pyparsing works鉴于 pyparsing 的工作原理,我如何在 ply 中实现这一点
【发布时间】:2016-11-29 10:57:09
【问题描述】:
根据我在 pyparsing 中所做的工作,我正在尝试在 ply 中实现一些东西,对此我很陌生,我也很陌生。如何编写一个简单的嵌套搜索,例如:
thecontent = pyparsing.Word(pyparsing.alphanums) | '&' | '|'
parens = pyparsing.nestedExpr( '(', ')', content=thecontent)
通过使用 PLY?
【问题讨论】:
标签:
python
nested
pyparsing
ply
【解决方案1】:
您在 pyparsing 中编写的内容并不能很好地转换为 PLY,因为它甚至都不是解析器。 nestedExpr 是快速定义“我真的不知道这是什么,但它被()'s(或{}'s 或[]'s 或其他)包围的形式的表达式的助手,并且它们可以嵌套”。解析像 C 这样的以“{}”分隔的语言非常方便,可以将简单的函数定义定义为type_spec + identifier + parameter_spec + nestedExpr('{', '}')。鉴于您将内容定义为包含“&”和“|”运算符,听起来你真的想解析一个布尔表达式,包括支持括号分组来覆盖操作的优先级。
pyparsing wiki 示例页面上的 simpleBool.py 示例显示了一些测试用例和表达式以支持布尔表达式解析。 但是它仍然使用辅助方法infixNotation,它隐藏了大部分解析器定义步骤,因此很难直接转换为 PLY。不过,我参考了这个示例,因为它可以帮助您澄清解析布尔表达式所涉及的内容(包括解析布尔文字,如“True”、“False”等,并可能添加对“not”运算符的支持)。此外,它还会为您提供一堆免费的测试用例 - 自助!
要查看类似于 PLY 所期望的更明确的语法,请查看 pyparsing 的fourFn.py 示例。它早于infixNotation 助手,因此明确地建立了各种操作优先级。 (这种算术运算符优先级实现形式的优雅主要是让我首先对解析应用程序感兴趣。)