这几天来在复习编译原理,下面进行一个浅浅总结,加深一下印象并且方便后面查看复习。
程序设计语言
1.机器语言 2.汇编语言 3.高级语言
翻译方式
编译程序,输入源程序在编译程序(编译器)转化下,转化目标语言,后再目标语言输入,输出。
解释程序,源程序输入,在解释程序下直接输出。
编译过程
源程序-->词法分析-->语法分析-->语义分析-->
中间代码生成-->代码优化-->目标代码生成-->目标程序
形式文法和语言
符号串,逆,前缀,幂,闭包
文法
一个四元组:G[S]=(VN,VT,P,S) 非终结符,终结符,规则,开始符
推导符号,句型,句子,语言集合L(G)
形式文法
0型文法:每一个产生式,且至少包含一个非终结符,
相当于一个图灵机,和上下文无关,递归可枚举
1型文法(上下文有关):满足,S->ε除外
2型文法(上下文无关):,非终结符,V*
右线性文法:A->aB或者A->a形式
左线性文法:A->Ba或者A->a形式
正规文法:左线性和右线性统称
正规文法,正规式
最左推导,最右推导(也称规范推导,推出句型称规范句型)
短语 直接短语 句柄(最左直接短语)
自动机
DFA 确定的有穷自动机
初态唯一,K*输入符号->K一个映射
NFA 不确定的有穷自动机 初态非空集合不唯一,K*输入符号->
确定化
子集构造法 分割子集
最小化
消除等价状态
正规式与正规文法与有穷自动机
构造NFA后进行确定化和最小化
词法分析
识别单词符号,输出<词法单元名,属性值>
单词符号:标识符,常数,关键字(基本字/保留字),运算符(+,-,*等),界符(逗号,分号,括号等 )
识别空格,识别单词符号
确定的自顶向下语法分析
LL(1)文法
First集合,Follow集合,Select集合
分析方法:预测分析法,递归子程序法
LL(1)条件:相同左部Select集合不相交 Select(A->aB),Select(A->b)相交为空
预测分析表,基于select集合整合信息分析的依据。
非LL1文法:消除左递归和提取左公因式转换LL1文法
自下向上优先分析
简单优先分析
优先规则
算符优先分析 Firstvt Lastvt集合
LR分析
LR(0)分析 项目集合规范族 没有移进,规约冲突 规约规约冲突
SLR(1) 解决了部分 移进,规约冲突
LR(1)多加入first集合信息,解决冲突
LALR(1)合并LR(1)同心集合
中间代码生成
属性文法A=(G,V,F)
继承属性(沿着树向上传播) 综合属性(向下)
非终结符都可能,开始符号没有继承属性,只有综合属性,终结符只有综合属性
中间代码形式
逆波兰式子
三元式(OP,ARG1,ARG2)
四元式(三元式,RET)
代码优化
基本块 语句入口到下一入口(不包括下一入口),转移语句(包括),停止语句(包括)
局部优化,全局优化,循环优化
符号表 运行时存储
好的先丢这里吧