LR(1)语法和运算符优先级语法有什么区别?

时间:2014-11-24 05:04:54

标签: compiler-construction compilation grammar compiler-optimization context-free-grammar

我正在学习 “工程编译器,第2版” 。我知道什么是LR(1)语法,但是我在本书中找不到运算符优先级语法。

然后我从图书馆借用了 “编译器 - 原理,技术和工具” 。但我仍然找不到它。

所以我想知道,LR(1)语法和运算符优先级语法之间有什么区别。

如果LR(1)语法可以替换运算符优先语法。谢谢!

1 个答案:

答案 0 :(得分:4)

运算符语法是一种无上下文语法,其中任何右侧都没有连续的非终端。 (直观地说,每个作品都有一个算子,就像数学表达式的语法一样。)

运算符优先级语法是一种运算符语法,其中解析自动机可以简单地基于最靠近解析堆栈顶部的终端与先行令牌之间的优先关系来决定是移位还是减少。这种优先关系不需要是完整的,也不是传递的,也不是反对称的。

我很确定每个运算符优先级语法都是LR(1),但反过来肯定不正确。例如,LR(1)语法不具有对连续非终端的限制,并且LR(1)语法中的移位/减少决策很可能不与解析堆栈中的最高端子相关联。和前瞻标记。尽管如此,一些有用的语言可以用运算符优先语法表达。

与LR解析一样,运算符优先解析是一种自下而上的技术。它可能比LALR算法更容易理解,但它没有其他明显的优势:它不会更快;它不太可靠(在某些意义上,某些实现会识别错误的句子);而且更难核实。然而,在发现LALR算法之前,LR(1)自动机的大小(以及可用的有限计算资源)使得运算符优先解析看起来像是一种合理的方法。

现在,使用众多可用的解析器生成器之一,你会好得多。