【发布时间】:2020-02-14 23:25:28
【问题描述】:
我想使用 PyParsing 解析以下(简化的)递归表达式:
foo
(foo + bar)
foo'attribute
foo + bar'attribute
foo.field
(foo'attribute + foo.field)'attribute
我想出了以下适用于上述所有表达式的解析器:
identifier = Word(alphas)
expr = (
infixNotation(
identifier,
[
(Literal(".") + identifier, 1, opAssoc.LEFT),
(Literal("'") + identifier, 1, opAssoc.LEFT),
(Literal("+"), 2, opAssoc.LEFT),
],
)
+ StringEnd()
)
然而,失败的是包含.field 和'attribute 后缀的表达式。虽然foo.field'attribute 被接受,但foo'attribute.field 产生
pyparsing.ParseException: Expected end of text (at char 13), (line:1, col:14)
当为infixNotation 的attribute 和field 交换元组时,第二个表达式解析而第一个表达式不解析。似乎顺序/优先级是相关的。
任何想法如何解析不同后缀的任意递归外观?
【问题讨论】:
-
有趣地使用一元运算符来限制第二个操作数的形式。我原本打算建议制作这些二元运算符,但是在
.或'分隔符之后可能会有无效的表达式。很酷! -
@PaulMcG 谢谢!并且特别感谢制作 pyparsing - 这个库在过去的许多项目中为我提供了很好的服务!