编译原理期末补漏知识点
-
LL(1)文法的明显性质——没有公共左因子、不是二义的、不含左递归
第一个L代表从左向右地扫描输入、第二个L表示产生最左推导
-
LR(k)分析技术,L是指从左向右扫描输入,R是指构造最右推导的逆,k是指在决定分析动作时向前查看的符号个数,k省略时,表示k是1
-
指令的代价
(1)指令MOV R0,R1 把寄存器R0的内容复写到寄存器R1,这系指令的代价是,1,因为他仅占1个字的内存。
(2)指令MOV RS、M把资存器R5的内容复写到内存单元M。这条指令的代价是2,因为内存单元的地址M存于指令的第二个字中。
(3)指令ADD #I,R3把常数1加到寄存器R3的内容上。这条指令的代价是2.因为常数1出现在指令的第二个字中。
(4)指令SUB 4(RO),*12(RI)把值contents(contens(12+contens(RI)))-contents(4+contents(RO))存入目的地址 *12(R1)。这条指令的代价是3,因为常量4和12存于指令的第二个和第三个字中。
- 结构等价和名字等价
如果类型表达式仅由类型构型构造符作用于基本类型组成,则两个类型表达式等价的自然想法是结构等价,即两个表达式要么是同样的基本类型,要么是同样的类型构造符作用于结构等价的类型。也就是,两个类型表达式结构等价,当且仅当它们完全相同。
当名字允许出现在类型表达式中时,类型等价的两种不同概念出现了,它们取决于如何看待名字
按结构等价的观点,先把两个类型表达式中所有的类型名字用它们定义的类型表达式代换,完成代换后的两个类型表达式结构等价的话,则认为原来的两个类型表达式结构等价。
按名字等价的观点,不同的类型名看成不同的类型,因此两个类型表达式名字等价当且仅当这两个类型表达式不做名字代换就结构等价。
-
活前缀的有效项目集,就是当栈内的符号是这个活前缀的时候,可能运用的下一步的最左规约的规则。
一个活前缀可能有多个有效项目
-
术语状态表示将存储单元映射到它所保存值的函数,赋值改变状态(对)
-
术语环境表示将名字映射到存储单元的函数,赋值改变环境。(错)
-
静态单赋值形式(SSA)中部分赋值指令是对相同名字变量赋值(错)
在静态单赋值形式(SSA)中,每个变量在其生命周期内确实只被赋值一次,但这并不意味着每个变量的每个赋值都会对相同的变量名进行。相反,SSA会引入新的变量名或者使用一些特殊的命名规则,以确保每个赋值都有一个唯一的名字,且每个变量名只对应一个定义点。
LL文法预测表的构造
LL(1)分析过程的书写 栈
预测翻译器
汇编代码的书写
-
过程调用时,活动记录被压入运行栈,由栈底至栈顶的内容分别是返回值和参数、控制链和保存的机器状态、临时数据和局部数据
-
自底向上的语法分析方法的关键问题是如何判定句柄
-
下面关于基本块的描述
A. 基本块是一个连续的三地址语句序列
B. 控制流从基本块的开始进入
C. 基本块可作为流图的结点
- 编译器各阶段之间的中间表示需显式构造。 (错)
不同的编译器可能选择在不同的阶段引入中间表示,或者干脆避免使用中间表示。这种选择取决于编译器设计者的偏好、目标和优化策略。因此,强调“必须在各个阶段显式构造中间表示”是不准确的。
- 词法分析的主要任务是扫描输入词法记号流,产生用于语法分析的字符序列 (错)
词法分析的主要任务是扫描输入的字符流,识别并产生用于语法分析的词法记号流
- 通过重写文法一定可以消除二义性(错)
通过重写文法,并不一定能够完全消除文法中的二义性。有些文法可能具有固有的二义性,需要采用其他方法来处理。
- 文法的活前缀是它的左句型的前缀(错)
右句型的前缀,而且其不含句柄之后的任何符号,之前的可以,所以找到句柄是关键。
- “枚举类型的元素不能重复”属于类型检查相关的内容。(错)
是属于静态语义分析中的唯一性检查(uniqueness checks),可参考博主“运行环境”文章最后一段
-
类型检查是语义分析的一个部分
-
复写传播可能会引起其他的优化机会。(对)
文法的分类
由0型文法生成的语言L(G)称为0型语言,也叫短语结构语言(PSL Phrase Structure Language**)或递归可枚举集**(recursively enumerable set)。它可由图灵机识别。
由1型文法产生的语言L(G)称为1型语言或上下文有关语言CSL(CSL Context Sensitivie Language)。它可由线性限界自动机识别。
由2型文法产生的语言L(G)称为2型语言或上下文无关语言CFL(CSL Context Free Language)。它可由下推自动机识别。
由3型文法产生的语言L(G)称为3型语言或正则语言(RL Regular Language**)或者正规语言**。它可由有限自动机识别。右线性文法和左线性文法属于3型文法的一部分
-
活动树中,每个结点代表一个函数
-
有向无环图是一种比语法树更紧凑的图形化中间表示
-
语法树的内部节点由非终结符标记
-
解释器不需要执行目标代码生成
-
可以丰富所表达的类型的是类型构造符 也就是自己定义类型
-
如果a和b都是过程活动,那么在活动树中 结点a处于结点b的左边 ,当且仅当a的生存期先于b的生存期
语法树:
语法树中,算符和关键字不是作为叶节点,而是作为分支节点
语法树中另一个简单的地方是单非产生式链可能消失
语法树作为一种中间表示,允许把翻译从分析中分离出来,形成先分析后翻译的方式
语法制导翻译可以基于分析树,也可以基于语法是,方法是一样的
- 没有两个基本块是等价的(错)
两个基本块之间的等价性取决于其执行语义。如果两个基本块在所有可能的输入情况下产生相同的结果,并且不影响程序状态(如寄存器值),那么它们可以被认为是等价的。这种等价性通常是在进行优化时考虑的因素之一。
但也不是绝对的
什么是文法的二义性?若文法为二义文法,那么构造分析器时需要对文法做怎样的处理?
文法的某个句子有不止一颗分析树与之对应,那么称该文法是二义的。 有些类型的分析器希望处理文法是无二义的,需要消除文法二义性。 有些类型的分析器允许文法二义,但文法要附带消除二义性的规则。
满足何种条件的文法被称为LL(1)文法?
对文法的任何两个产生式 A→α|β 都满足以下条件 FIRST(α)∩FIRST(β)=Φ 若 β=>* ε,那么 FIRST(α)∩FOLLOW(A) =Φ 满足这两个条件的文法叫做 LL(1)文法。
简述中间代码以及目标代码的含义。
中间代码:生成源程序的一种便于优化和便于产生目标代码的内部表示; 目标代码:根据目标机特点从中间代码产生高质量目标代码。
-
分析器不允许文法二义(错)
-
一个正规语言可能对应多个正规文法
-
5、符号表可以分为:关键字(保留字)表、层次表、符号表(过程表、变量表、标号表)、常数表等
.不确定的有限自动机包括哪 5 个部分?
:一个有限的状态集合
一个输入符号集合
一个转换函数
唯一的开始状态
接受状态集合
静态单赋值形式(SSA)有哪几个显著特点,可使它区别于三地址代码?
第一个特点是 SSA 中所有赋值指令是对不同名字变量赋值。 第二个特点是在同样的变量定值在不同的控制流路径上时,使用称作 Φ 函数的记号约 定,以组合不同定值