day06_编译原理学习

第四章 语法分析

递归的预测分析

  • 递归的预测分析法是指:在 递归下降分析 中,编写每一个非终结符对应的过程时,根据预测分析表进行产生式的选择

非递归的预测分析法

  • 非递归的预测分析不需要为每个非终结符编写递归下降过程,而是根据预测分析表构造一个自动机(下推自动机),也叫表驱动的预测分析过程
    • 下推自动机 利用 栈结构 进行记录

表驱动的预测分析法

递归的预测分析法vs.非递归的预测分析法

总结预测分析法实现步骤

  • 1)构造文法
  • 2)改造文法:消除二义性,消除左递归,消除回溯
  • 3)求每个变量的FIRST集和FOLLOW集,从而求得每个候选式的SELECT
  • 4)检查是否是LL(1)文法。若是,构造预测分析表
  • 5)对于递归的预测分析,根据预测分析表为每一个非终结符编写一个过程;对于非递归的预测分析,实现表驱动的预测分析算法

预测分析中的错误处理

  • 两种情况下可以检测到错误
    • 栈顶的终结符和当前输入符号不匹配
    • 栈顶的非终结符与当前输入符号在预测分析表对应项中的信息为空

预测分析中的错误恢复

  • 恐慌模式
    • 忽略输入中的一些符号,直到输入中出现由设计者选定的同步词法单元(synchronizing token)集合中的某个词法单元
      • 其效果依赖于同步集合的选取。集合的选取应该使得语法分析器能从实际遇到的错误中快速恢复
        • 例如可以把FOLLOW(A)中的所有非终结符放到非终结符A的同步记号集合中
    • 如果终结符在栈顶而不能匹配,一个简单的办法就是弹出此终结符
  • 例子:
    • 分析表的使用方法
      • 如果M[A,a]是空,表示检测到错误,根据恐慌模式,忽略输入符号a
      • 如果M[A,a]是synch,则弹出栈顶的非终结符A,试图继续分析后面的语法成分
      • 如果栈顶的终结符和输入符号不匹配,弹出栈顶的终结符

自底向上的语法分析

  • 从语法树的 底部(叶节点)向顶部(根节点)方向构造分析树
  • 可以看成是将输入串的w归约为文法开始符号的S的过程
  • 自底向上的语法分析采用最左推导。
    •  自底向上的语法分析采用最左归约方式(反向构造最右推导 )
  • 自底向上语法分析的通用框架
    • 移入-归约分析(Shift-Reduce Parsing)
      • 要点:
        • 每次归约的符号串称为“句柄”,也是句型的最左短语
        • 栈内符号串 + 剩余输入 = “规范句型”
      • 工作过:
        • 在对输入串的一次从左至右扫描过程中,语法分析器将零个或多个输入符号移入到栈的顶端,直到它可以对栈顶的一个文法符号串\beta进行归约为止
        • 然后,它将\beta归约为某个产生式的左部
        • 语法分析器不断重复这个循环,直到它检测到一个语法错误,或者栈中包含了开始符号的且输入缓冲区为空(当进入这样的格局时,语法分析器停止运行并宣称成功完成了语法分析)为止
      • 移入-归约分析器可采取的4种动作:
        • 移入:将下一个输入符号移到栈的顶端
        • 归约:被归约的符号串的右端必然处于栈顶。语法分析器在栈中确定这个串的左端,并决定用哪个非终结符号来替换这个串
        • 接收:宣布语法分析过程成功完成
        • 报错:发现一个语法错误,并调用错误恢复子例程
      • 关键问题:
        • 例子的失败情况(造成错误的原因:错误地识别了句柄)
        • 例子的成功情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值