我最近正在研究编译器设计。我知道两种语法,一种是LL语法,另一种是LR语法。
我们也知道每个LL语法都是LR的事实,即LL语法是LR语法的适当子集。第一个用于自上而下的解析,第二个用于自下而上的解析。
但是有什么办法可以让我们说给定的语法是LL还是LR?
我最近正在研究编译器设计。我知道两种语法,一种是LL语法,另一种是LR语法。
我们也知道每个LL语法都是LR的事实,即LL语法是LR语法的适当子集。第一个用于自上而下的解析,第二个用于自下而上的解析。
但是有什么办法可以让我们说给定的语法是LL还是LR?
Answers:
和 L R (k )语法很好,不仅因为它们可以被有效地解析,而且因为我们可以检查语法是 L L (k )还是 L R (k ),因为我们可以为它们生成表(解析表用于解析输入字符串)。请注意,对于这两个类,拥有parse表可以立即检查语法是否在这些类中,因为只有当表中没有错误时,才这样。而且,是的,如果有一个分析表,我们可以有效地解析某些语法类,但是如果存在该表,就不能为其生成语法表。
任何有关解析方法的教科书都将教您如何生成方法以及L R (1 )方法的表(尽管S L R (1 )更常见)。教科书如解析理论由Sippu和Soisalon-Soininen也可治疗解析表生成用于大号大号(ķ )和大号- [R (ķ )语法。
不幸的是,对于真正奇怪的语法,和L R (k )(尽管不是L L (1 ))的解析表可能会爆炸并变得庞大;如果k足够高,即使对于普通语法,他们也会这样做。有可用的测试可以检查语法是L L (k )还是L R (k )是否在多项式时间内运行(表生成是指数的)。有关详细信息,请阅读上面的教科书。请注意,在很多情况下,表的大小合理,因此不需要测试。
如果您不想尝试使用值来查看程序是否正常运行,而是想让计算机确定是否存在k的值,以使您的语法为L L (k )或L R (k ),很遗憾,您不走运,因为这是无法确定的。如果对于某个k您的语法为L R (k ),则可以确定对于某些c您的语法是否为L L (c ),可能与k有所不同(有关详细信息,请参见此处)。