【问题标题】:What is the difference between LR(1) grammar and operator precedence grammar?LR(1)文法和运算符优先文法有什么区别?
【发布时间】:2015-01-21 18:32:01
【问题描述】:
我正在学习“Engineering a Compiler, 2nd Edition”。而且我知道什么是LR(1)语法,但是我在这本书中找不到运算符优先级语法。
然后我从图书馆借了《编译器——原理、技术和工具》,但还是找不到。
所以我想知道,LR(1)语法和运算符优先语法有什么区别。
如果LR(1)语法可以代替运算符优先语法。谢谢!
【问题讨论】:
标签:
compiler-construction
compilation
grammar
compiler-optimization
context-free-grammar
【解决方案1】:
运算符文法是一种上下文无关文法,其中任何右侧都没有连续的非终结符。 (直观地说,每个产生式都有一个运算符,就像在数学表达式的语法中一样。)
算子优先文法是一种算子文法,其中解析自动机可以简单地根据最接近解析堆栈顶部的终端与前瞻标记之间的优先关系来决定是移位还是归约。这样的优先关系不需要是完全的,也不需要传递的,也不需要反对称的。
我很确定每个运算符优先级语法都是 LR(1),但反过来肯定不是真的。例如,LR(1) 文法对连续的非终结符没有限制,并且 LR(1) 文法中的移位/归约决策很可能与解析堆栈中的最上面的终结符不相关和前瞻令牌。尽管如此,一些有用的语言可以用运算符优先语法来表达。
与 LR 解析一样,运算符优先级解析是一种自下而上的技术。它可能比 LALR 算法更容易理解,但它没有其他明显的优势:它不是更快;它不太可靠(从某种意义上说,某些实现会识别错误的句子);而且更难验证。然而,在 LALR 算法被发现之前,LR(1) 自动机的大小(以及可用的有限计算资源)使得运算符优先级解析似乎是一种合理的方法。
如今,您最好使用众多可用的解析器生成器之一。