gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:11:50 25 4
gpt4 key购买 nike

我想使用 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 交换元组时,第二个表达式解析而第一个不解析。似乎顺序/优先级是相关的。

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

最佳答案

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

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

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

关于python - 使用 pyparsing 解析带后缀的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60234686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com