有什么方法可以区分LL(k)和LR(k)语法吗?


12

我最近正在研究编译器设计。我知道两种语法,一种是LL语法,另一种是LR语法。

我们也知道每个LL语法都是LR的事实,即LL语法是LR语法的适当子集。第一个用于自上而下的解析,第二个用于自下而上的解析。

但是有什么办法可以让我们说给定的语法是LL还是LR?


3
如何使用规范技术生成L R k 表并检查它们是否包含冲突?L L 1 L R 1 通常在任何标准教科书中进行解析; 的大号大号ķ 大号- [R ķ 技术是有点难以找到,但也是公知的。LL(k)LR(k)LL(1)LR(1)LL(k)LR(k)
亚历克斯(Alex)10 Brink 2012年

@AlextenBrink这听起来好像可以给出答案!(欢迎回来,您被错过了!)
拉斐尔

使用规范的技术来检查语法是LL还是LR是正确的,但却是漫长的过程。我正在尝试找到一种小方法来找到它,这是在Aho-Lam-Sethi-Ullman的《编译器》一书中找到的。
2012年

Answers:


11

L R k 语法很好,不仅因为它们可以被有效地解析,而且因为我们可以检查语法是 L L k 还是 L R k LL(k)LR(k)LL(k)LR(k),因为我们可以为它们生成表(解析表用于解析输入字符串)。请注意,对于这两个类,拥有parse表可以立即检查语法是否在这些类中,因为只有当表中没有错误时,才这样。而且,是的,如果有一个分析表,我们可以有效地解析某些语法类,但是如果存在该表,就不能为其生成语法表。

任何有关解析方法的教科书都将教您如何生成方法以及L R 1 方法的表(尽管S L R 1 更常见)。教科书如解析理论由Sippu和Soisalon-Soininen也可治疗解析表生成用于大号大号ķ 大号- [R ķ 语法。LL(1)LR(1)SLR(1)LL(k)LR(k)

不幸的是,对于真正奇怪的语法,L R k (尽管不是L L 1 )的解析表可能会爆炸并变得庞大;如果k足够高,即使对于普通语法,他们也会这样做。有可用的测试可以检查语法是L L k 还是L R k LL(k)LR(k)LL(1)kLL(k)LR(k)是否在多项式时间内运行(表生成是指数的)。有关详细信息,请阅读上面的教科书。请注意,在很多情况下,表的大小合理,因此不需要测试。

如果您不想尝试使用值来查看程序是否正常运行,而是想让计算机确定是否存在k的值,以使您的语法为L L k L R k ,很遗憾,您不走运,因为这是无法确定的。如果对于某个k您的语法为L R k 可以确定对于某些c您的语法是否为L L c ,可能与k有所不同kkLL(k)LR(k)LR(k)kLL(c)ck(有关详细信息,请参见此处)。


您是否偶然知道在哪里可以找到用于测试语言是否为LR(k)的多项式时间算法的详细信息(除了购买教科书以外)?
user541686

2

我们仅需检查语法是否为LL,因为每个LL语法都是LR,即LL是LR的正确子集。因此,如果语法是LL,则它必须是LR,但每个LR都不是LL。

只要A-> C | D,语法L就在LL iff中,以下条件应成立:

  1. First(C)和First(D)是不交集。
  2. 如果在First(D)中为空,则First(C)和Follow(A)是不相交的集合,同样在First(C)中也为空。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.