导航:首页 > 源码编译 > 编译原理tac序列

编译原理tac序列

发布时间:2022-07-18 23:49:46

编译原理全部的名词解释

书上有别那么懒!。。。。
编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成
解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序。解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。
编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序)。
解释程序和编译程序的根本区别:是否生成目标代码
句子的二义性(这里的二义性是指语法结构上的。):文法G[S]的一个句子如果能找到两种不同的最左推导(或最右推导),或者存在两棵不同的语法树,则称这个句子是二义性的。
文法的二义性:一个文法如果包含二义性的句子,则这个文法是二义文法,否则是无二义文法。
LL(1)的含义:(LL(1)文法是无二义的; LL(1)文法不含左递归)
第1个L:从左到右扫描输入串 第2个L:生成的是最左推导
1 :向右看1个输入符号便可决定选择哪个产生式
某些非LL(1)文法到LL(1)文法的等价变换: 1. 提取公因子 2. 消除左递归
文法符号的属性:单词的含义,即与文法符号相关的一些信息。如,类型、值、存储地址等。
一个属性文法(attribute grammar)是一个三元组A=(G, V, F)
G:上下文无关文法。
V:属性的有穷集。每个属性与文法的一个终结符或非终结符相连。属性与变量一样,可以进行计算和传递。
F:关于属性的断言或谓词(一组属性的计算规则)的有穷集。断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。
综合属性:若产生式左部的单非终结符A的属性值由右部各非终结符的属性值决定,则A的属性称为综合属
继承属性:若产生式右部符号B的属性值是根据左部非终结符的属性值或者右部其它符号的属性值决定的,则B的属性为继承属性。
(1)非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性。
(2) 终结符只有综合属性,没有继承属性,它们由词法程序提供。
在计算时: 综合属性沿属性语法树向上传递;继承属性沿属性语法树向下传递。
语法制导翻译:是指在语法分析过程中,完成附加在所使用的产生式上的语义规则描述的动作。
语法制导翻译实现:对单词符号串进行语法分析,构造语法分析树,然后根据需要构造属性依赖图,遍历语法树并在语法树的各结点处按语义规则进行计算。
中间代码(中间语言)
1、是复杂性介于源程序语言和机器语言的一种表示形式。
2、一般,快速编译程序直接生成目标代码。
3、为了使编译程序结构在逻辑上更为简单明确,常采用中间代码,这样可以将与机器相关的某些实现细节置于代码生成阶段仔细处理,并且可以在中间代码一级进行优化工作,使得代码优化比较容易实现。
何谓中间代码:源程序的一种内部表示,不依赖目标机的结构,易于代码的机械生成。
为何要转换成中间代码:(1)逻辑结构清楚;利于不同目标机上实现同一种语言。
(2)便于移植,便于修改,便于进行与机器无关的优化。
中间代码的几种形式:逆波兰记号 ,三元式和树形表示 ,四元式
符号表的一般形式:一张符号表的的组成包括两项,即名字栏和信息栏。
信息栏包含许多子栏和标志位,用来记录相应名字和种种不同属性,名字栏也称主栏。主栏的内容称为关键字(key word)。
符号表的功能:(1)收集符号属性 (2) 上下文语义的合法性检查的依据: 检查标识符属性在上下文中的一致性和合法性。(3)作为目标代码生成阶段地址分配的依据
符号的主要属性及作用:
1. 符号名 2. 符号的类型 (整型、实型、字符串型等))3. 符号的存储类别(公共、私有)
4. 符号的作用域及可视性 (全局、局部) 5. 符号变量的存储分配信息 (静态存储区、动态存储区)
存储分配方案策略:静态存储分配;动态存储分配:栈式、 堆式。
静态存储分配
1、基本策略
在编译时就安排好目标程序运行时的全部数据空间,并能确定每个数据项的单元地址。
2、适用的分配对象:子程序的目标代码段;全局数据目标(全局变量)
3、静态存储分配的要求:不允许递归调用,不含有可变数组。
FORTRAN程序是段结构,不允许递归,数据名大小、性质固定。 是典型的静态分配
动态存储分配
1、如果一个程序设计语言允许递归过程、可变数组或允许用户自由申请和释放空间,那么,就需要采用动态存储管理技术。
2、两种动态存储分配方式:栈式,堆式
栈式动态存储分配
分配策略:将整个程序的数据空间设计为一个栈。
【例】在具有递归结构的语言程序中,每当调用一个过程时,它所需的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间。
过程所需的数据空间包括两部分
一部分是生存期在本过程这次活动中的数据对象。如局部变量、参数单元、临时变量等;
另一部分则是用以管理过程活动的记录信息(连接数据)。
活动记录(AR)
一个过程的一次执行所需要的信息使用一个连续的存储区来管理,这个区 (块)叫做一个活动记录。
构成
1、临时工作单元;2、局部变量;3、机器状态信息;4、存取链;
5、控制链;6、实参;7、返回地址
什么是代码优化
所谓优化,就是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加快或占用存储空间减少。
优化原则:等价原则:经过优化后不应改变程序运行的结果。
有效原则:使优化后所产生的目标代码运行时间较短,占用的存储空间较小。
合算原则:以尽可能低的代价取得较好的优化效果。
常见的优化技术
(1) 删除多余运算(删除公共子表达式) (2) 代码外提 +删除归纳变量+ (3)强度削弱; (4)变换循环控制条件 (5)合并已知量与复写传播 (6)删除无用赋值
基本块定义
程序中只有一个入口和一个出口的一段顺序执行的语句序列,称为程序的一个基本块。

给我分数啊。。。

Ⅱ 有关编译原理的几个问题

最左推到就是从最左边的非终结符开始替换,一个一个替换,直到替换为题目要求的。预测分析表什么的太烦了,不高兴写。你按着书上例题步骤一步一步写就可以了。给你写个第五题。

Ⅲ 编译原理 写出表达式 三元序列

三元式
(1)(a,b,+)
(2)(a,b,-)
(3)((1),(2),/)
(4)(b,c,*)
(5)(a,(4),+)
(6)((3),(5),-)
四元式
(a,b,+,x1)
(a,b,-,x2)
(x1,x2,/,x3)
(b,c,*,x4)
(a,x4,+,x5)
(x3,x5,-,x6)

Ⅳ 编译原理编程

1)0*10*10*

2)0*(10+)*(1|0)

3)(0*10*10*)*

第一题跟第三题是差不多的

这时候可以发现,只要用一个count来做对错的识别就能解决,并不是没有用到state状态,而是该状态变为隐性了,如下

/**

*@fnintcheck_data(char*d_line,intn)

*@brief检查资列串是否符合给定的正则表达式

*@return0不符;1符合

*/

intcheck_data(char*d_line,intn){

inti,count;

for(count=0,i=0;i<n;i++){//只要算出1的个数即可

if(d_line[i]=='1')count++;

}

return(1-(count&1));//当count奇数表示失败;当count偶数成功

}

第二题的话,就会用到state来纪录状态,

而最后离开状态S4还是被隐含在执行判断的过程中

#defineS10

#defineS21

#defineS32

#defineS43

intcheck_data(char*d_line,intn){

inti,state;

state=S1;

for(i=0;i<n;i++){

switch(state){

caseS1:

if(d_line[i]=='1')state=S2;break;

caseS2:

if(d_line[i]=='1')return0;//失败了

/*d_line[i]为'0'*/state=S3;break;

caseS3:

if(d_line[i]=='1')state=S2;break;

caseS4:break;

}

}

return1;

}

基本上上述程式对照自动机就可以比较清楚了

Ⅳ 编译原理课程设计-词法分析器设计(C语言)

#include"stdio.h"/*定义I/O库所用的某些宏和变量*/

#include"string.h"/*定义字符串库函数*/

#include"conio.h"/*提供有关屏幕窗口操作函数*/

#include"ctype.h"/*分类函数*/

charprog[80]={''},

token[8];/*存放构成单词符号的字符串*/

charch;

intsyn,/*存放单词字符的种别码*/

n,

sum,/*存放整数型单词*/

m,p;/*p是缓冲区prog的指针,m是token的指针*/

char*rwtab[6]={"begin","if","then","while","do","end"};

voidscaner(){

m=0;

sum=0;

for(n=0;n<8;n++)

token[n]='';

ch=prog[p++];

while(ch=='')

ch=prog[p++];

if(isalpha(ch))/*ch为字母字符*/{

while(isalpha(ch)||isdigit(ch))/*ch为字母字符或者数字字符*/{

token[m++]=ch;

ch=prog[p++];}

token[m++]='';

ch=prog[p--];

syn=10;

for(n=0;n<6;n++)

if(strcmp(token,rwtab[n])==0)/*字符串的比较*/{

syn=n+1;

break;}}

else

if(isdigit(ch))/*ch是数字字符*/{

while(isdigit(ch))/*ch是数字字符*/{

sum=sum*10+ch-'0';

ch=prog[p++];}

ch=prog[p--];

syn=11;}

else

switch(ch){

case'<':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='>'){

syn=21;

token[m++]=ch;}

elseif(ch=='='){

syn=22;

token[m++]=ch;}

else{

syn=20;

ch=prog[p--];}

break;

case'>':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='='){

syn=24;

token[m++]=ch;}

else{

syn=23;

ch=prog[p--];}

break;

case':':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='='){

syn=18;

token[m++]=ch;}

else{

syn=17;

ch=prog[p--];}

break;

case'+':syn=13;token[0]=ch;break;

case'-':syn=14;token[0]=ch;break;

case'*':syn=15;token[0]=ch;break;

case'/':syn=16;token[0]=ch;break;

case'=':syn=25;token[0]=ch;break;

case';':syn=26;token[0]=ch;break;

case'(':syn=27;token[0]=ch;break;

case')':syn=28;token[0]=ch;break;

case'#':syn=0;token[0]=ch;break;

default:syn=-1;}}

main()

{

printf(" Thesignificanceofthefigures: "

"1.figures1to6saidKeyword "

"2. "

"3.figures13to28saidOperators ");

p=0;

printf(" pleaseinputstring: ");

do{

ch=getchar();

prog[p++]=ch;

}while(ch!='#');

p=0;

do{

scaner();

switch(syn){

case11:printf("(%d,%d) ",syn,sum);break;

case-1:printf(" ERROR; ");break;

default:printf("(%d,%s) ",syn,token);

}

}while(syn!=0);

getch();

}

程序测试结果

对源程序beginx:=9:ifx>9thenx:=2*x+1/3;end#的源文件,经过词法分析后输出如下图5-1所示:

具体的你在修改修改吧

Ⅵ 编译原理。。

我直接写答案了:
1.A、B
2.A、D
3.B、C
4.C、D
5.C、D
6.A、D与第二题一样
7.C、D
以上答案只供参考

Ⅶ 编译原理 名词解释

1、识别源程序中意义独立的最小单位--单词
2、不确定的有穷自动机(Nondeterministic Finite Automata)--NFA
3、是指程序—顺序执行的语句序列,其中只有一个入口和一个出口,入口就是其中的第—个语句,出口就是其中的最后一个语句--基本块
4、它把高级语言编写的源程序翻译成与之在逻辑上等价的机器语言或汇编语言的目标程序--编译程序

5、是规则的非空有穷集合--文法
6、确定的有穷自动(Deterministic Finite Automata)--DFA

Ⅷ 计算机科学与技术中编译原理简答题

时间有点久记得不太真切,用通俗语言说,希望题主尽量查阅书籍参考资料自行验证理解。

1、什么是移进项目,什么是规约项目

这个是自顶向下和自下向上分析时候用到的。所谓移进就是不处理,所谓规约就是处理,合并,替换。比如当前符合某个正规式左部,就用这个正规式右部替换左部,称为规约。两种操作的目的都是为了分析整体是否符合语法树。

2、请给出生成C语言语句序列的文法(假定s表示任意一个语句,它为终结符)

关于这个,我感觉你描述的不是很清楚,因为C语言文法包含的正规式还是挺多的,如果单指statement的话,
statement_listà
statement
| statement_list statement

Statementà
| compound_statement
| expression_statement
| selection_statement
| iteration_statement
| jump_statement
再配合上相应的终结符。

3、能用上下文无关文法生成正规集吗?为什么?

可以。不过无法保证不含冲突。

4、计算first集和follow集对于构造自顶向下的语法分析器有什么作用?

可以用来排除冲突。例如移进-移进冲突,移进-规约冲突。

5、是否可能存在这样一个DFA,它的所有状态都是接受状态,包括其实状态,为什么?

这个爱莫能助,据我的构想是可以的,但是这样的DFA最终都会成为单一状态DFA。

Ⅸ 急急急,编译原理

using namespace std;

struct BiNode
{
char data;
BiNode *lchild, *rchild;
};
typedef BiNode *BiTree;

int CreateBiTree(BiTree &T, const char *s1, const char *s2, int len)
{
if (len<=0)
{
T = NULL;
return 1;
}
else
{
T = new BiNode;
T->data = *s1;
int i;
for ( i=0; i<len; i++) if (s2[i]==*s1) break;
CreateBiTree(T->lchild, s1+1, s2, i);
CreateBiTree(T->rchild, s1+i+1, s2+i+1, len-(i+1));
}
return 1;
}

int DestroyBiTree(BiTree &T)
{
if (T==NULL) return 1;
DestroyBiTree(T->lchild);
DestroyBiTree(T->rchild);
delete T;
T = NULL;
return 1;
}

int ATraverse(BiTree &T)
{
if (T==NULL) return 1;
ATraverse(T->lchild);
ATraverse(T->rchild);
cout<<T->data;
return 1;
}

main()
{
char a[2000],b[2000];
while(cin>>a>>b)
{
BiTree T;
int count=0;
int n;
for(n=0;a[n]!='\0';n++);
CreateBiTree(T,a,b,n);
ATraverse(T);
cout<<" ";

cout<<endl;
DestroyBiTree(T);

阅读全文

与编译原理tac序列相关的资料

热点内容
喷油螺杆制冷压缩机 浏览:569
python员工信息登记表 浏览:369
高中美术pdf 浏览:153
java实现排列 浏览:505
javavector的用法 浏览:974
osi实现加密的三层 浏览:225
大众宝来原厂中控如何安装app 浏览:906
linux内核根文件系统 浏览:235
3d的命令面板不见了 浏览:520
武汉理工大学服务器ip地址 浏览:141
亚马逊云服务器登录 浏览:517
安卓手机如何进行文件处理 浏览:65
mysql执行系统命令 浏览:923
php支持curlhttps 浏览:136
新预算法责任 浏览:437
服务器如何处理5万人同时在线 浏览:244
哈夫曼编码数据压缩 浏览:419
锁定服务器是什么意思 浏览:379
场景检测算法 浏览:612
解压手机软件触屏 浏览:343