Parsing 对于运算符优先级定义为范围的语言,有哪些算法用于解析该语言?

Parsing 对于运算符优先级定义为范围的语言,有哪些算法用于解析该语言?,parsing,grammar,operator-precedence,formal-languages,tla+,Parsing,Grammar,Operator Precedence,Formal Languages,Tla+,语言TLA+使用范围作为运算符优先级(请参阅指定系统[]一书第271页的表格)。引述: 如果两个运算符的范围重叠,则未指定其相对优先级 因此,例如,$运算符(优先级9-13)与+运算符(优先级10-10)冲突,而与冲突,我认为您可能“埋下了导火索” 紧接着这一节,它说“如果两个运算符的应用顺序没有确定,因为它们的优先范围重叠,并且它们不是关联中缀运算符的两个实例,那么表达式是非法的(语法形式不正确)。” 我读到“未指定为”想做什么就做什么”,这表示它是无效的 ANTLR是我选择的解析器,我不知道

语言TLA+使用范围作为运算符优先级(请参阅指定系统[]一书第271页的表格)。引述:

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

因此,例如,
$
运算符(优先级9-13)与
+
运算符(优先级10-10)冲突,而与
冲突,我认为您可能“埋下了导火索”

紧接着这一节,它说“如果两个运算符的应用顺序没有确定,因为它们的优先范围重叠,并且它们不是关联中缀运算符的两个实例,那么表达式是非法的(语法形式不正确)。”

我读到“未指定为”想做什么就做什么”,这表示它是无效的

ANTLR是我选择的解析器,我不知道如何让解析器在语法上拒绝它(在解析阶段)。我可以看到你将在哪里应用一个设置的优先级,然后,一旦你有了一个解析树,你就可以用在解析树中寻找重叠优先级规则的代码来处理它,并在上面抛出错误。我不知道这有什么不好的地方。你仍然会将它标记为错误。只是ANTLR会将它的解释交给你f具有指定优先级的树

我可能会用一段ANTLR侦听器代码(Java)来扩展这个想法

老实说,我很难理解这样一个优先方案的打包版本。这很奇怪。

我想你可能已经“埋下了导火索”

紧接着这一节,它说“如果两个运算符的应用顺序没有确定,因为它们的优先范围重叠,并且它们不是关联中缀运算符的两个实例,那么表达式是非法的(语法形式不正确)。”

我读到“未指定为”想做什么就做什么”,这表示它是无效的

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

我可能会用一段ANTLR侦听器代码(Java)来扩展这个想法

老实说,我很难理解这样一个优先方案的打包版本。这很奇怪

运算符优先级范围在形式语言中是一个常用的甚至是预先存在的概念吗

没有

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

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

通过使用更复杂的优先级比较,您可以非常轻松地调整标准调车场算法。在标准算法中,比较可能有三种结果:小于(按下传入符号)、大于(减少左侧的表达式)和等于(合并括号或其他括号标记)。(最后一个结果在大多数在线资源中都没有很好的描述,并且经常因为添加了额外的关联性测试而变得模糊。同样,请参见下文。)

通过范围比较,您将得到四种可能的结果。对于小于,您将比较左侧范围的结束与右侧范围的开始,对于大于,将比较左侧范围的开始与右侧范围的结束。如果这两种方法都不适用,则会有重叠的范围,并且必须以某种方式区分括号标记和错误情况

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

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

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

与单值优先级别相比,通过这种方法可以获得什么

在我看来,没什么。这是一种黑客行为,就像其他大多数优先解析一样。如果它适用于特定的语法,这很酷,但它会遇到与广义运算符优先解析相同的问题:你不知道你在解析什么语言,因为整个机器更像是一个启发式工具,而不是一个正式的框架。作为证明,这很难