编译程序和解释程序[精选多篇]

时间:2019-05-14 17:37:13下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《编译程序和解释程序》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《编译程序和解释程序》。

第一篇:编译程序和解释程序

编译程序和解释程序

如果一个程序能够把某一种语言程序(称为源语言程序)改造成为另一种语言程序(称为目标语言程序),则这亲戚的程序称为“翻译程序”。如果源语言是“高级语言”(诸如FORTRAN、PASCAL等等),而目标语言是“低级语言”(如汇编语言或机器语言),则这样的翻译程序称为“编译程序”。

现在的计算机尚不能直接执行高级语言程序。执行一个高级语言程序大体上要分两步:第一步,把高级语言的源程序编译成低级语言的目标程序;第二步,运行这个目标程序。编译程序的典型工作过程是:输入源程序,对它进行加工处理,输出目标程序。加工处理是非常复杂的过程,它又可划分成以下几个阶段:源程序→词法分析→语法分析→产生中间代码→优化→目标代码生成→目标程序。

第一阶段是词法分析。承担词法分析任务的程序称为“扫描器”。词法分析的任务是:对构成源程序的字符串进行扫描和分解。第二阶段是语法分析。承担语法分析任务的程序称为“分析器”。语法分析的任务是:根据语法规则,把描扫器所提供的结果分析成各类语法范畴。第三阶段是产生中间代码。承担产生中间代码任务的程序称为“中间代码产生器”。其任务是:按照语法分析器所识别出的语法范畴,产生相应的中间指令。第四阶段是优化,即代码优化。优化的任务是对前阶段产生的中间代码进行加工变换,以便使生成的目标程序,能运行得更快更省(省内存)。第五阶段是目标代码生成。这一阶段的任务是:按照优化后的中间代码和其它有关信息生成目标程序。这种目标程序可以在计算机上直接执行。执行这个目标程序,就可得到一个高级语言程序的结果。我们知道,所谓翻译程序是这样一种程序,它能够把用甲语言写的程序翻译成与之等价的用乙语言写的程序。这里的甲语言是该翻译程序的源语言,而乙语言则为该翻译程序的目标语言。对于编译程序而言,源程序是被加工的对象,而目标程序是加工后的结果。

在计算机上执行用某种高级语言写的源程序,通常有两种方式:一是编译执行方式,二是解释执行方式。

采用编译执行方式执行源程序时要分两大步:编译和运行。编译中的加工处理过程又可分为五个阶段。

解释执行方式与编译执行方式是不同的,其根本区别在于:编译方式把源程序的执行过程严格地分成两大步:编译和运行。即先把源程序全部翻译成目标代码,然后再运行此目标代码,获执行结果。解释方式则不然。它是按照源程序中语句的动态顺序,直接地逐句进行分析解释,并立即执行。所以,解释程序是这样一种程序,它能够按照源程序中语句的动态顺序,逐句地分析解释并执行,直至源程序结束。与编译程序一样,解释程序也与源语言及计算机有关。同一台计算机上不同语言的解释程序是不同的;同一种语言在不同的计算机上的解释程序也可能不同。同一种高级语言的源程序,它可以采用解释执行方式,也可以采用编译执行方式。例如,BASIC语言有解释BASIC和编译BASIC之分。前者执行速度慢;后者执行速度快。编译程序和解释程序都属于系统程序。

第二篇:Tiny C 语言编译程序实验一 Scanner

Tiny C语言编译程序实验一 Scanner Tiny C语言编译程序实验一 Scanner 要求:填写getToken()函数,完成词法分析器scan.c。

约定:

 仅允许整数类型,不允许实数类型

 标识符由大小写英文字母组成,最多52个。其识别按最长匹配原则  整数后紧跟非数字,或标识符后紧跟非字母认为是一个新Token开始  由{ }括起来符号串都认为是注释部分,该部分在词法分析时被过滤掉

 识别出的Token由两个变量:currentToken,tokenString识别,其中currentToken代表Token的类属,为一个名为TokenType的枚举类型,在文件globals.h中定义;tokenString代表Token在程序中出现的形式,即其本来面目。例如整数10的currentToken值为NUM,而tokenString值为‘10’;标识符i的currentToken值为ID,而tokenString值为‘i’

typedef enum

{ ENDFILE,ERROR,IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE,/* 保留字 */

ID,NUM, ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI :=

= <

+

*

/

()

;

} TokenType;

画识别符合TINY C语言构词规则的DFA。然后用直接编码的方法构造词法分析器

/****************************************************/ /* File: scan.c

*/ /* The scanner implementation for the TINY compiler

*/ /****************************************************/ #include “globals.h”

#include “util.h”

#include “scan.h”

typedef enum

{ START, INASSIGN, INCOMMENT, INNUM, INID, DONE } StateType;char tokenString[MAXTOKENLEN+1];static int getNextChar(void)

//获得下一字符

Tiny C语言编译程序实验一 Scanner

static struct

{ char* str;

TokenType tok;

} reservedWords[MAXRESERVED]

= {{“if”,IF},{“then”,THEN},{“else”,ELSE},{“end”,END},{“repeat”,REPEAT},{“until”,UNTIL},{“read”,READ},{“write”,WRITE}};

//定义保留字表

static TokenType reservedLookup(char * s)

//进行保留字的匹配 {实现请自己看scan.c文件}

/**********************************************/ /* the primary function of the scanner

*/ /* function getToken returns the next token in source file */ /**********************************************/ TokenType getToken(void){ int tokenStringIndex = 0;

TokenType currentToken;

//保存被识别Token的类属

StateType state = START;

//初始状态为START

int save;

//标识当前字符是否保存,如空格,换行符n、TAB符t及注释中的任何字符

while(state!= DONE)

//DONE状态表示已识别出一个Token

{ int c = getNextChar();

save = TRUE;

switch(state)

{ case START:

if(isdigit(c))

state = INNUM;

else if(isletter(c))

{ state=DONE;currentToken=END;state=INID;state=INASSIGN;state=INCOMMENT;else if(c==':')else if(c=='{')else

}

break;

case INCOMMENT:

if(c=='}')

Tiny C语言编译程序实验一 Scanner

{ state=DONE;currentToken=END;}

break;case INASSIGN: if(c=='=')

{

} else { error();currentToken=ERROR };/* 此处已填写完整 */ state=DONE;currentToken=ASSIGN;break;

case INNUM:

if(!isdigit(c))

{ /* backup in the input */

ungetNextChar();

save = FALSE;

state = DONE;

currentToken = NUM;

}

break;

case INID:

if(!isletter(c)){ /* backup in the input */ ungetNextChar();save = FALSE;state = DONE;currentToken =ID;

break;

case DONE: //不可能到

default: /* should never happen */

fprintf(listing,“Scanner Bug: state= %dn”,state);

state = DONE;

currentToken = ERROR;

break;

}

if((save)&&(tokenStringIndex <= MAXTOKENLEN))

tokenString[tokenStringIndex++] =(char)c;

if(state == DONE)

Tiny C语言编译程序实验一 Scanner

{ tokenString[tokenStringIndex] = '';

if(currentToken == ID)

currentToken = reservedLookup(tokenString);

}

}

---------end WHILE

if(TraceScan){

fprintf(listing,“t%d: ”,lineno);

printToken(currentToken,tokenString);

}

return currentToken;} /* end getToken */

下载编译程序和解释程序[精选多篇]word格式文档
下载编译程序和解释程序[精选多篇].doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐