编译原理 · 冲刺参考

术语表 GLOSSARY

对齐陈火旺《程序设计语言编译原理》。考前可整本打印速记。
跳转: ①编译概念②文法③词法/自动机 ④自顶向下⑤自底向上/算符优先⑦中间代码⑩优化

① 编译概念〔L01〕

编译程序 compiler
把高级语言源程序翻译成等价目标程序的程序。
解释程序 interpreter
边翻译边执行、不产生目标程序
编译的 5 个阶段
词法分析 → 语法分析 → 语义分析与中间代码产生 → 代码优化 → 目标代码生成。
表格管理 / 出错处理
登记名字属性 / 报错恢复;两者贯穿编译全过程,非单独阶段。
前端 / 后端 front / back end
前端与源语言相关、与机器无关(词法~中间代码);后端与目标机相关(目标代码生成)。
遍(趟) pass
对源程序或中间结果从头到尾扫描一次。阶段是逻辑划分,遍是物理扫描次数。

② 文法〔L02〕

文法 grammar
四元组 G=(VN, VT, P, S):非终结符集、终结符集、产生式集、开始符号。
推导 / 归约 derivation
用右部替换非终结符叫推导(⇒);反向叫归约。最左推导每次替换最左非终结符;最右推导=规范推导
句型 / 句子 / 语言
句型:S 推出的串(可含非终结符);句子:只含终结符的句型;语言 L(G)=全部句子。
语法树(推导树)
根为 S、叶子拼成句型的树,表示推导结构。
二义性 ambiguity
存在某句子有两棵不同语法树(或两个不同最左/最右推导)。
Chomsky 分类
0型短语 / 1型上下文有关(|α|≤|β|) / 2型上下文无关(A→β,描述语法) / 3型正规(A→aB|a,描述单词)。3⊂2⊂1⊂0。

③ 词法分析与有限自动机〔L03 / L04〕

正规式 / 正规集 regular expression
由 ε、单字符、|、连接、* 构成;优先级 * > 连接 > |。它表示的串集合叫正规集。
DFA / NFA
有限自动机 (S,Σ,δ,s₀,F)。DFA 无 ε、每输入唯一转移;NFA 可有 ε 边、一输入达多状态。二者及正规式三者等价。
ε-closure(I)
从 I 出发只沿 ε 边可达的状态集(含 I)。
move(I, a)
I 中状态沿一条 a 边到达的状态集。
子集构造法 subset construction
NFA→DFA:DFA 一状态=NFA 一子集;初态=ε-closure(s₀),转移=ε-closure(move(·,a)),含原终态的子集为终态。
DFA 最小化(分割法)
先分终态/非终态两组,再按"同输入是否转入同组"反复细化,每组并为一状态。
状态转换图 / 超前搜索
词法分析器用状态图识别单词;多读一字符定边界、再退回叫超前搜索。
单词 token
常表示为二元组 (种别码, 属性值);五类:关键字、标识符、常数、运算符、界符。

④ 自顶向下分析〔L05–L08〕

左递归 left recursion
P→Pα。消除:P→Pα|β ⟹ P→βP′, P′→αP′|ε。间接左递归先代入再消。
回溯 / 左公因子
候选有公共开头 α 导致试错;提取左公因子 A→αβ₁|αβ₂ ⟹ A→αA′, A′→β₁|β₂ 消除回溯。
FIRST(α)
α 能推出的串的首终结符集;若 α⇒*ε 则含 ε。
FOLLOW(A)
句型中紧跟 A 之后的终结符集;A 可在末尾则含 #。不含 ε
SELECT(A→α)
ε∉FIRST(α) 时=FIRST(α);否则=(FIRST(α)\{ε})∪FOLLOW(A)。
LL(1) 文法
各候选 SELECT 两两不相交(左扫描·最左推导·看1符号)。
预测分析表 M[A,a]
FIRST 进对应列、含 ε 再按 FOLLOW 进列;空白=出错,冲突=非 LL(1)。
递归下降 / 分析栈
每个非终结符写一子程序(需无左递归无回溯);表驱动预测分析用栈,栈底 #、栈顶非终结符查表逆序压栈,双 # 接受。

⑤ 自底向上 与 算符优先〔L09 / L10〕

移进-归约
用栈,从输入串反复归约到 S。四动作:移进、归约、接受、报错。
短语 / 直接短语 / 句柄
子树叶子=短语;只有两代的子树叶子=直接短语;最左直接短语=句柄
规范归约 / 规范句型
每步归约句柄,是最右推导(规范推导)的逆;规范推导得到的句型为规范句型。
算符文法 OG
产生式右部无两个相继非终结符。
优先关系 ⋖ ≐ ⋗
a⋖b(低于)、a≐b(相等)、a⋗b(高于);不对称。⋖/≐ 移进,⋗ 归约(最左素短语)。
FIRSTVT(P) / LASTVT(P)
P 推出串的首/末终结符(可越过开头/结尾一个非终结符)。
优先关系表 / 优先函数
由 FIRSTVT/LASTVT 与三规则构造表;优先函数 f、g 用数值代替表(a⋖b⟺f(a)<g(b))省空间,但损失查错能力。

⑦ 中间代码〔L11〕

逆波兰式(后缀式)
运算符在操作数之后,无括号。如 a+b*c → abc*+
三元式 / 间接三元式
(op,arg1,arg2) 用序号引用;间接三元式另设间接码表存执行顺序,便于优化调整。
四元式 quadruple
(op, arg1, arg2, result),最常用。赋值 (:=, b, _, a),跳转 (j, _, _, L)
临时变量 T
翻译时存放中间结果的新变量 T1、T2…。

⑩ 代码优化〔L12〕

基本块 basic block
单入口、单出口、中间无跳转进出的语句序列。
入口语句
程序首条 / 转移语句的目标 / 紧跟转移语句之后的语句。
DAG(无环有向图)
表示基本块计算,相同子表达式共享结点 → 发现公共子表达式与无用赋值。
循环不变式外提(代码外提)
循环内每次结果不变的运算,提到循环外只算一次。
强度削弱
把强运算换弱运算,常把循环内乘法换成加法(如 4*i 改 +4)。
归纳变量
随循环规律变化的变量;只用于控制循环时可删除/替换。