编译原理结构框架4自顶向下的语法分析

来源:互联网 发布:c语言1到100以内的质数 编辑:程序博客网 时间:2024/05/22 00:32

第四章 自顶向下的语法分析



重点:自顶向下分析的基本思想,预测分析器总体结构,预测分析表的构造,递归下降分析法基本思想,简单算术表达式的递归下降分析器。

难点:FIRST FOLLOW集的求法,对它们的理解以及在构造LL(1)分析表时的使用。递归子程序法中如何体现分析的结果。


基本概念:



自顶向下分析面临的问题:

1.二义性问题

n解决办法1:改造文法,引入新的文法变量
n解决办法2:根据优先级关系,保证高优先级运算符优先的原则

2.回溯问题

提取左因子的方法来改造文法

3.左递归引起的无穷推导问题

消除直接左递归:

 A -> Aα1 | Aα2 | Aα3 | ...... | Aαn | β1 | β2 | ...... | βn

改造:

A -> β1A' | β2A' | β3A' | ...... | βnA'

A' -> α1A' | α2A' | α3A' | ...... | αnA' | ε

消除间接左递归:

采用代入法将间接左递归变为直接左递归

采用上面介绍的方法消除直接左递归


题型:

1.计算表达式文法的语法符号的FIRST集

   如果是终结符号,则,FIRSTRUG(X) := {X}

   如果是变量,寻找候选式第一个是否是终结符

                           如果第一个是一个变量则包含该变量的FIRST集合

                          FIRST(X) += ( FIRST(Y) - { ε } )

                          如果Y可以推导为 ε 则包含下一个语法变量的FIRST 集合


2.计算表达式文法的语法变量的FOLLOW集

    FOLLOW(S ) := { #  }

     如果 A -> αBβ 则 FOLLOW(B) += FIRST(β) - { ε }

     如果 A -> αB  则  FOLLOW(B) += FOLLOW(A)

     如果 A -> αBβ 且 β =>(*) ε, A ≠ B 则 FOLLOW(B) += FOLLOW(A)


3.预测分析法:

1. 构造文法

2. 改造文法:消除二义性、消除左递归、提取左因子

3. 求每个候选式的FIRST集和变量的FOLLOW

4. 检查是不是LL(1)文法

    若不是 LL(1),说明文法的复杂性超过自顶向下方法的分析能力,需要附加新的“信息”

5. 构造预测分析表

6. 实现预测分析器


4.错误处理:


测试:

设有如下文法G

E =>TE’

E’ => +E |ε

T => FT’

T’ => T |ε

F => PF’

F’ => *F |ε

P => (E)| a |

(1) 求该文法各语法变量的FIRST集和FOLLOW

(2) 该文法是否为LL(1)文法?若是,构造其LL(1)分析表

1.

FIRST(P) = {(, a, ∧}

FIRST(F) = FIRST(P) = {(, a, ∧}

FIRST(T) = FIRST(F) = {(, a, ∧}

FIRST(E) = FIRST(T) = {(, a, ∧}

FIRST(E‘) = {+, ε}

FIRST(F') = {*, ε}

FIRST(T') = FIRST(T) ∪ { ε } = { (, a, ∧, ε }


FOLLOW(E') = FOLLOW(E)  = { ) , # }

FOLLOW(E) = FOLLOW(E') ∪ { ) } = { ), # }

FOLLOW(T) = ( FIIRST(E') - ε )  ∪ FOLLOW(T') ∪ FOLLOW(E) = { ), # , + }

FOLLOW(T') = FOLLOW(T) = { ), # , + }

FOLLOW(F') = FOLLOW(F)  = { (, a, ∧, ), #. + }

FOLLOW(F) = ( FIRST(T') - { ε } ) ∪ FOLLOW(F') ∪ FOLLOW(T)  = { (, a, ∧, ), #. + }

FOLLOW(P) = ( FIRST(F') - {ε} ) = {} ∪ FOLLOW(F) = { *, (, a, ∧, ), #. + }

2.

见博客:http://blog.csdn.net/hit_rxz/article/details/41651677




0 0