我想使用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的属性和字段时,第二个表达式解析,而第一个表达式不解析。
有什么想法可以解析不同后缀的任意递归外观吗?
发布于 2020-02-15 12:03:08
列表中的每个元组都定义了自己的优先级级别。当一个运算符的优先级高于另一个运算符时,低优先级运算符只能通过使用括号作为较高优先级运算符的操作数(注意,(foo'attribute).field解析很好)。
对于一元运算符,通常需要为所有后缀运算符设置一个级别的优先级(如果有前缀运算符,则为另一个前缀运算符)。在single解析中这样做的方法是使用一个包含单个规则的元组,该规则可以匹配两个操作符:
(oneOf(". '") + identifier, 1, opAssoc.LEFT),https://stackoverflow.com/questions/60234686
复制相似问题