第四单元 语法分析

第四单元 语法分析

4.1 自顶向下分析概述

  • 自顶向下的分析(Top-Down Parsing)

    从树的顶部(根节点)向底部(叶节点)方向构造分析树

    • 最左推导(Left-most Derivation)

      在最左推导中,总是选择每个句型的最左非终结符进行替换

      E => E + E
        => id + E
        => id + (E)
        => id + (E + E)
        => id + (id + E)
        => id + (id + id)
      
      • 逆过程(自底向上的过程)叫做最右归约,从下往上看
    • 最右推导(Right-most Derivation)

      在最右推导中,总是选择每个句型的最右非终结符进行替换

      E => E + E
        => E + (E)
        => E + (E + E)
        => E + (E + id)
        => E + (id + id)
        => id + (id + id)
      
      • 逆过程(自底向上的过程)叫做最左归约,从下往上看

    在自底向上的分析中,总是采用最左归约的方式,因此把最左归约成为规范归约, 而最右推导相应地称为规范推导

    • 最左推导和最右推导的唯一性

    在顶底向下的分析中,总是选择每个句型的最左非终结符进行替换,根据输入流中的下一个终结符,选择最左非终结符的一个候选式

    • 自顶向下语法分析的通用形式

      • 递归下降分析(Recursive-Descent Parsing)

        1. 由一组过程组成, 每个过程对应一个非终结符
        2. 从文法开始符号S对应的过程开始,递归调用文法中其它非终结符对应的过程。如果S对应的过程恰好扫描了整个输入串,则为完成语法分析
        • 可能需要回溯,导致效率较低(尝试多个候选式)
      • 预测分析(Predictive Parsing)

        1. 预测分析是递归下降分析技术的特例,通过在输入中向前看固定个数(通常是1)符号来选择正确的A-产生式
          • 可以对某些文法构造出向前看k个输入符号的预测分析器,该类文法有时也称为LL(k)文法类
        2. 预测分析不需要回溯,是一种确定的自顶向下的分析方法

4.2 文法转换

例 1

文法G
S -> aAd | aBe
A -> c
B -> b
输入  a b c
	 ↑
	 这时候S有多个候选式存在比如aAd或者aBe

​ 上面的情况即同一非终结符的多个候选式存在共同前缀,将导致回溯现象

  • 提取左公因子(Left Factoring) 来解决

    文法G'
    S -> aS'
    S' -> Ad | Be
    A -> c
    B -> b
    

例2

文法G
E -> E + T | E - T | T
T -> T * F | T / F | F
F -> (E) | id
输入
id + id * id
 ↑
 
 E => E + T
   => E + T + T
   => E + T + T + T
   => ...

含有A -> Aa形式产生式的文法称为是直接左递归的(immediate left recursive)

如果一个文法中有一个非终结符A使得对某个串a存在一个推导A=>+Aa,(+是A的左上角标), 那么这个文法就是左递归

经过两步或者两步以上推导产生的左递归称为是间接左递归

左递归文法会使递归下降分析器陷入无限循环

所以为了消除左递归

  1. 消除直接左递归
  • 直接消除左递归

    分析正则表达式,再替换右边,将左递归转换成为右递归

    A -> Aα | β 	正则表达式:γ = β α*(右上角标)
        ↡
    A -> βÂ
     -> α | ε
    
  • 消除直接左递归的一般形式

    即多次利用上面的规则

    A -> β1 |β2 |β3 |β4 |β5 |β6 |...

    Â -> α1 |α2 |α3 |...

    代价:引进了一些非终结符ε_产生式

  1. 消除间接左递归

    利用上面的方法,找到将A与递归连接起来,再代入到间接递归式中即可

posted @ 2021-10-25 11:51  hcのBlog  阅读(300)  评论(0)    收藏  举报