移入——归约技术

归约

定义:我们可以将自底向上语法分析过程看成是建一个串w“归约”慰问发开始符号的过程,在归约中,一个与某产生式体相匹配的特定子串被替换为该产生式的头部的非终结符号。
定义理解起来比较晦涩,我们来看个例子就知道了。
已知有文法

E ——> E + T | T
T ——> T * F | F
F ——> ( E ) | id

他的产生式为 id * id
那么归约过程为:

id * id =》 F * id =》 T * id =》 T * F =》 T =》 E

显而易见,这就是一个反向的最右推导。

句柄

定义:如果有S=》αAw=》αβw,那么紧跟α的产生式A->β是αβw的一个句柄。
特性:
1)句柄右边的串w一定只包含终结符号。
2)如果一个文法无二义性,那么该文法的每个右句型都有且只有一个句柄。

例如,对于上述例子而言

  • id1 * id2 句柄为 id1
  • F * id2 句柄为 F
  • T * id2 句柄为 id2
  • T * F 句柄为 T * F
  • T 句柄为 T

移入——归约分析技术

移入——归约语法分析是自底向上语法分析的一种形式。他使用一个栈来保存文发符号,并用一个输入缓冲区来存放将要进行语法分析的其余符号。
其分析器会采取以下四中动作:

  1. 移入(shift):将下一个输入符号移入到栈顶端。
  2. 归约(reduce):被归约的符号串右端必然是栈顶。语法分析器在栈中确定这个串的左端并决定用哪个非终结符号来替换这个串。
  3. 接受(accept):宣布语法分析过程成功完成。
  4. 报错(error):发现一个语法错误,并调用一个错误恢复。

还是以上述为例,展现一个完整的推导过程。


分析过程

当然,这种语法中也存在冲突
1)移入/归约冲突:无法确定进行移入还是归约操作
2)归约/归约冲突:多个可能归约中无法确定
对于冲突,我们后续也会用不同的具体LR语法来解决。

你可能感兴趣的:(移入——归约技术)