• 编译原理-第二章 一个简单的语法指导编译器-2.5 语法分析


    语法分析:

    • 定义:决定如何使用一个文法生成一个终结符号串的过程
    • 时间复杂度:
      • 通常语法分析的时间复杂度是 O ( n3
      • 对于程序设计语言,时间复杂度是 O ( n ) 
    • 语法分析方法分类:
      • 自顶向下分析法:
        • 定义:指语法分析树结点的构造顺序,构造过程从根节点开始,逐步向叶子节点方向进行
        • 特点:这种方法可以较容易地手工构造出高效的语法分析器
        • 例:

          •  从标号为开始非终结符stmt的根结点开始,反复执行以下步骤:
            • 在标号为非终结符A的结点N上,选择A的一个产生式,并为该产生式体中的各个符号构造出N的子结点
            • 寻找下一个结点来构造子树,通常选择的是语法分析树最左边的尚为扩展的非终结符
          • 对于某些文法,上面的步骤只需对输入串进行一次从左到右的扫描就可以完成,输入中当前被扫描的终结符通常被称为向前看符号
          • 结论:
            • 一般来说,为一个非终结符号选择产生式是一个“尝试并犯错”的过程——存在回溯问题
            • 一个产生式”不适合“是指使用了该产生式之后,无法构造得到一颗与当前输入串相匹配的语法分析树
        • 种类:
          • 递归下降分析法:
            • 特点:
              • 一种自顶向下分析方法
              • 使用一组递归过程处理输入
              • 文法的每个非终结符都有一个相关联的过程
            • 种类:
              • 预测分析法:
                • 特点:
                  • 不需要进行回溯;要求设计的文法满足
                  • 当考虑到一个输入符号(终结符)的时候 ,只有一种非终结符可以生成这个输入符号,是确定性的
                • 执行过程:
                  • 令α是一个文法符号(终结符号或非终结符号)串,FIRST(α) 是由α生成的一个或多个终结符号串的第一个符号集合。如果α 是ε或者可以生成ε,那么ε在FIRST(α)中
                  • 通常情况下,α要么以一个终结符号开头,此时该终结符号就是FIRST(α)中的唯一符号;要么α以一个非终结符号开头,且该非终结符的所有产生式体都以某个终结符号开头,那么这些终结符号就是FIRST(α)的所有成员
                  • 有两个产生式A→α和A→β,预测分析法要求FIRST(α)和 FIRST(β)不相交。如果输入符号在FIRST(α)中,就用A→α, 如果输入符号在FIRST(β)中,就用A →β
                  • 预测分析器在没有其他产生式可用时,将ε产生式作为默认选择使用,不做任何操作就对应于应用ε产生式的情形
                • 预测分析器:
                  • 一个预测器程序由各个非终结符对应的过程组成
                    • 对应于非终结符A:
                      • 首先,检查向前看符号,决定使用A的哪个产生式。如果一个产生式 的体为α(α不是空串ε),且向前看符号在FIRST(α)中,那么就选择这个产生式
                      • 然后,模拟被选中的产生式的体,也就是,从左向右逐个执行此产生式体的符号。“执行”就是调用相应非终结符的过程,一个与向前看符号匹配的终结符号的“执行”方法则是读入下一个输入符号。如果在某个点上,产生式体中的终结符号和向前看符号不匹配,那么语法分析器就会报告一个语法错误
                  • 扩展一个预测分析器获得一个语法制导的翻译器:
                    • 先不考虑产生式中的动作,构造一个预测分析器
                    • 将翻译方案中的动作拷贝到语法分析器中,将翻译动作当作一个非终结符嵌入翻译方案
                • 例:
            • 左递归:可能使递归下降语法分析器进入无限循环

              • 例:
              • 消除左递归 :
                1. 考虑有两个产生式:A→Aα | β 的非终结符号A,其中α和β是不以A开头的终结符号/非终结符号的序列
                2. 因为产生式A→Aα的右部的最左符号是A自身,非终结符号A和它的产生式就成为左递归的,不断应用这个产生式将在A的右边生成一个α的序列,当A最终被替换为β时,就得到了一个在β后面有0个或多个的α序列,如图
                3. 使用一个新的非终结符号R,按照如下方式改写A的产生式可以达到同样的效果:A→β|R,R→αR | ε,如图

                4. 非终结符号R和它的产生式R→αR是右递归的,因为这个产生式的右部的最后一个符号就是R本身
                • 例1:
                • 例2: 
                   
      • 自底向上分析法:
        • 定义:指语法分析树结点的构造顺序,构造过程从叶子点开始,逐步构造出根结点
        • 特点:可以处理更多种文法和翻译方案,所以直接从文法生成语法分析器的软件工具常常使用自底向上的方法

    参考——《编译原理(第二版)》、慕课-苏州大学-王中卿老师

  • 相关阅读:
    B树与B+详解
    SQLite占用资源少原因
    iOS SQLite详解
    YTKNetwork网络封装
    YTKNetwork源码详解
    AFNetworking封装-项目使用
    iOS网络请求-AFNetworking源码解析
    PHP 不使用第三个变量实现交换两个变量的值
    PHP public private protected 三种修饰符的区别
    PHP 汉字转拼音
  • 原文地址:https://www.cnblogs.com/fangzhiyou/p/12437133.html
Copyright © 2020-2023  润新知