✏️

LR分析法

Created
Nov 29, 2024 12:26 AM

LR0

从左到右 规范推导
 
拓广文法:只需要把多选改掉
notion image
最开始从初始符号开始,列出初始符号可以迭代推出的文法序列,用一个指针标识输入串当前分析位置位于文法里的什么位置
找到 输入串下一个符号 = 文法的下一个符号 对应的文法,并移进,重复操作直至到达文法的终结位置,此时再规约,位置回退
构建一个下推自动机,读入某字符就转到某个文法序列的状态
 
活前缀:句型αβt,β是句柄,则αβ的任何前缀都是该句型的活前缀
有效项目:A → β1.β2 对 活前缀αβ1 有效的条件是 存在规范推导 E ⇒* αAw ⇒ αβ1β2w
notion image
活前缀 → 有效项目集:首先找到规约到当前状态时应该运用的最后一条规则(可能不唯一),把点打在活前缀的右边 对于上面的例子,即为T->T*.F (活前缀E + T *) 接着如果“.”后面的第一个符号是非终结符号,则将该符号的规则全部列出,对于上面的例子,即为F->.(E),F->.i,一直迭代下去找到闭包(其实就是那条规则推出来的一个项目集)
 

SLR

notion image
notion image
注意#和推出epsilon的情况
epsilon可以直接规约
 
 
动态存储分配
notion image
 
 
源程序中间形式
波兰表示
N-元
  • 间接三元式会省去三元式的重复代码
 
动作序列 + 输入序列,最终结果输出的终结符号串为活动序列
L-ATG
SL-ATG
notion image
 
数组模板
 
代码优化
  • 基本块划分
  • DAG图——公共子表达式删除
notion image
 
 
  • 到达定义分析
    • notion image
  • 定义使用链
  • 活跃变量分析
  • 冲突图
    • 出现在同一个in或者同一个out的:全部都算
    • notion image
  • 寄存器分配
    • 全局
    • 局部
    notion image
     
    notion image
     
    notion image