自底向上分析——LR方法
LR(k)表示在分析时要求向前看k个符号(即看输入流的前k个符号),以便唯一地确定分析动作。LR(k)一词来自:Left-to-right parse,Rightmost-derivation,k-token lookahead。LR分析主要有LR(0)分析法,SLR(1)分析法,LR(1)分析法以及SALR(1)分析法。
LR方法的思想:从输入流依次把符号移入到符号栈中,直至栈顶部中出现一个句柄;之后对句柄进行规约,直至栈顶部中不出现句柄为止;再重复上述过程,直至最终规约为一个开始符,且输入流为空。注意:真正的LR分析器并不用符号栈,而是用状态栈。LR分析法的主要动作是移入和归约。
增广文法:为处理方便,LR分析法通常要求文法的开始符不出现在任何产生式的右端。若不满足要求,则只需增加一条产生式: Z→S 或 Z→S #,其中Z是新开始符,S是原开始符。这样扩充后的文法被称为原文法的增广文法。
基本概念
归约顺序:一个句型可有多个简单短语,因此,归约顺序可有多种。LR分析法采用用的是从左到右,即每次归约最左简单短语(称为句柄)的办法。也就是说,从左到右地扫描输入串,并且一旦出现一个简单短语,就立即进行归约(否则会出现倒退进行归约的不合理的现象)。
短语:称句型 αηβ 中的 η 是一个短语,若有: S∗→αAβ , A+→η ,其中S是文法的开始符。换句话说,称句型αηβ中的η是短语,如果存在一个句型αAβ, A+→η 。
简单短语:称句型αηβ中的η是一个简单短语,若有 S∗→αAβ , A→β
句柄:一个句型中可能有多个简单短语,而句柄是其中最左的简单短语。是自底向上分析的核心动作归约的单位。
规范推导:称一个句型推导为规范推导,如果它是最右推导的。
规范句型:规范推导导出的句型。不一定每个句型都有规范推导。
规范归约:如果归约的是最左简单短语(句柄),则称其归约为规范归约(从左到右的归约)。规范推导和规范归约存在互逆的关系。
规范结论:如果给定句型是规范句型,则经规范归约后得到的仍是规范句型。
活前缀
规范前缀:称规范句型的前缀为规范前缀,如果其后部分不包含非终极符。显然,每个规范句型的前缀都是规范前缀。
活前缀:称一个规范前缀 α 为活前缀,如果包含以下任意条件:
α 不含简单短语;
α 含一个简单短语,但其后没有符号。
活前缀的含义:它表示至今被处理的终极符串部分在语法上是正确的。活前缀在分析格局中的逻辑关系如下图所示。它表示符号栈内容是活前缀 α ,符号栈内容和输入串连起来恰好形成规范句型(如果输入串是正确句子)。