首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有哪些算法可以解析操作符优先级定义为范围的语言?

有哪些算法可以解析操作符优先级定义为范围的语言?
EN

Stack Overflow用户
提问于 2021-03-29 19:47:20
回答 2查看 146关注 0票数 0

TLA+语言为其操作符优先级使用范围(请参阅“指定系统[PDF格式]”一书中第271页中的表)。引用:

如果两个运算符的范围重叠,则未指定它们的相对优先级。

因此,例如,$运算符(位次9-13)与+运算符(位次10-10)发生冲突,但<运算符(优先级5-5)不冲突。

在正式语言中,运算符优先范围是否是常用的,甚至是预先存在的概念?我在网上找不到任何关于这件事的东西。是否有算法解析这样的优先方案,或将此方案转换为标准的单值优先方案?是否有解析器生成器处理运算符优先级范围?与单值优先级别相比,这种方法得到了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-29 22:14:49

在正式语言中,运算符优先范围是否是常用的,甚至是预先存在的概念?

不是的。

事实上,运算符优先(无范围)在正式语言中是一个被严重误解的概念。(当我写完这篇论文之后,你就可以看到下面这个声明的更长版本了。)

是否有算法解析这样的优先方案,或将此方案转换为标准的单值优先方案?

您可以很容易地调整标准的调车场算法,只需使用更复杂的优先级比较即可。在标准算法中,比较可以有三种可能的结果:小于(推入符号)、大于(减少左边的表达式)和相等(合并括号或其他括号标记)。(最后的结果在大多数在线资源中都没有很好的描述,而且通常是通过增加一个额外的相关性测试来实现的。再一次,见下文。

通过范围比较,您将有四种可能的结果。你会把左手范围的结束和右手范围的开始相比较,左手范围的开始和右手范围的末尾比较。如果这两种方法都没有应用,那么您将有重叠的范围,并且您将不得不以某种方式区分带括号的令牌和错误案例。

是否有解析器生成器处理运算符优先级范围?

目前只有少数解析器生成器使用操作符优先级表,尽管分流码算法(或其等效的)的手写实现非常常见。像yacc/bison这样的解析器生成器在解析器构造时使用优先级声明来通过消除一些可能的解析操作来解决冲突;解析器本身不知道优先级,并且严格按照状态转换表操作。

ANTLR是解析器生成器,它最接近于在解析期间使用优先级。它根据语法描述中的产品顺序计算自己的优先级(对每个非终端分别计算)。这些计算的优先级级别被转换成语义谓词,在解析时执行这些谓词,以便在不同的解析预测之间进行选择。由于没有显式优先级声明,所以您没有任何地方可以声明范围,但是您可以自己编写语义谓词,而不是让ANTLR为您生成它们(如果您有显式谓词,它不会尝试插入冲突解决代码)。这将允许您使用与我前面概述的相同的策略,但我不认为它会完全令人满意。

与单值优先级别相比,这种方法得到了什么?

在我看来没什么。这是一次黑客攻击,就像其他的优先解析一样。如果它适用于特定的语法,那是很酷的,但是它会遇到泛化的操作符优先分析所遇到的相同问题:您并不真正知道您正在解析的是哪种语言,因为整个机器更像是一个启发式的而不是一个正式的框架。为了证明这一点,很难找到一个手写的基于优先级的解析器,它在某一点上没有一些(希望是注释的)代码来处理优先级比较没有正确处理的异常,就像很难找到使用优先级声明的实际语法一样,除了最普通的类型之外,在某个地方没有一个解释其他神秘声明的长注释。

票数 2
EN

Stack Overflow用户

发布于 2021-03-29 20:18:35

我想你可能“埋了铅”。

就在这一节之后,它说“如果两个运算符的应用顺序没有确定,因为它们的优先级范围重叠,并且它们不是关联infix运算符的两个实例,则表达式是非法的(而不是语法良好的)。”

我读到“未指定为”“做任何你想做的”,上面写着它是无效的

ANTLR是我选择的解析器,我不知道如何使解析器在语法上拒绝这个解析器(在解析阶段)。我可以看到应用设置优先级的位置,然后,一旦您有了一个ParseTree,您就可以使用在解析树中查找重叠优先级规则的代码来处理它,并在上面抛出错误。我不知道这有什么坏处。你还是会把它标记为错误。只是ANTLR会给你它对树的解释,它的优先级是你指定的。

我可能可以用一个ANTLR侦听器代码示例(在Java中)来扩展这个想法。

老实说,要把我的头脑集中在这样一个优先方案的打包版本上是有点困难的。这很奇怪。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66860684

复制
相关文章

相似问题

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