美文网首页
编译原理:规范归约、算符优先归约 Syntax Analysis

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

作者: 树里的熊 | 来源:发表于2022-10-15 14:58 被阅读0次

    规范归约:

    规范推导:最右推导

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

    栗子:


    最右推导.png

    规范归约:最左归约

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

    栗子


    规范归约.png

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

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

    算符优先分析:

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

    分析过程:

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

    分析关键:

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

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

    一个栗子🌰


    算符优先归约.png

    算符优先归约的优缺点:

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

    相关文章

      网友评论

          本文标题:编译原理:规范归约、算符优先归约 Syntax Analysis

          本文链接:https://www.haomeiwen.com/subject/eqohzrtx.html