语法分析笔记自顶向下分析

来源:互联网 发布:质量效应2最美捏脸数据 编辑:程序博客网 时间:2024/06/05 03:50

             进行完词法分析紧接着进入语法分析阶段语法分析判断一个句子是否合乎语言的文法规则,语法分析阶段的数学元素为:

          终结符:数字(1~9),字母(a~z),运算符等字(+ - x /)符。

         非终结符:一个抽象化的句子以大写字母表示如:S,R,A,B;

         产生式:S-->aB      B---->Fb+      F------>i  产生式规定了语言的文法。

        初始符:S;通常为第一个产生式的最左的非终结符。       


      语法分析分为自顶向下的语法分析和自底向上的语法分析。

      自顶向下的分析为由最上面的非终结符根据产生式推导出最终表达式。

      自底向上的分析为根据产生式由表达式归约成初始符

   LL(1)文法:自左向右,最左推导文法。所谓文法就是产生式符合某种规则。

       如何判断一个文法是否具有二义性,通过判断是否为LL(1)就可得出,LL(1)规定每个产生式对应一个节点。

     自顶向下的语法分析需要文法没有二义性。二义性就是一个表达式不能由两颗语法树推出。如果产生式含有左递归和左公共因子,则要先消除再进行语法分析

  

     自顶向下语法分析的两种实现:

   1:递归下降分析法

    根据产生式,将每个非终结符作为一个函数。利用递归调用的方式分析输入的句子。该方法由于递归调用的原因,对系统资源消耗大,基本不使用这种方法。 


  2:预测分析法

 第一步,求预测分析表

    根据产生式,求出每一个非终结符的FIRST集合FOLLOW集合。以终结符作为行,非终结符作为列,填入按照FIRST集合中求出的每个终结符对应的每个产生式。

     如果FIRST集合中含有∑,则将非终结符的FOLLOW集合中每一个终结符和该非终结符对应行列中填入该非终结符的∑产生式。

第二步,压栈分析。

    1:在栈中首先压入一个$符号和初始非终结符,分析串指针指向第一个字符,

    2:将第一个字符栈首符号比较,若为终结符且和字符相等,则匹配成功。弹出栈首字符,指针向右一个字符。

    3:若为非终结符则查表,若字符和非终结符对应的下面没有产生式,则报错

    4:若有产生式,则将产生式右边反向压入栈中。回到第二步。直到栈元素为$符号,字符串分析完毕