【理论】编译原理导论

1.编译过程概述 : 
词法分析 : 对源程序的字符流进行扫描和分解,识别出一个个单词符号
语法分析 : 将单词序列分解成各类语法短语(这种语法单位可以表示成语法树)
语义分析 : 对源程序进行类型审查,为代码生成收集信息;
中间代码生成 : 把源程序变成内部表示(三地址指令的四元式 : 运算符,运算对象1,运算对象2,结果),设计原则 : 容易生成,容易翻译成目标代码
代码优化 : 对中间代码进行变换改造,使目标代码省时省空间;
目标代码生成 : 把中间代码转换成具体机器的绝对指令;


2.四种文法类型(存在等价文法,语言和文法是一对多的关系)
0型文法(短语文法) : 能力相当于图灵机,等价于'递归可枚举'
1型文法(上下文有关文法) : aAb->aBb只有A出现在ab的上下文中,B才可替换A
2型文法(上下文无关文法) : 用B替换A时,与A所在的上下文无关;
3型文法(正规文法) : 形如A->aB或A->a,其中A,B非终结,a终结符

3.式图转换
(1)正规式转NFA:
aa (X1) a-> (X2) a-> (X3)
a|b (X1)  a-> (X2)
 |b-> (X3)
(a)* (X1)->  (X2)  ->(X3)
   | a-> |
(2)NFA转DFA:
状态(equel) 跳转状态(move a) 跳转状态(move b)...
S S的等价move一个a所达到的等价状态集
...
(3)最简化DFA:
一致性(Vt,Vn)
蔓延性(看跳转集)

ps: DFA一个输入只跳一个状态,图中不存在空输入;
    正规式形如:aa(a|b)(a)*b
文法->句型->句子(Vt)->语言: 语言对于一个等价文法集

4.自顶向下语法分析
a.消除左递归
P->Pa|b : P->bQ , Q->aQ|#
b.消除回溯
P->Qa|Qb : P->Q(a|b)

First集: 左边->右边 取右边第一个终结符
直接取终结符
若首符非终结,继续深入
First集可以包含空字符

Follow集: 右边里紧跟其后的终结符
直接找后跟终结符
找后跟非终结符的First集
考虑后跟的非终结符取空
本身如果可取空,添加左邻Vt的Follow集
Select集:
Select(A->a) = First(a) | First(a)-# + Follow(A)

Ps:

LL(k)最左推导,只需看k个符号就可决定如何推导

 

附加:

算术表达式文法:

E->E+T|E-T|T

T->T*F|T%F|

F->i|(E)

消回溯后:

E->TE'

E'->+TE'|-TE'|#

T->FT'

T'->*FT'|/FT'|#

F->i|(E)

其中i代表变量或者数字;

改天有空附一个表达式的语法匹配,C++版;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1解:源程序是指以某种程序设计语言所编写的程序。目标程序是指编译程序(或解释程序)将源程序处理加工而得的另一种语言(目标语言)的程序。翻译程序是将某种语言翻译成另一种语言的程序的统称。编译程序与解释程序均为翻译程序,但二者工作方法不同。解释程序的特点是并不先将高级语言程序全部翻译成机器代码,而是每读入一条高级语言程序语句,就用解释程序将其翻译成一段机器指令并执行之,然后再读入下一条语句继续进行解释、执行,如此反复。即边解释边执行,翻译所得的指令序列并不保存。编译程序的特点是先将高级语言程序翻译成机器语言程序,将其保存到指定的空间中,在用户需要时再执行之。即先翻译、后执行。 2解:一般说来,编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。 3解:C语言的关键字有:auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while。上述关键字在C语言中均为保留字。 4解:C语言中括号有三种:{},[],()。其中,{}用于语句括号;[]用于数组;()用于函数(定义与调用)及表达式运算(改变运算顺序)。C语言中无END关键字。逗号在C语言中被视为分隔符和运算符,作为优先级最低的运算符,运算结果为逗号表达式最右侧子表达式的值(如:(a,b,c,d)的值为d)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值