Compiler Basic Notes
Basic Concepts
Definition of compilers
program_code
---compiler---> executable- data ---executable---> output
e.g Fortran(formula translation) 1 project
Structure of compilers
front-end to back-end:
- front-end: src ---lexical analysis---> tokens ---parsing/syntax analysis---> AST(Abstract Syntax Tree) ---semantic analysis---> intermediate
- back-end: intermediate ---...---> ... ---...---> ... ---code generation---> dist
details:
- lexical analysis(词法分析)
- parsing/syntax analysis(语法分析)
- semantic analysis(语义分 析): type and scope
- optimization
- code generation: translate to other high level language/assembly code/machine code
文法与语言
符号与符号串
- 字母表/符号集: 元素的非空有穷集合
- 符号串: 字母表中的符号组成的任何有穷序列
- 固有头/尾: 非空首/尾子串
- 闭包:
Σ* = Σ0 U Σ1 U ... U Σn ...
. - 正闭包:
Σ* = Σ1 U ... U Σn ...
.
文法与语言的形式化表示
- 文法 (Grammar):
G = (Vn, Vt, P, S)
, 非终结符集, 终结符集, 规则/产生式集, 开始符号. - 语言 (Language):
L(G) = {x | S -> x, x <- Vt}
文法 G 一切句子的集合. - 句型: rhs of P, 句子: 不含非终结符的右部
- 直接推导:
v -> w
, 闭包推导:v -*> w
, 正闭包推导:v -+> w
.
乔姆斯基文法体系
- ((((3)2)1)0)
- 0 型文法: 任意文法
- 1 型文法: 上下文有关文法(context sensitive) αAβ -> αηβ
- 2 型文法(语法工具): 上下文无关文法 A -> α
- 3 型文法(词法工具): 正规文法
上下文无关文法
文法表示
G = (S, N, T, P):
- S: 开始符
- N: 非终结符集合
- T: 终结符集合
- P: 产生式规则集合 X
->
beta1, beta2, ..., betaN, X<-
N, beta<-
N+T
形式化表示
简易表示
Sentence -> Noun Verb Noun
Noun -> sheep
| tiger
| grass
| water
Verb -> eat
| drink
S: Sentence, N: Sentence/Verb/Noun, T: sheep/tiger/grass/water/eat/drink
E -> num
|id
|E + E
|E `*` E
S: E
, N: E
, T: num/id/+/*
.
巴科斯范式
Backus-Naur Form:
::=
:被定义为
.word
: 字符本身.- 双引号外的字: 语法部分.
- 尖括号(
< >
): 必 选项(非终结符). - 方括号(
[ ]
) : 0/1. - 大括号(
{ }
) : 0/n. - 竖线(
|
) :OR
.
正规文法
正规文法可与正则语言相互转化:
- A -> aB|Ba
- A -> a
正则语言(Regular Expressions)
基本定义
对于给定的字符集 C:
- 空串
"\0"
是正则表达式. - 任意
char <- C
是正则表达式. - 若
M
,N
是正则表达式, 则M|N = {M, N}
,MN = {mn|m <- M, n <- N}
,M* = {"\0", M, MM, MMM, ...}
(选择/连接/闭包) 也是正则表达式.
形式表示
# 具有顺序性
e -> "\0" # basic definition
| c # basic definition
| e | e # recursive definition
| ee # recursive definition
| e* # recursive definition
正则语法糖(Syntax Sugar)
[a-z]
: a|...|z- c? : 0/1 个 c
- c+ : 1/n 个 c
c{i, j}
: i-j 个 c- "a*" : a* 自身(非 Kleene Closure)
- . : 除 ‘\n’ 外的任意字符
// 标识符
const identifier = /[a-z_]\w*/gi
// decimal integer
const integer = /(\+|-)?(0|[1-9]\d*)/g
// decimal float
const float = /(\+|-)?(0|[1-9]\d*)?\.\d+/g
分析树
进行文法推导时生成的树:
- 根 : 开始符
- 内部结点 : 非终结符
- 叶子结点 : 终结符
- 层 : 一步推导(优先级影响推导顺序)
- 叶子结点串: 最终表达式
- 后序遍历 : 最终结果
推导类型
- 最左推导(leftmost)
- 最右推导(rightmost)(规范推导)
句型分析
- 短语: 若
S -*> Aβ, A -+> α
, 则称 α 是句型 αβ 相对于非终结符 A 的短语 - 直接短语:
S -*> Aβ, A -> α
. - 一个右句型的直接短语称为该句型的句柄(用于自下而上的归约分析)
- 最左归约: 归约最左的句柄, 最右归约: 归约最右的句柄
meaning function(多对一)
L(syntax) = semantic: 多个语法对应一个语义(不同形式的表达式对应同一个意思)
二义性文法(一对多)
- 最左推导与最右推导得出的分析树不一致
- 若给定文法 G, 对于句子 s, 其有 2 种不同的分析树, 则称 G 是二义性文法
- 若一个上下文无关语言的所有文法都是二义性文法, 则称此语言是先天二义语言
文法重写
E -> E + T
|T
T -> T * F
|F
F -> num
|id
消除 + 与
*
的二义性, 如 3+4*
5