语法分析——自上而下分析

语法分析       

语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。

        语言的语法结构是用上下文无关文法描述的。因此,语法分析器的工作本质上就是按文法的产生式,识别输入符号串是否为一个句子。这里所说的输入串是指由单词符号(文法的终结符)组成的有限序列。对一个文法,当给你一串(终结)符号时,怎样知道它是不是该文法的一个句子(“程序”)呢?这就要判断,看是否能从文法的开始符号出发推导出这个输入串,或者,从概念上讲,就是要建立一棵与输入串相匹配的语法分析树。

        重点难点:FOLLOW集

        我在本章学习过程中,其中写出对应文法的FIRST集和FOLLOW集,在写FIRST集的时候倒是不觉得的难,就是在写FOLLOW集的时候觉得总是写不全,要么就是丢下这个要么就是落下那个,下面我通过一个题目的做法,并用自己的方法总结了下FOLLOW集的书写:

 

方法总结如下:


左递归消除

直接消除见诸于产生式中的左递归是比较容易的。假定关于非终结符P的规则为 

P→Pa | b

其中b不以P开头。那么,我们可以把P的规则改写为如下的非直接左递归形式: 

P→bPc

Pc→aPc|e ,e为空字)

这种形式和原来的形式是等价的,也就是说,从P推出的符号串是相同的。 

预测分析程序(重点)

        栈STACK用于存放文法符号。分析开始时,栈底先放一个‘#’,然后,放进文法开始符号。同时,假定输入串之后也总有一个‘#’,标志输入串结束。 
        预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号a行事的,如图4.4。对于任何(X,a),总控程序每次都执行下述三种可能的动作之一: 
1. 若X=a=‘#’,则宣布分析成功,停止分析过程。 
2. 若X=a ¹‘#’,则把X从STACK栈顶逐出,让a指向下一个输入符号。 

3. 若X是一个非终结符,则查看分析表M。若M[A,a]中存放着关于X的一个产生式,那么,首先把X逐出STACK栈顶,然后,把产生式的右部符号串按反序一一推进STACK栈(若右部符号为e,则意味不推什么东西进栈)。在把产生式的右部符号推进栈的同时应做这个产生式相应的语义动作(目前暂且不管)。若M[A,a]中存放着“出错标志”,则调用出错诊察程序ERROR。

构造预测分析表

        预测分析表M[A,a]。构造预测分析表M,我们需要先构造与文法G有关的集合FIRST和FOLLOW。

        预测分析表的构造——FIRST(X)

       1. 若X终结符,则FIRST(X)={X}
       2.若X为非终结符,且有X->a …的产生式,则把a加入到FIRST(X)中;

       3.若X->Y…是一个产生式,且Y为非终结符,则把FIRST (Y)-ε加入到FIRST(X)中;

        预测分析表的构造——FOLLOW(X)

       1. 对于文法的开始符,置#于FOLLOW(S)中
       2.若A->αBβ, 则把FIRST (β)-ε加入到FOLLOW(B)中,

       3.若A->αB 是一个产生式,或 A->αBβ是一个产生式,而β-> ε,则把FOLLOW(A)加入到FOLLOW(B)中

 

猜你喜欢

转载自blog.csdn.net/qq_41613456/article/details/80051830