【编译原理】原理笔记

随便记点防止期末烂掉

自顶向下

直接左递归的消除

实际就是左递归转右递归

法1:直接替换

AAα|β{AβA,AαA|ϵ


法2:矩阵法

前置知识:

I=(ϵϵ)A=I+AA

原理:

XXA|BX=BA

例题

SAS|b,ASA|aS=AS+b,A=SA+a(S,A)=(S,A)(AS)+(b,a)(S,A)(b,a)(AS)Z=(AS),Z=I+(AS)Z(S,A)=(b,a)ZZ=I+(AS)Z

求FIRST集

就只看右边推出来的第一个字符就好了

AB:FIRST 就是 B 的第一个字符(B可以是一坨)

求FOLLOW集

起始符先加入一个 # 到集合中

看右边的右边:BαAββ 可以是一坨东西)
看产生式右边的 β

  1. β 是终结符,= 终结符
  2. β 是非终结符,= FIRST(β)- ε
  3. β 是空,= FOLLOW(B

FOLLOW里面不可能有 ϵ

XVN,有 # FOLLOW(X),条件是: SαX,其中 α(VNVT)

SELECT集

对于 Aα

α 能推出空:{FIRST(α)ϵ}{FOLLOW(A)}
α 不能推出空:FIRST(α)

LL(1)文法

同一非终结集的文法的 SELECT 集无交集

自底向上

LR(0)分析表构造

1.扩展文法:加一条 EE,并且把所有并在一起的拆开来写成单产生式
2.写 I0:扩展后的文法,每一条右边加上 ·,比如 EE 变为 E·E
3.对 I0 中的每一条产生式分析,根据 · 后面接收的字符转移到下一个状态。新状态中 · 右移一位,右移后 · 的右边如果接的是非终结符,则要把该非终结符对应的所有产生式写在当前新状态里。例:E·ET 接收 E 转移到 {EE·TT...T...}
4.注意新生成的状态中,如果产生式是已经存在于某个状态的,就直接转移过去(也有可能转移到自身)
5.一直重复对状态的转移,直至状态中所有的产生式的 · 都在最右边
6.状态转移图生成完之后就可以开始写分析表了,框架是:列为状态,有多少个状态就写多少列;行是所有产生式右侧出现过的符号,分为终结符ACTION和非终结符GOTO
7.接着开始根据状态图填表:按出边填

  1. 当前状态有出边:转移到ACTION要在状态前加一个s,转移到GOTO直接写下状态的数字
  2. 当前状态无出边(终结态):如果当前状态对应的是第 i 条产生式,直接把这一行的ACTION全部写上 ri
  3. 确定 acc 态:EE· 所在的状态,# 那列

例题

参考

LR(0) 分析步骤

分析串s

1.表头:状态,符号,输入串
2.第一行:0,#,s#
3.查ACTION表,看上一行状态的最后一位接收串的第一个字符后到达什么状态:

  1. si :状态后加上 i当前输入串的第一个字符挪到符号后;
  2. ri :找到第 i 个产生式,把符号后缀对应的产生式右侧(假设长度为 n)替换为左侧非终结符此时为了保证状态数和符号数一样,对应状态也要舍去后面的n 个状态。舍去后状态数比符号数少一个,继续查GOTO表当前状态的最后一位接收符号的最后一位得到的数字填上去,保证数量一样。输入串不变。
  3. acc:接收成功,分析结束
    4.注意状态数和符号数始终相等

例题


参考

第五章

综合属性继承属性

参考

addtype
参考

$$:产生式左侧的字符的属性

posted @   Sakana~  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示