使用 pyparsing 解析带后缀的表达式

Parsing expressions with suffixes using pyparsing

我想使用 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)

当为 infixNotationattributefield 交换元组时,第二个表达式解析而第一个表达式不解析'吨。似乎 order/precedence 是相关的。

对如何解析不同后缀的任意递归出现有什么想法吗?

列表中的每个元组都定义了自己的优先级。当一个运算符的优先级高于另一个时,低优先级运算符只能通过括号用作高优先级运算符的操作数(注意 (foo'attribute).field 解析得很好)。

对于一元运算符,您通常希望所有后缀运算符都具有一个优先级(如果有的话,所有前缀运算符都需要另一个优先级)。在 pyparsing 中执行此操作的方法是使用包含可以匹配两个运算符的单个规则的元组:

(oneOf(". '") + identifier, 1, opAssoc.LEFT),