借助于一个栈,可以将这种方法简化为“移进—规约分析”:
从左向右逐个扫描待分析的单词符号串,并将串中单词一个一个地移入栈中,边移入边分析;每当栈顶符号串形成了所给文法的某个产生式右部时就进行一次归约,即用该产生式的左部非终结符去替换相应的右部符号串(即:出现在栈顶的这一串单词符号,称为可归约串)。重复这一过程,若能将所有的单词符号都归约到文法的开始符号,则该单词符号串是该文法的合法句子,否则不是。
关键问题
分析过程中的关键问题是如何确定栈顶已经形成了可规约串,即:
- 如何定义可归约串?
- 如何识别可归约串?
如果简单地将“可规约串”定义为:栈顶形成了某个产生式的右部,那么识别起来是比较容易的:只需要每移进一个符号之后,就拿栈中符号串的所有子串与所有产生式的右部逐一比对,这样做虽然效率很低,但实现不难。但实际上这里存在一个大问题。
为此,引入如下一组定义:
LR分析法
L表示从左至右扫描输入串,R表示构造一个最右推导的逆过程