Parsing 消除上下文无关语法中的歧义

Parsing 消除上下文无关语法中的歧义,parsing,compiler-construction,context-free-grammar,Parsing,Compiler Construction,Context Free Grammar,给定一个不明确的语法,为了消除运算符优先级问题,我们将转换语法以遵循运算符优先级规则。为了解决操作符的关联性问题,我们通过考虑与其关联的操作符,将语法转换为左递归或右递归 现在,当计算机必须进行解析时,假设它使用递归下降算法,语法首先应该是明确的吗?或者语法应该根据算法有不同的要求 如果语法是左递归的,则递归下降算法不会终止。现在我如何给算法一个明确的语法(解决了关联性问题)作为输入 语法必须为LL(k),才能使用标准的高效递归下降算法,且无回溯。有一些标准转换可用于将一般LR语法(基本上是任何

给定一个不明确的语法,为了消除运算符优先级问题,我们将转换语法以遵循运算符优先级规则。为了解决操作符的关联性问题,我们通过考虑与其关联的操作符,将语法转换为左递归或右递归

现在,当计算机必须进行解析时,假设它使用递归下降算法,语法首先应该是明确的吗?或者语法应该根据算法有不同的要求


如果语法是左递归的,则递归下降算法不会终止。现在我如何给算法一个明确的语法(解决了关联性问题)作为输入

语法必须为LL(k),才能使用标准的高效递归下降算法,且无回溯。有一些标准转换可用于将一般LR语法(基本上是任何可由基于确定性堆栈的算法解析的语法)转换为LL(k)形式。它们包括左递归消除和左因子分解。这些都是广泛的主题,我不打算在这里介绍。但它们在大多数优秀的编译器文本中都有很好的覆盖,在通过搜索获得的在线注释中也有相当好的覆盖。Aho Sethi和Ullman编译器设计是这方面以及大多数其他编译器基础知识的重要参考

但我的问题是如何解决左结合?查阅左递归消去和左因子分解。这些都是相当复杂的转换,在很多地方都有很好的介绍。重复这些内容不值得写这么长的文章。@desireprg用右递归规则解析左关联表达式没有问题。规则中的递归编码关联性的想法是不正确的。递归下降不太擅长解析表达式。还有其他一些简单的技术(例如,Pratt解析器),或者您可以使用LR(1)语法,如果解析器生成器像大多数语法一样处理它们,则可能使用优先级声明。