编译原理:规范归约、算符优先归约 Syntax Analysis(2)

规范归约:

规范推导:最右推导

从起始符号开始逐步推出给定的字符串,每次拓展最右边的非终结符。

栗子:


最右推导.png

规范归约:最左归约

在移进过程中,当发现栈顶呈现 句柄时,就用相应产生式的左部符号进行替换。

栗子


规范归约.png

移动归约分析过程中的冲突

• 根据栈中的内容和下一个输入符号不能决定是移动还是归约(移动-归约 冲突)
• 不能决定按哪一个产生式进行归约(归约-归约冲突)

算符优先分析:

算符:可以理解为终结符
算符优先关系就是根据两个终结符的优先关系,来决定当前的动作是 归约/移进/先移进再归约
算符的优先关系是有序的,比如 a >b 意思是a是前一个终结符,当遇到b时的优先关系。因此a >b ,并不意味着b <` a。

分析过程:

  • 根据文法构建优先关系表(若优先关系表内一个表格中出现了两个优先关系,则说明不满足算符优先文法)
  • 利用优先关系表进行分析

分析关键:

栈的最右边的终结符(不一定是栈顶,因为栈顶可能是非终结符),和输入串的最左边的终结符,在表中查出对应位置为<,>还是=。
<则移进,>则规约,=则先移进再规约。若表中对应位置是空格,则表示出现错误。

⚠️!!:忽略非终结符,即具体是哪个非终结符无所谓,只需要形式相同即可(数目以及和终结符的组合)比如文法中是 T->S,T ,栈中是S,S 也可以归约到T(同理,T这个字母是什么不重要,我们还可以将它替换成A或B或....)

一个栗子


算符优先归约.png

算符优先归约的优缺点:

由于算符优先分析并未对文法的非终结符定义优先关系,所以就 无法发现由单个非终结符组成的“可归约串”。
• 也就是说,在算符优先归约过程中,我们无法用那些右部仅含一 个非终结符的产生式(称为单非产生式,如P→Q)进行归约。这 样,算符优先分析比规范归约要快很多。这既是算符优先分析的 优点,也是它的缺点。
• 忽略非终结符在归约过程中的作用,存在某种危险性,可能导致 把本来不成句子的输入串误认为是句子。

你可能感兴趣的:(编译原理:规范归约、算符优先归约 Syntax Analysis(2))