首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Parsing解析后缀解析表达式

用Parsing解析后缀解析表达式
EN

Stack Overflow用户
提问于 2020-02-14 23:25:28
回答 1查看 72关注 0票数 3

我想使用PyParsing解析以下(简化的)递归表达式:

代码语言:javascript
运行
复制
foo
(foo + bar)
foo'attribute
foo + bar'attribute
foo.field
(foo'attribute + foo.field)'attribute

我想出了以下解析器,它适用于所有上述表达式:

代码语言:javascript
运行
复制
        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产生

代码语言:javascript
运行
复制
pyparsing.ParseException: Expected end of text (at char 13), (line:1, col:14)

当将元组交换为infixNotation的属性和字段时,第二个表达式解析,而第一个表达式不解析。

有什么想法可以解析不同后缀的任意递归外观吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-15 12:03:08

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

对于一元运算符,通常需要为所有后缀运算符设置一个级别的优先级(如果有前缀运算符,则为另一个前缀运算符)。在single解析中这样做的方法是使用一个包含单个规则的元组,该规则可以匹配两个操作符:

代码语言:javascript
运行
复制
(oneOf(". '") + identifier, 1, opAssoc.LEFT),
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60234686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档