编译原理

编译原理

编译原理期末速成,短时间内应对期末考试


考试类型

  • 选择
  • 填空
  • 简答
  • 大题
    • 中间代码生成:三元式序列,四元式序列优化
    • 词法分析——自底向上分析方法:LR分析表,LR(0)、SLR(1),项目集规范族
    • 自动机基础理论:状态转换图,NFA,DFA,NFA——DFA,化简
    • 词法分析——自顶向上分析方法:消除左递归,求SELECT集,FOLLOW集,LL(1)分析表
    • 文法与语言:文法规范推导,短语,句柄,二义性,正则文法,语言
    • 正则表达式:已知语言构造文法
    • 词法分析:简单优先关系分析,算符优先分析

基本概念

字母表:有限符号的集合
符号串:符号的有限序列

文法:G[S]={VT,VN,P,S}
终结符集:VT字母表中的符号
非终结符集:VN不在字母表中的符号,中间符号
语言:
文法分类:0型文法> 1型文法> 2型文法> 3型文法(正则文法)
正则文法:G[S],中P的每个规则,都具有下列形式:

规范推导:最右推导(最左规约)
句型,句子:

文法树:

  • 子树
  • 短语:给定一个句型,其分析树中每棵子树的边缘称为该句型的短语
  • 简单短语:如果子树高度为2,那么这棵子树的边缘称为该句型的简单短语
  • 句柄:最左简单子树的边缘节点组成的符号串

二义性文法:如果一个文法可以为某个句子生成多棵文法树
正则表达式:用来描述正则文法的表示方法

词法分析

读入源程序字符串,从左至右逐个扫描,并从其中识别出一系列具有独立意义的最小语法单位——单词(token)


语法分析——自顶向下分析方法

目的:从文法开始符号开始,构造一棵文法分析树,得到目标句子
从开始符号开始,自左向右对标给定符号串,选取符合的候选式替代非终结符,构造推导过程(最左推导),导出给定符号串
回溯现象:同一非终结符的多个候选式存在共同前缀,导致碰到终结符时,要选择候选式试错,选出正确的候选式
左递归文法:会陷入死循环

消除左递归:
1、直接左递归:A→Aα|β

消除左递归:A→βA';A'→αA'|ɛ

2、间接左递归:

例:S→Aa|b;A→Ac|Sd|ɛ
    S→Aa→Sda出现左递归
 将S的定义带入A的产生式,得:
 A→Ac|Aad|bd|ɛ
 消除直接左递归:
 A→bdA'|A'
 A'→cA'|adA'|ɛ
因此,消除左递归,得:
S→Aa|b
A→bdA'|A'
A'→cA'|adA'|ɛ

语法分析——自顶向上的分析方法

LL(1)文法
无左递归,无回溯的文法

Follow集:可能在某个句型中紧跟在A后边的终结符a的集合Follow(A)={a|S→αAaβ},
First集:First(X):可以从X推导出的所有串首终结符集构成的集合如果X→
ɛ,那么ɛ∈First(X)
看产生式的右部,如果产生式的右部是终结符,那么把这个终结符加入first集中
如果可以推导出空串,就把空串加入到first集中
如果产生式的右部是非终结符,那么就把这个非终结符的first集加入到first集中
如果X是个终结符,那么X的first集就是这个终结符

Select集:候选式集,设有文法G[S],且有规则A→β,则
Select(A→β) =First(β),β≠ɛ
=follow(A),β=ɛ
构造LL(1)分析表M[A,a]
组成:第一行是输入符号串以#结尾,第一列是非终结符和推导式右部中不曾在首部的非终结符以#结尾,中间部分就是动作
规则:

  • C表示继续读下一个符号
  • R表示重读当前符号
  • RE(β)表示用β的逆串替换分析栈栈顶符号
  • 对于A→Dβ,且select(A→Dβ)={a1,a2.....},那么M[A,ai]=RE(Dβ)/R,表示用Dβ的逆串替代栈顶符号后重读当前符号
  • 对于A→aβ,那么M[A,a]=RE(β)/C,表示用β的逆串替代栈顶符号后读取下一位符号
  • 对于A→ɛ,且select(A→ɛ)={a1,a2.....},那么M[A,ai]=RE(ɛ)/R
  • 对于所有的非终结符a且a不出现在任何规则的右部的首部,则M[a,a]=RE(ɛ)/C
  • M[#,#]=succ

用LL(1)分析表分析输入串是否属于该文法


语法分析——自底向上分析方法

从给定的符号串,逐步规约,直到文法的开始符号

自底向上分析方法又称为“移进-归约”分析法,这是因为,在自底向上分析过程中,普遍采用一个先进后出的分析栈,分析开始后,将输入符号自左而右逐个移进分析栈,边移入边分析,当栈顶符号串形成某个句型的句柄时,就进行一次归约,即用相应产生式的左部非终结符替换当前句柄。接着查看栈顶是否形成新的句柄:若栈顶是句柄,就再进行归约;若栈顶不是句柄,则继续移进后续输入符号……,重复上述过程,直到将整个输入符号串处理完毕,此时分析栈中若只有文法的开始符号,说明分析成功,也就确认输入符号串是文法的一个句子;否则,分析失败,表明输入符号串不是文法的一个句子,其中必定存在语法错误。

简单优先分析方法

判断文法中各个符号的简单优先关系(包括终结符和非终结符)构造简单优先关系矩阵

算符优先分析方法

判断文法终结符的优先关系,构造算符优先关系矩阵
构造算符优先关系矩阵:
1. 对G中每个非终结符A构造两个终结符号集合

posted @ 2023-04-25 15:28  yuxin!!  阅读(85)  评论(0)    收藏  举报