自上而下分析

本文探讨了自上而下语法分析面临的五大挑战,包括左递归、回溯不确定性等问题,并提出了解决方案,如改造文法、消除左递归等。同时介绍了如何通过定义FIRST集来消除回溯。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1.自上而下分析面临问题
   1. 文法的左递归问题
   2.回溯的不确定性,要求我们将已经完成工作推倒从来,
   3.虚假匹配的问题
   4.不能准确地确定输入串中出错的位置
   5.效率低
 2.消除回溯
1.消除回溯的要求
 对文法的任何非终结符,当要它去匹配输入串时,能够根据该非终结符所面临的输入符号准确地指派它的一个候选式去匹配,并且此候选式匹配后得到的工作结果应该是确信无疑的,即:
 (1)若该候选式匹配成功,那么该匹配不是虚假匹配
 (2)若该候选式无法完成最终的匹配任务,则其他任何候选式肯定也无法完成。
2.消除回溯的条件
 定义FIRST集
 令文法G是不含左递归的文法,对G的非终结符的候选α,定义它的开始符号(终结首符)集合:
特别地,如果α   ε,则ε∈FIRST(α)
如果非终结符A的任意两个候选式αi和αj的开始符号集满足FIRST(αi)∩FIRST(αj)=Φ,则A可以根据所面临的第一个输入符号,准确地指派一个候选式α去执行任务,α是那个FIRST集含a的候选式,即  a ∈FIRST(α)。
3.改造文法
  问题:
 对于许多程序设计语言的文法,都有产生式
  语句→if 条件 then 语句 else 语句
   | if 条件 then 语句
这两个候选式的FIRST集合相交不为Φ。


3.消除文法左递归
按任意顺序对非终结符排序,P1,P2,P3……,然后作如下工作
   FOR i=1 TO  N{
     FOR j=1 TO i-1{
      对PiPjγ的产生式,改写成
    Piδ1 γ| δ2 γ|…| δk γ
    } 
    消除Pi的直接左递归;
  }
 最后,删除无用的非终结符的产生式


4.预测分析程序
    使用高级语言的递归过程描述递归下降分析器,只有当具有实现这种过程的编译系统时才有实际意义。
实现LL(1)分析的另一种有效方式是使用一张分析表和一个栈进行联合控制。我们现在介绍的预测分析程序就是属于这种类型的LL(1)分析器。

感悟总结

语法分析是编译过程的核心,目的是判断一个输入串是否符合语法规则。

老师对重点进行了讲解,课程很难,课前预习就比较困难,希望能通过自己的学习,对这门课了解,能学到一些东西,对以后有帮助。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值