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

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

          终结符:数字(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:若有产生式,则将产生式右边反向压入栈中。回到第二步。直到栈元素为$符号,字符串分析完毕












    




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
自顶向下语法分析程序是一种应用于编译器设计和语言处理的算法。它基于产生式规则的递归调用过程,通过分析输入的语法来构建语法树。 在C语言中,自顶向下语法分析程序可用于验证源代码的语法正确性,并将其转化为可以执行的目标代码。通常,自顶向下语法分析程序具有以下几个主要步骤: 1. 词法分析:将输入的源代码分割成一个个的词法单元,如变量、关键字、运算符等。 2. 语法定义:通过产生式规则定义语法的结构,例如语句、表达式、循环等。 3. 语法分析:根据产生式规则进行递归调用,将输入的词法单元转化为语法树的分支。 4. 错误处理:如果在语法分析过程中发现不符合语法规则的错误,程序会进行相应的错误处理并报告错误信息。 5. 语义处理:根据语法树进行语义分析,包括符号表的建立和类型检查等。 6. 目标代码生成:根据语法树和符号表,将源代码转化为可以执行的目标代码,如机器码或中间代码。 C语言的自顶向下语法分析程序通常使用递归下降分析法实现,通过函数的递归调用来表示产生式规则的应用顺序。函数的每个调用对应一个产生式规则,通过逐步分解输入的语法单元,最终构建出完整的语法树。 自顶向下语法分析程序在编译器设计中具有重要的作用,能够帮助开发者检测和调试代码中的语法错误,并将其转化为可执行的目标代码。同时,自顶向下语法分析程序也为其他语言处理工具提供了基础,如语法高亮显示、代码格式化和自动补全等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酒徒词客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值