使用 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)
当为 infixNotation
的 attribute 和 field 交换元组时,第二个表达式解析而第一个表达式不解析'吨。似乎 order/precedence 是相关的。
对如何解析不同后缀的任意递归出现有什么想法吗?
列表中的每个元组都定义了自己的优先级。当一个运算符的优先级高于另一个时,低优先级运算符只能通过括号用作高优先级运算符的操作数(注意 (foo'attribute).field
解析得很好)。
对于一元运算符,您通常希望所有后缀运算符都具有一个优先级(如果有的话,所有前缀运算符都需要另一个优先级)。在 pyparsing 中执行此操作的方法是使用包含可以匹配两个运算符的单个规则的元组:
(oneOf(". '") + identifier, 1, opAssoc.LEFT),
我想使用 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 交换元组时,第二个表达式解析而第一个表达式不解析'吨。似乎 order/precedence 是相关的。
对如何解析不同后缀的任意递归出现有什么想法吗?
列表中的每个元组都定义了自己的优先级。当一个运算符的优先级高于另一个时,低优先级运算符只能通过括号用作高优先级运算符的操作数(注意 (foo'attribute).field
解析得很好)。
对于一元运算符,您通常希望所有后缀运算符都具有一个优先级(如果有的话,所有前缀运算符都需要另一个优先级)。在 pyparsing 中执行此操作的方法是使用包含可以匹配两个运算符的单个规则的元组:
(oneOf(". '") + identifier, 1, opAssoc.LEFT),