当前位置:文档之家› (精选)广工2014编译原理实验报告

(精选)广工2014编译原理实验报告

(精选)广工2014编译原理实验报告
(精选)广工2014编译原理实验报告

实验报告

课程名称编译原理

题目名称 PL/0编译器的扩充

学生学院计算机学院

专业班级计算机科学与技术12(4)

学号 3112005901

学生姓名柏石先

指导教师李杨

程序功能完成情况

测试用例全面程度

学生对所编程序熟悉程度

报告格式是否与要求相符

报告内容是否准确、全面

2014 年 12 月 20日

一、实验目的与要求

对PL/0作以下修改扩充:

(1)增加单词:保留字 ELSE,FOR,STEP,UNTIL,DO,RETURN

运算符 *=,/=,&,||,!

(2)修改单词:不等号# 改为 <>

(3)增加条件语句的ELSE子句,要求:写出相关文法,语法描述图,语义描述图。

二、实验环境与工具

1、源语言:PL/0语言,PL/0语言是PASCAL语言的子集,它的编译程序是一个编译解

析执行系统,后缀名为.PL0;

2、目标语言:生成文件后缀为*.COD的目标代码

3、实现平台:Borland C++Builder 6

4、运行平台:Windows 8.1

三、结构流程

1、结构设计说明

(1)PL/0 语言编译器

PL/0语言可看成是PASCAL语言的子集,它的编译程序是一个编译解释执行系统。PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。

2、词法分析程序的设计

四、开发过程

(一)增加单词:保留字 ELSE,FOR,STEP,UNTIL,DO , RETURN

运算符 *=,/=,&,||,!

新增6个保留字和5个运算符,合计11个单词。

其中保留字ELSE,FOR,STEP,UNTIL,DO, RETURN分别对应ELSESYM,FORSYM, STEPSYM, UNTILSYM,DOSYM,RETURNSYM;

运算符 *= ,/= ,& ,|| ,!分别对应TIMESBECOMES, SLASHBECOMES, ANDSYM, ORSYM, NOTSYM。

注:要求只做词法分析部分,不做语义分析处理,实验的结果只是识别新增的保留字和运算

1.首先考虑需要增加保留字的个数,以及如何命名,再将新增的保留字添加对应的保留字的集合中。具体实现的语句如下所示:

typedef enum { NUL, IDENT, NUMBER, PLUS, MINUS, TIMES,

SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ,

LPAREN, RPAREN, COMMA, SEMICOLON, PERIOD,

BECOMES, BEGINSYM, ENDSYM, IFSYM, THENSYM,

WHILESYM, WRITESYM, READSYM, DOSYM, CALLSYM,

CONSTSYM, VARSYM, PROCSYM, PROGSYM,

ELSESYM, FORSYM, STEPSYM, STEPSYM, RETURNSYM,

TIMESBECOMES, SLASHBECOMES, ANDSYM, ORSYM, NOTSYM

} SYMBOL;

2.这里需要注意,一定要参照已有的保留字,进行相应的命名和添加规范。具体实现的语句如下所示:

char *SYMOUT[] = {"NUL", "IDENT", "NUMBER", "PLUS", "MINUS", "TIMES", "SLASH", "ODDSYM", "EQL", "NEQ", "LSS", "LEQ", "GTR", "GEQ",

"LPAREN", "RPAREN", "COMMA", "SEMICOLON", "PERIOD",

"BECOMES", "BEGINSYM", "ENDSYM", "IFSYM", "THENSYM",

"WHILESYM", "WRITESYM", "READSYM", "DOSYM", "CALLSYM",

"CONSTSYM", "VARSYM", "PROCSYM", "PROGSYM",

"ELSESYM", "FORSYM", "STEPSYM", "STEPSYM", "RETURNSYM",

"TIMESBECOMES", "SLASHBECOMES", "ANDSYM", "ORSYM", "NOTSYM"

};

3.将新增的保留字按照字母表升序的方式添加,运算符参照已有的运算符来进行添加,注意好符号与SYM的对应。具体实现的语句如下所示:

特别注意点:此处一定要考虑到PLO编译器采用了折半查找算法来进行操作,如果新增的保留字没有按照既定的升序规则来插入,会造成在编译过程中,编译器无法识别某些保留字。strcpy(KWORD[ 1],"BEGIN"); strcpy(KWORD[ 2],"CALL");

strcpy(KWORD[ 3],"CONST"); strcpy(KWORD[ 4],"DO");

strcpy(KWORD[ 5],"ELSE");

strcpy(KWORD[ 6],"END");

strcpy(KWORD[ 7],"FOR");

strcpy(KWORD[ 8],"IF");

strcpy(KWORD[ 9],"ODD"); strcpy(KWORD[ 10],"PROCEDURE");

strcpy(KWORD[ 11],"PROGRAM"); strcpy(KWORD[12],"READ");

strcpy(KWORD[13],"RETURN");

strcpy(KWORD[14],"STEP");

strcpy(KWORD[15],"THEN");

strcpy(KWORD[16],"UNTIL");

strcpy(KWORD[17],"VAR");

strcpy(KWORD[18],"WHILE"); strcpy(KWORD[19],"WRITE");

WSYM[ 1]=BEGINSYM; WSYM[ 2]=CALLSYM;

WSYM[ 3]=CONSTSYM; WSYM[ 4]=DOSYM;

WSYM[ 5]=ELSESYM; /*增加保留字符号elsesym*/

WSYM[ 6]=ENDSYM;

WSYM[ 7]=FORSYM;

WSYM[ 8]=IFSYM;

WSYM[ 9]=ODDSYM; WSYM[ 10]=PROCSYM;

WSYM[ 11]=PROGSYM; WSYM[12]=READSYM;

WSYM[13]=RETURNSYM;

WSYM[14]=STEPSYM;

WSYM[15]=THENSYM;

WSYM[16]=UNTILSYM;

WSYM[17]=VARSYM;

WSYM[18]=WHILESYM; WSYM[19]=WRITESYM;

SSYM['+']=PLUS; SSYM['-']=MINUS;

SSYM['*']=TIMES; SSYM['/']=SLASH;

SSYM['(']=LPAREN; SSYM[')']=RPAREN;

SSYM['=']=EQL; SSYM[',']=COMMA;

SSYM['.']=PERIOD;

SSYM[';']=SEMICOLON; SSYM['&']=ANDSYM;

SSYM['!']=NOTSYM;

4.在完成保留字的添加以后,在void STATEMENT(SYMSET FSYS,int LEV,int &TX){}函数中增加相应的语句,注意满足语法规则。这是用来检验保留字是否添加成功的标志。具体实现的语句如下所示:

case FORSYM:

GetSym();

Form1->printfs("保留字:FORSYM~~~~");

break;

case STEPSYM:

GetSym();

Form1->printfs("保留字:STEPSYM~~~~");

break;

case UNTILSYM:

GetSym();

Form1->printfs("保留字:UNTILSYM~~~~");

break;

case RETURNSYM:

GetSym();

Form1->printfs("保留字:RETURNSYM~~~~");

break;

case DOSYM:

GetSym();

Form1->printfs("保留字:DOSYM~~~~");

break;

5.新增的运算符需要被编译器识别,必须满足编译器做词法分析时,能够正确得到对于的SYM,因此在GetSym()函数中在相应位置增加相应的运算符分析判断,具体实现如下面所示的语句:

else

if (CH==':') {

GetCh();

if (CH=='=') { SYM=BECOMES; GetCh(); }

else SYM=NUL;

}

else

if(CH == '*'){

GetCh();

if(CH == '='){

SYM = TIMESBECOMES;

GetCh();

}else SYM=SSYM['*'];

}

else

if(CH == '/'){

GetCh();

if(CH == '='){

SYM = SLASHBECOMES;

GetCh();

}else SYM=SSYM['/'];

}

else /* THE FOLLOWING TWO CHECK WERE ADDED

BECAUSE ASCII DOES NOT HAVE A SINGLE CHARACTER FOR <= OR >= */ if (CH=='<') {

GetCh();

if (CH=='=') { SYM=LEQ; GetCh(); }

else if(CH=='>'){ SYM=NEQ; GetCh(); } //不等号加 else SYM=LSS;

}

else

if (CH=='>') {

GetCh();

if (CH=='=') { SYM=GEQ; GetCh(); }

else SYM=GTR;

}

else

if (CH=='&') {

SYM=ANDSYM; GetCh();

}

else

if (CH=='|') {

GetCh();

if (CH=='|') {

SYM=ORSYM; GetCh();

}

else Error(19);

}

else

if (CH=='!') {

SYM=NOTSYM; GetCh();

}

else { SYM=SSYM[CH]; GetCh(); }

6.完成运算符语义分析之后,按照增加保留字的方法一样,同样在void STATEMENT(SYMSET FSYS,int LEV,int &TX){}函数中增加相应语句,这是用来检验运算符是否添加成功的标志。具体实现的语句如下所示:

case TIMESBECOMES:

GetSym();

Form1->printfs("运算符:*= ~~~~");

break;

case SLASHBECOMES:

GetSym();

Form1->printfs("运算符: /= ~~~~");

break;

case ANDSYM:

GetSym();

Form1->printfs("运算符:& ~~~~");

break;

case ORSYM:

GetSym();

Form1->printfs("运算符:|| ~~~~");

break;

case NOTSYM:

GetSym();

Form1->printfs("运算符:! ~~~~");

break;

7.特别需要注意的两点,这个是很容易被忽略的地方,就是在完成保留字和运算符的增加以后,一定要对PLO编译器对保留字个数已经单词总数定义进行相应的修改。

保留字总数

比如说在不添加任何保留字的情况下,PL0编译器的原保留字应该是14个,所以在Unit1.CPP 中有定义const NORW = 14; /* # OF RESERVED WORDS */

而在实验中因为新增加保留字5个,故此处应改为:

const NORW = 19; /* # OF RESERVED WORDS */

单词总数

与保留字总数一样,我们增加完保留字和运算符以后,要修改单词总是,比如原单词总数是33,因为原编译器中并未定义一个常量来进行统一管理,所以需要对所有“i<33”的地方进

行修改。因为实验中新增加单词10个,故应改为“i<43”。

(二)修改运算符:不等号 # 改为 <>

1.因为原先的不等于在编译器中是用单字符#表示的,如今改成<>的双字符形式,所以需

要做的词法分析过程不一样。

首先把源代码中的程序段 SSYM['#']=NEQ; 语句删除或注释消去。

2.在GetSym()过程中把分析到的<>定义为不等号#,从“<”的if判断语句进行相应

的修改。

else /* THE FOLLOWING TWO CHECK WERE ADDED

BECAUSE ASCII DOES NOT HAVE A SINGLE CHARACTER FOR <= OR >= */

if (CH=='<') { GetCh();

if (CH=='=') { SYM=LEQ; GetCh(); }

else if(CH=='>'){ SYM=NEQ; GetCh(); } //更改不等号为“<>”

else SYM=LSS;

}

(三)增加条件语句的ELSE子句,要求:写出相关文法,语法图,语义规则。

1.相关文法规则

G(S): S→if S else S | if S | a

2.语法描述图

3.IF…ELSE语句的语义分析

4.代码修改

首先明白if语句的处理,按if语句的语法,首先调用逻辑表达式处理过程处理if语句的条件,把相应的真假值放到数据栈顶。接下去记录下代码段分配位置(即下面生成的jpc 指令的位置),然后生成条件转移jpc指令(遇0或遇假转移),转移地址未知暂时填0。然后调用语句处理过程处理then语句后面的语句或语句块。then后的语句处理完后,当前代码段分配指针的位置就应该是上面的jpc指令的转移位置。通过前面记录下的jpc指令的位置,把它的跳转位置改成当前的代码段指针位置。

在void STATEMENT(SYMSET FSYS,int LEV,int &TX)中加入ELSE的实现语句,如下所示的实现方式:

case IFSYM:

GetSym();

/* 条件语句*/

CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM),FSYS),LEV,TX);

if (SYM==THENSYM) GetSym();

else Error(16);

CX1=CX; GEN(JPC,0,0);

STATEMENT(FSYS,LEV,TX);

if (SYM==ELSESYM) /* 如果THAN后面跟ELSE,ELSE可有可无,不影响IF语句 */{ GetSym();

CX2=CX;

GEN(JMP,0,0);/*无条件跳转语句*/

CODE[CX1].A=CX; /*cx即为else语句的位置,回填之前的JPC语句跳转的语句*/

STATEMENT(FSYS,LEV,TX); /*else中的语句体*/

CODE[CX2].A=CX; /*执行完ELSE中的语句体后的地址,把它回填JMP中的跳转地址

*/

}

else /*如果than语句后面没有发现else*/{

CODE[CX1].A=CX; /*执行JPC语句跳转到此地址,当前地址为then后面Statement语句执行完的地址*/

}

break;

五、关于测试用例说明:

六、实验结果

1.实例代码:可测试实验中所有增加的内容。(使用的测试用例:E01.PL0)PROGRAM E01;

VAR A,B,C;

BEGIN

B:=8;

C:=2;

READ(A);

IF A<>1 THEN

WRITE(B)

ELSE

WRITE(C);

FOR;

DO;

UNTIL;

RETURN;

*=;

/=;

&;

||;

!;

2.实验结果截图

测试修改不等于和增加保留字运算符

截图1:

截图2:

3.目标代码生成情况:

0J M P01

1I N I06

2L I T08

3S T O04

4L I T02

5S T O05

6O P R016

7S T O03

8L O D03

9L I T01

10O P R09

11J P C016

12L O D04

13O P R014

14O P R015

15J M P019

16L O D05

17O P R014

18O P R015

19O P R00 4.结果输出情况

七、心得体会

编译原理课程实验,总的来说,我体会到的觉得不仅仅是说对编译器进行了什么修改完成了什么功能了收获感,觉得更多的是在理解编译原理这门课程的基础上,对编译器执行代码编译的过程有了一个全新的认识。

对于高级语言,可能在之前的编程学习和训中更多的是对高级语言如何进行代码功能实现进行考虑,只是说只要我满足语法规则,知道如何按照既定的需求完成功能上的实现而已。但是学习编译原理,而且切实的进行编译器编程之后,对这个编译器如何实现我们的代码转换有了新的认识,站在这个基础上去理解高级语言的语法分析的过程,去想象高级语言的语义分析的思路,对自己的编程感悟也有了一些提高。

而对于实验内容来说增添保留字和运算符以及修改单词是很基本的操作。只要明白词法分析的过程就很容易完成,对于ELSE语句的添加,更多的是体现在ELSE语句体的语义分析上面,这个需要我们对语义衔接跳转回调的理解。

总之,个人觉得还是收获颇丰的,也感谢在学习过程中李扬老师的耐心讲解。

编译原理实验指导

编译原理实验指导 实验安排: 上机实践按小组完成实验任务。每小组三人,分别完成TEST语言的词法分析、语法分析、语义分析和中间代码生成三个题目,语法分析部分可任意选择一种语法分析方法。先各自调试运行,然后每小组将程序连接在一起调试,构成一个相对完整的编译器。 实验报告: 上机结束后提交实验报告,报告内容: 1.小组成员; 2.个人完成的任务; 3.分析及设计的过程; 4.程序的连接; 5.设计中遇到的问题及解决方案; 6.总结。

实验一词法分析 一、实验目的 通过设计编制调试TEST语言的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 二、实验预习提示 1.词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示 成以下的二元式(单词种别码,单词符号的属性值)。 2.TEST语言的词法规则 |ID|ID |NUM →a|b|…|z|A|B|…|Z →1|2|…|9|0 →+|-|*|/|=|(|)|{|}|:|,|;|<|>|! →>=|<=|!=|== →/* →*/ 三、实验过程和指导 1.阅读课本有关章节,明确语言的语法,画出状态图和词法分析算法流程图。 2.编制好程序。 3.准备好多组测试数据。 4.程序要求 程序输入/输出示例:

编译原理实验报告实验一编写词法分析程序

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:13软件四 姓名:丁越 学号: 电子邮箱: 实验地点:秋白楼B720 实验成绩: 日期:2016年3 月18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析 程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字 后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中 (编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上 送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图1-1。 图1-1 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有 该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数 变为二进制形式存入数组中 ci中,并记录其在表中的位置。 lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加1;另一个名为error,当出现错误时,调用这个过程, 输出错误编号。 2.实践部分

编译原理实验报告

编译原理实验报告 班级 姓名: 学号: 自我评定:

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 根据教学要求并结合学生自己的兴趣和具体情况,从具有代表性的高级程序设计语言的各类典型单词中,选取一个适当大小的子集。例如,可以完成无符号常数这一类典型单词的识别后,再完成一个尽可能兼顾到各种常数、关键字、标识符和各种运算符的扫描器的设计和实现。 输入:由符合或不符合所规定的单词类别结构的各类单词组成的源程序。 输出:把单词的字符形式的表示翻译成编译器的内部表示,即确定单词串的输出形式。例如,所输出的每一单词均按形如(CLASS,VALUE)的二元式编码。对于变量和常数,CLASS字段为相应的类别码;VALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。对于关键字和运算符,采用一词一类的编码形式;由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。另外,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上放置单词类别的助记符。 三、实现方法与环境 词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应的状态矩阵,该状态矩阵同控制程序便组成了编译器的词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序的另外一种途径是所谓的词法分析程序的自动生成,即首先用正规式对语言中的各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程序所应进行的语义处理工作,然后由一个所谓词法分析程序的构造程序对上述信息进行加工。如美国BELL实验室研制的LEX就是一个被广泛使用的词法分析程序的自动生成工具。 总的来说,开发一种新语言时,由于它的单词符号在不停地修改,采用LEX等工具生成的词法分析程序比较易于修改和维护。一旦一种语言确定了,则采用手工编写词法分析程序效率更高。 四、实验设计 1)题目1:试用手工编码方式构造识别以下给定单词的某一语言的词法分析程序。 语言中具有的单词包括五个有代表性的关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。参考实现方法简述如下。 单词的分类:构造上述语言中的各类单词符号及其分类码表。 表I 语言中的各类单词符号及其分类码表 单词符号类别编码类别码的助记符单词值

《编译原理》模拟期末试题汇总 6套,含答案

《编译原理》模拟试题一 一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分) 1.计算机高级语言翻译成低级语言只有解释一种方式。(×) 2.在编译中进行语法检查的目的是为了发现程序中所有错误。(×) 3.甲机上的某编译程序在乙机上能直接使用的必要条件是甲机和乙机的操作系统功能完全相同。 (√ ) 4.正则文法其产生式为 A->a , A->Bb, A,B∈VN , a 、b∈VT 。 (×) 5.每个文法都能改写为 LL(1) 文法。 (√) 6.递归下降法允许任一非终极符是直接左递归的。 (√) 7.算符优先关系表不一定存在对应的优先函数。 (×) 8.自底而上语法分析方法的主要问题是候选式的选择。 (×) 9.LR 法是自顶向下语法分析方法。 (×) 10.简单优先文法允许任意两个产生式具有相同右部。 (×) 二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共40分) 1.一个编译程序中,不仅包含词法分析,_____,中间代码生成,代码优化,目标代码生成等五个部分。 A.( ) 语法分析B.( )文法分析C.( )语言分析D.( )解释分析 2.词法分析器用于识别_____。 A.( ) 字符串B.( )语句 C.( )单词 D.( )标识符 3.语法分析器则可以发现源程序中的_____。 A.( ) 语义错误 B.( ) 语法和语义错误 C.( ) 错误并校正D.( ) 语法错误 4.下面关于解释程序的描述正确的是_____。

(1) 解释程序的特点是处理程序时不产生目标代码 (2) 解释程序适用于 COBOL 和 FORTRAN 语言 (3) 解释程序是为打开编译程序技术的僵局而开发的 A.( ) (1)(2) B.( ) (1)C.( ) (1)(2)(3) D.( ) (2)(3) 5.解释程序处理语言时 , 大多数采用的是_____方法。 A.( ) 源程序命令被逐个直接解释执行 B.( ) 先将源程序转化为中间代码 , 再解释执行 C.( ) 先将源程序解释转化为目标程序 , 再执行 D.( ) 以上方法都可以 6.编译过程中 , 语法分析器的任务就是_____。 (1) 分析单词是怎样构成的 (2) 分析单词串是如何构成语句和说明的 (3) 分析语句和说明是如何构成程序的 (4) 分析程序的结构 A.( ) (2)(3) B.( ) (2)(3)(4) C.( ) (1)(2)(3) D.( ) (1)(2)(3)(4) 7.编译程序是一种_____。 A. ( ) 汇编程序B.( ) 翻译程序 C.( ) 解释程序 D.( ) 目标程序 8.文法 G 所描述的语言是_____的集合。 A. ( ) 文法 G 的字母表 V 中所有符号组成的符号串 B.( ) 文法 G 的字母表 V 的闭包 V* 中的所有符号串 C.( ) 由文法的开始符号推出的所有终极符串 D. ( ) 由文法的开始符号推出的所有符号串 9.文法分为四种类型,即0型、1型、2型、3型。其中3型文法是_____。 A. ( ) 短语文法 B.( ) 正则文法 C.( ) 上下文有关文法 D.( ) 上下文无关文法 10.一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组 _____。 A.( ) 句子B.( ) 句型 C.( ) 单词 D.( ) 产生式 三、填空题(每空1分,共10分)

广东工业大学数据库原理与应用试卷答案

广东工业大学试卷用纸,共 页,第 页

广东工业大学试卷用纸,共页,第页

广东工业大学试卷用纸,共页,第页

一、填空(每题1分,共10分) 1、层次模型,网状模型,关系模型 2、逻辑结构设计,物理结构设计 3、原子性,持续性 4、并发调度的可串行性 5、闭包 6、描述事物的符号记录 二、选择题(每题2分,共20分) 三、简答题(每题4分,共16分) 1、解释数据库,数据库系统,数据库管理系统三个概念。 数据库是指长期存储于计算机内的、有组织的、可共享的数据集合。(1分) DBMS是指位于用户与OS之间的一层数据管理软件,它位用户或应用程序提供访问DB的方法。(1分) DBS是实现有组织的、动态的存储大量关联数据、方便多用户访问的计算机硬件、软件和数据资源组成的系统,即采用数据库技术的计算机系统。(2分) 2、试述视图和基本表之间的联系和区别? (1)视图和基本表在概念上等同,他们都是关系。(1分) (2)基本表是本身独立存在的表。视图是从一个或几个基本表(或视图)中导出的表,它与基本表不同,是一个 虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍然放在原来的基本表中。(3分) 3、数据库的完整性概念与数据库的安全性概念有什么区别和联系? 数据的完整性和安全性是两个不同的概念,但是有一定的联系。 前者是为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出,即所谓垃圾进垃圾出所造成的无效操作和错误结果。(2分) 后者是保护数据库防止恶意的破坏和非法的存取。也就是说,安全性措施的防范对象是非法用户和非法操作,完整性措施的防范对象是不合语义的数据。(2分) 4、什么是封锁?基本的封锁类型有几种,简要说明它们的含义。 封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。(2分)基本封锁类型:排它锁和共享锁。 排它锁又称为写锁:若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁(1分) 共享锁又称为读锁:若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T 释放A 上的S锁。(1分) 四、计算(4分) 1、(R÷S)×S={(2,3,4,5),(2,7,2,3)} 2 广东工业大学试卷用纸,共页,第页

(精选)广工2014编译原理实验报告

实验报告 课程名称编译原理 题目名称 PL/0编译器的扩充 学生学院计算机学院 专业班级计算机科学与技术12(4) 学号 3112005901 学生姓名柏石先 指导教师李杨 程序功能完成情况 测试用例全面程度 学生对所编程序熟悉程度 报告格式是否与要求相符 报告内容是否准确、全面 2014 年 12 月 20日

一、实验目的与要求 对PL/0作以下修改扩充: (1)增加单词:保留字 ELSE,FOR,STEP,UNTIL,DO,RETURN 运算符 *=,/=,&,||,! (2)修改单词:不等号# 改为 <> (3)增加条件语句的ELSE子句,要求:写出相关文法,语法描述图,语义描述图。 二、实验环境与工具 1、源语言:PL/0语言,PL/0语言是PASCAL语言的子集,它的编译程序是一个编译解 析执行系统,后缀名为.PL0; 2、目标语言:生成文件后缀为*.COD的目标代码 3、实现平台:Borland C++Builder 6 4、运行平台:Windows 8.1 三、结构流程 1、结构设计说明 (1)PL/0 语言编译器 PL/0语言可看成是PASCAL语言的子集,它的编译程序是一个编译解释执行系统。PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。

2、词法分析程序的设计 四、开发过程 (一)增加单词:保留字 ELSE,FOR,STEP,UNTIL,DO , RETURN 运算符 *=,/=,&,||,! 新增6个保留字和5个运算符,合计11个单词。 其中保留字ELSE,FOR,STEP,UNTIL,DO, RETURN分别对应ELSESYM,FORSYM, STEPSYM, UNTILSYM,DOSYM,RETURNSYM; 运算符 *= ,/= ,& ,|| ,!分别对应TIMESBECOMES, SLASHBECOMES, ANDSYM, ORSYM, NOTSYM。 注:要求只做词法分析部分,不做语义分析处理,实验的结果只是识别新增的保留字和运算 1.首先考虑需要增加保留字的个数,以及如何命名,再将新增的保留字添加对应的保留字的集合中。具体实现的语句如下所示: typedef enum { NUL, IDENT, NUMBER, PLUS, MINUS, TIMES, SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ, LPAREN, RPAREN, COMMA, SEMICOLON, PERIOD,

最新编译原理试题汇总+编译原理期末试题(8套含答案+大题集)

编译原理考试题及答案汇总一、选择 1.将编译程序分成若干个“遍”是为了_B__。 A . 提高程序的执行效率 B.使程序的结构更加清晰 C. 利用有限的机器内存并提高机器的执行效率 D.利用有限的机器内存但降低了机器的执行效率 2.正规式 MI 和 M2 等价是指__C__。 A . MI 和 M2 的状态数相等 B.Ml 和 M2 的有向弧条数相等。 C .M1 和 M2 所识别的语言集相等 D. Ml 和 M2 状态数和有向弧条数相等 3.中间代码生成时所依据的是 _C_。 A.语法规则 B.词法规则 C.语义规则 D.等价变换规则 4.后缀式 ab+cd+/可用表达式__B_来表示。 A. a+b/c+d B.(a+b)/(c+d) C. a+b/(c+d) D. a+b+c/d 6.一个编译程序中,不仅包含词法分析,_A____,中间代码生成,代码优化,目标代码生成等五个部分。 A.( ) 语法分析 B.( )文法分析 C.( )语言分析 D.( )解释分析 7.词法分析器用于识别__C___。 A.( ) 字符串 B.( )语句 C.( )单词 D.( )标识符 8.语法分析器则可以发现源程序中的___D__。 A.( ) 语义错误 B.( ) 语法和语义错误 C.( ) 错误并校正 D.( ) 语法错误 9.下面关于解释程序的描述正确的是__B___。 (1) 解释程序的特点是处理程序时不产生目标代码 (2) 解释程序适用于 COBOL 和 FORTRAN 语言 (3) 解释程序是为打开编译程序技术的僵局而开发的 A.( ) (1)(2) B.( ) (1) C.( ) (1)(2)(3) D.( ) (2)(3) 10.解释程序处理语言时 , 大多数采用的是__B___方法。 A.( ) 源程序命令被逐个直接解释执行 B.( ) 先将源程序转化为中间代码 , 再解释执行 C.( ) 先将源程序解释转化为目标程序 , 再执行 D.( ) 以上方法都可以 11.编译过程中 , 语法分析器的任务就是__B___。 (1) 分析单词是怎样构成的 (2) 分析单词串是如何构成语句和说明的 (3) 分析语句和说明是如何构成程序的 (4) 分析程序的结构 A.( ) (2)(3) B.( ) (2)(3)(4)C.( ) (1)(2)(3) D.( ) (1)(2)(3)(4) 12.编译程序是一种___C__。 A. ( ) 汇编程序 B.( ) 翻译程序 C.( ) 解释程序 D.( ) 目标程序 13.文法 G 所描述的语言是_C____的集合。 A. ( ) 文法 G 的字母表 V 中所有符号组成的符号串 B.( ) 文法 G 的字母表 V 的闭包 V* 中的所有符号串 C.( ) 由文法的开始符号推出的所有终极符串 D. ( ) 由文法的开始符号推出的所有符号串 14.文法分为四种类型,即 0 型、1 型、2 型、3 型。其中 3 型文法是___B__。 A. ( ) 短语文法 B.( ) 正则文法 C.( ) 上下文有关文法 D.( ) 上下文无关文法15.一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组 __D___。 A.( ) 句子 B.( ) 句型 C.( ) 单词 D.( ) 产生式

广工编译原理(精选题集+必考大题

《编译原理》期末试题(二) 1、描述由正规式b*(abb*)*(a| ε)定义的语言,并画出接受该语言的最简DFA。 2、证明文法E → E + id | id是SLR(1)文法。 3、下面是表达式和赋值语句的文法,其中and的类型是bool ? bool → bool,+的类型是int ? int → int,=的类型是int ? int → bool,:= 要求id和E的类型都是int或者都是bool。为该文法写一个语法制导定义或翻译方案,它完成类型检查。 S →id := E E → E and E | E + E | E = E |id 6、描述由正规式b*a(bb*a)*b*定义的语言,并画出接受该语言的最简DFA。 7、下面的文法产生代表正二进制数的0和1的串集: B → B 0 | B 1 | 1 下面的翻译方案计算这种正二进制数的十进制值: B →B1 0 {B.va l := B1.val? 2 } | B1 1 {B.val := B1.val? 2 +1} | 1 {B.val := 1 } 请消除该基础文法的左递归,再重写一个翻译方案,它仍然计算这种正二进制数的十进制值。 编译原理试卷二答案 1、由正规式b*(abb*)*(a| ε)定义的语言是字母表{a, b}上不含子串aa的所有串的集合。最简DFA如下: 2、先给出接受该文法活前缀的DFA如下:

I0和I3都只有移进项目,肯定不会引起冲突;I2和I4都无移进项目并仅含一个归约项目,也肯定不会引起冲突;在I1中,E'的后继符号只有$,同第2个项目的展望符号“+”不一样,因此I1也肯定不会引起冲突。由此可以断定该文法是SLR(1)的。 3、语法制导定义如下。 S →id := E { S.type := if (id.type = bool and E.type = bool) or (id.type = int and E.type = int)then type_ok else type_error } E → E1and E2 { E.type := if E1.type = bool and E2.type = bool then bool else type_error } E → E1 + E2 { E.type := if E1.type = int and E2.type = int then int else type_error } E → E1 = E2{ E.type := if E1.type = int and E2.type = int then bool else type_error } E →id { E.type := lookup(id.entry) } 6、正规式b*a(bb*a)*b*体现的特点是,每个a的左边都有若干b,除非a是第一个字母。该正规式定义的语言是:至少含一个a,但不含子串aa的所有a和b的串集。最简DFA如下: 7、消除左递归后的文法: B → 1 B' B'→ 0 B' | 1 B' | ε 相应的翻译方案如下: B → 1 {B'.i := 1 }B'{B.val := B'.val} B'→ 0 {B'1.i := B'.i? 2 } B'1 {B'.val := B'1.val} | 1 {B'1.i := B'.i? 2 +1} B'1 {B'.val := B'1.val} | ε {B'.val := B'.i} 《编译原理》期末试题(三) 1、从优化的范围的角度,优化可以分哪两类?对循环的优化可以有哪三种?答:从优化的范围的角度,优化可以分为局部优化和全局优化两类; 对循环的优化有三种:循环不变表达式外提、归纳变量删除与计算强度削减。

广工编译原理报告

《编译原理》 专项选修课程实验报告 学院计算机学院 专业网络工程 年级班别2013级3班 学号 学生姓名 辅导教师刘添添 成绩 2015年12月

实验一 一.完成内容 扩充单词: (1)将保留字if改为fi (2)增加保留字else (3)增加运算符++、+= 二.设计思路 (1)将保留字if改为fi 1)修改变量定义 2)修改GetSym()方法 (2)增加保留字else 1)修改变量定义 头文件 2)修改GetSym()方法

(3)增加运算符++、+= 1)修改变量定义 2)修改GetSym()方法 三.调试 1、添加else保留字时出错,原因是忽略了查找时是用折半查找的解决方法:按字母表顺序修改定义变量。 四.运行测试 (1)将保留字if改为fi var a,b; begin a:=1; b:=2;

fi b>a then write(a) end. (2)增加保留字else (3)增加运算符++、+=

实验二 一.完成内容 扩充else 子句 二.设计思路 (1)EBNF 范式以及语法描述图 语句 (1) 递归下降子程序 if(sym==ifsym) { getsymdo; memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[thensym]=true; nxtlev[dosym]=true; conditiondo(nxtlev,ptx,lev); /*调用条件处理(逻辑运算)函数*/ if(sym==thensym) { getsymdo; } else { error(16); /*缺少then*/ } //~~~~~~从这里开始修改~~~~~~~~~~~~~~~ cx1=cx; gendo(jpc,0,0); memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[elsesym]=true; statementdo(nxtlev,ptx,lev); code[cx1].a=cx; if ( sym==elsesym ) { cx2=cx; getsymdo; if 条件 then 语句 else 语句

编译原理实验报告总结

学年第学期《编译原理》实验报告 学院(系):计算机科学与工程学院 班级:11303070A 学号:11303070*** 姓名:无名氏 指导教师:保密式 时间:2016 年7 月

目录 1.实验目的 (1) 2.实验内容及要求 (1) 3.实验方案设计 (1) 3.1 编译系统原理介绍 (1) 3.1.1 编译程序介绍 (2) 3.1.2 对所写编译程序的源语言的描述 (2) 3.2 词法分析程序的设计 (3) 3.3 语法分析程序设计 (4) 3.4 语义分析和中间代码生成程序的设计 (4) 4. 结果及测试分析 (4) 4.1软件运行环境及限制 (4) 4.2测试数据说明 (5) 4.3运行结果及功能说明 (5) 5.总结及心得体会 (7)

1.实验目的 根据Sample语言或者自定义的某种语言,设计该语言的编译前端。包括词法分析,语法分析、语义分析及中间代码生成部分。 2.实验内容及要求 (1)词法分析器 输入源程序,输出对应的token表,符号表和词法错误信息。按规则拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表打印源程序;发现并定位词法错误; (2)语法分析器 输入token串,通过语法分析,寻找其中的语法错误。要求能实现Sample 语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、do while语句等。 (3)语义分析和中间代码生成 输入token串,进行语义分析,修改符号表,寻找其中的语义错误,并生 成中间代码。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while 语句、do while语句等。 实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍不足。3.实验方案设计 3.1 编译系统原理介绍 编译器逐行扫描高级语言程序源程序,编译的过程如下: (1).词法分析 识别关键字、字面量、标识符(变量名、数据名)、运算符、注释行(给人看的,一般不处理)、特殊符号(续行、语句结束、数组)等六类符号,分别归类等待处理。 (2).语法分析 一个语句看作一串记号(Token)流,由语法分析器进行处理。按照语言的文法检查判定是否是合乎语法的句子。如果是合法句子就以内部格式保存,否则报错。直至检查完整个程序。 (3).语义分析 语义分析器对各句子的语法做检查:运算符两边类型是否相兼容;该做哪些类型转换(例如,实数向整数赋值要"取整");控制转移是否到不该去的地方;是

编译原理试题(卷)汇总-编译原理期末试题(卷)(8套含答案解析-大题集)

编译原理考试题及答案汇总 一、选择 1.将编译程序分成若干个“遍”是为了_B__。 A . 提高程序的执行效率 B.使程序的结构更加清晰 C. 利用有限的机器内存并提高机器的执行效率 D.利用有限的机器内存但降低了机器的执行效率 2.正规式 MI 和 M2 等价是指__C__。 A . MI 和 M2 的状态数相等 B.Ml 和 M2 的有向弧条数相等。 C .M1 和 M2 所识别的语言集相等 D. Ml 和 M2 状态数和有向弧条数相等 3.中间代码生成时所依据的是 _C_。 A.语法规则 B.词法规则 C.语义规则 D.等价变换规则 4.后缀式 ab+cd+/可用表达式__B_来表示。 A. a+b/c+d B.(a+b)/(c+d) C. a+b/(c+d) D. a+b+c/d 6.一个编译程序中,不仅包含词法分析,_A____,中间代码生成,代码优化,目标代码生成等五个部分。 A.( ) 语法分析 B.( )文法分析 C.( )语言分析 D.( )解释分析 7.词法分析器用于识别__C___。 A.( ) 字符串 B.( )语句 C.( )单词 D.( )标识符 8.语法分析器则可以发现源程序中的___D__。 A.( ) 语义错误 B.( ) 语法和语义错误 C.( ) 错误并校正 D.( ) 语法错误 9.下面关于解释程序的描述正确的是__B___。 (1) 解释程序的特点是处理程序时不产生目标代码 (2) 解释程序适用于 COBOL 和 FORTRAN 语言 (3) 解释程序是为打开编译程序技术的僵局而开发的 A.( ) (1)(2) B.( ) (1) C.( ) (1)(2)(3) D.( ) (2)(3) 10.解释程序处理语言时 , 大多数采用的是__B___方法。 A.( ) 源程序命令被逐个直接解释执行 B.( ) 先将源程序转化为中间代码 , 再解释执行 C.( ) 先将源程序解释转化为目标程序 , 再执行 D.( ) 以上方法都可以 11.编译过程中 , 语法分析器的任务就是__B___。 (1) 分析单词是怎样构成的 (2) 分析单词串是如何构成语句和说明的 (3) 分析语句和说明是如何构成程序的 (4) 分析程序的结构 A.( ) (2)(3) B.( ) (2)(3)(4)C.( ) (1)(2)(3) D.( ) (1)(2)(3)(4) 12.编译程序是一种___C__。 A. ( ) 汇编程序 B.( ) 翻译程序 C.( ) 解释程序 D.( ) 目标程序 13.文法 G 所描述的语言是_C____的集合。 A. ( ) 文法 G 的字母表 V 中所有符号组成的符号串 B.( ) 文法 G 的字母表 V 的闭包 V* 中的所有符号串 C.( ) 由文法的开始符号推出的所有终极符串 D. ( ) 由文法的开始符号推出的所有符号串 14.文法分为四种类型,即 0 型、1 型、2 型、3 型。其中 3 型文法是___B__。 A. ( ) 短语文法 B.( ) 正则文法 C.( ) 上下文有关文法 D.( ) 上下文无关文法15.一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组 __D___。 A.( ) 句子 B.( ) 句型 C.( ) 单词 D.( ) 产生式 16.通常一个编译程序中,不仅包含词法分析,语法分析,中间代码生成,代码优化,目标代码生成等五个部分,还应包括_C____。

广东工业大学编译原理实验报告

实验报告 课程名称____ 编译原理__________ 题目名称_ PL/0编译程序的修改扩充_ 学生学院______计算机学院__ 专业班级_______ ________ 学号 学生姓名______ ________ 指导教师____ _________ __ 20 年月日

一、课内实验要求 对PL/0作以下修改扩充: 增加单词:保留字ELSE,FOR,TO,DOWNTO,RETURN 运算符*=,/=,++,--,&,||,! 修改单词:不等号# 改为<> 增加条件语句的ELSE子句,要求:写出相关文法,语法图,语义规则。 二、实验环境与工具 计算机及操作系统:PC机,Windows2000,WindowsXP 程序设计语言:C 教学型编译程序:PL/0 设计方案 概述:源、目标语言,实现工具(平台),运行平台 源语言:PASCAL 目标语言:假想栈式计算机的汇编语言,可称为类PCODE指令代码 实现工具:Visual C++ 6.0 运行平台:Windows 7 三、设计方案 1.结构设计说明 (1)PL/0 语言编译器 PL/0语言可看成是PASCAL语言的子集,它的编译程序是一个编译解释执行系统。PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。

(2)PL/0编译程序的语法分析过程BLOCK是整个编译过程的核心。这里根据编译程序的总体流程图,来弄清BLOCK过程在整个编译程序中的作用。总流程图如下图所示: PL/0语法调用关系图

PL/0 的编译程序采用一趟扫描方式,以语法分析程序为核心,词法分析程序和代码生 成程序都作为一个独立的过程,当语法分析需要读单词时就用词法分析程序,而当语法分析正确需生成相应的目标代码时,则调用代码生成程序。此外,用表格管理程序建立变量,常量和过程标识符的说明与引用之间的信息联系。用出错处理程序对词法和语法分析遇到的错误给出在源程序中出错的位置和错误性质。 (3)各功能模块描述

编 译 原 理 实 验 报 告

编译原理实验报告 课程:编译原理 系别:计算机系 班级:11网络 姓名:王佳明 学号:110912049 教师:刘老师 实验小组:第二组 1

实验一熟悉C程序开发环境、进行简单程序的调试 实验目的: 1、初步了解vc++6.0环境; 2、熟悉掌握调试c程序的步骤: 实验内容: 1、输入下列程序,练习Turbo C 程序的编辑、编译、运行。 #include main() { printf(“Programming is fun.\n”); } 2、分析程序,预测其运行结果,并上机检测你的预测。 #include main() { printf(“*\n”); printf(“* * *\n”); printf(“* * * * *\n”); printf(“* * * * * * *\n”); } 3、下面是一个加法程序,程序运行时等待用户从键盘输入两个整数,然后求出它们的和并输出。观察运行结果(程序输出),上机验证该程序。 #include main() { int a,b,c; printf(“Please input a,b:”); scanf(“%d,%d”,&a,&b); c=a+b; printf(“%d+%d=%d\n”,a,b,c); } 2

实验二词法分析器 一、实验目的: 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 二、实验要求: 1.对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。 2.本程序自行规定: (1)关键字"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat" (2)运算符:"+","-","*","/","=" (3)界符:"{","}","[","]",";",",",".","(",")",":" (4)其他标记如字符串,表示以字母开头的标识符。 (5)空格、回车、换行符跳过。 在屏幕上显示如下: ( 1 , 无符号整数) ( begin , 关键字) ( if , 关键字) ( +, 运算符) ( ;, 界符) ( a , 普通标识符) 三、使用环境: Windows下的visual c++6.0; 四、调试程序: 1.举例说明文件位置:f:、、11.txt目标程序如下: begin x:=9 if x>0 then x:=x+1; while a:=0 do 3

编译原理实验报告一

实验一词法分析程序实现 一、实验目得与要求 通过编写与调试一个词法分析程序,掌握在对程序设计语言得源程序进行扫描得过程中,将字符流形式得源程序转化为一个由各类单词符号组成得流得词法分析方法 二、实验内容 基本实验题目:若某一程序设计语言中得单词包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符与四个算术运算符,试构造能识别这些单词得词法分析程序(各类单词得分类码参见表I)。 表I语言中得各类单词符号及其分类码表 输入:由符合与不符合所规定得单词类别结构得各类单词组成得源程序文件。 输出:把所识别出得每一单词均按形如(CLASS,VALUE)得二元式形式输出,并将结果放到某个文件中。对于标识符与无符号常数,CLASS字段为相应得类别码得助记符;V AL UE字段则就是该标识符、常数得具体值;对于关键字与运算符,采用一词一类得编码形式,仅需在二元式得CLASS字段上放置相应单词得类别码得助记符,V ALUE字段则为“空". 三、实现方法与环境 词法分析就是编译程序得第一个处理阶段,可以通过两种途径来构造词法分析程序.其一就是根据对语言中各类单词得某种描述或定义(如BNF),用手工得方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应得状态矩阵,该状态矩阵连同控制程序一起便组成了编译器得词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序得另外一种途径就是所谓得词法分析程序得自动生成,即首先用正规式对语言中得各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程

2014年广工编译原理实验报告

编译原理实验 学院 __________ 专业计算机科学与技术 年级班别11 级计科7班 学号3111 _____________________ 学生姓名 ______________________ 指导教师李小妹_________ 成绩________________________ 2014年1月

一、实验目的与要求 对PL/O作以下修改扩充: (1)增加单词:保留字ELSE , FOR , STEP , UNTIL , DO,RETURN 运算符*=,/=,& ,||,! (2)修改单词:不等号#改为<> (3)增加条件语句的ELSE子句,要求:写出相关文法,语法图,语义规则。 二、实验环境与工具 1、源语言:PL/0语言,PL/0语言是PASCAL S言的子集,它的编译程序是一个编译解析执行系 统,后缀名为PL0 ; 2、目标语言:生成文件后缀为*.COD的目标代码 3、实现平台:Borla nd C++Builder 6 4、运行平台:Win dowsXP 三、设计方案 1、结构设计说明 (1)PL/0语言编译器 PL/0语言可看成是PASCAL语言的子集,它的编译程序是一个编译解释执行系统。PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。 PL/0 源程序 (2)PL/0编译程序的语法分析过程BLOCK S整个编译过程的核心。这里根据编译程序的总体流程图,来弄清BLOCK S程在整个编译程序中的作用。总流程图如

下图所示: PL/O的编译程序采用一趟扫描方式,以语法分析程序为核心,词法分析程序和代码生 成程序都作为一个独立的过程,当语法分析需要读单词时就用词法分析程序,而当语法分析正确需生成相应的目标代码时,则调用代码生成程序。此外,用表格管理程序建立变量,常量和过程标识符的说明与引用之间的信息联系。用出错处理程序对词法和语法分析遇到的错 误给出在源程序中出错的位置和错误性质。

编译原理实验报告

《编译原理》实验报告软件131 陈万全132852

一、需求分析 通过对一个常用高级程序设计语言的简单语言子集编译系统中词法分析、语法分析、语义处理模块的设计、开发,掌握实际编译系统的核心结构、工作流程及其实现技术,获得分析、设计、实现编译程序等方面的实际操作能力,增强设计、编写和调试程序的能力。 通过开源编译器分析、编译过程可视化等扩展实验,促进学生增强复杂系统分析、设计和实现能力,鼓励学生创新意识和能力。 1、词法分析程序设计与实现 假定一种高级程序设计语言中的单词主要包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法分析程序。 输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。 输出:把所识别出的每一单词均按形如(CLASS,VALUE)的二元式形式输出,并将结果放到某个文件中。对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;VALUE字段则是该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,VALUE字段则为“空”。 2、语法分析程序设计与实现 选择对各种常见高级程序设计语言都较为通用的语法结构——算术表达式的

一个简化子集——作为分析对象,根据如下描述其语法结构的BNF定义G2[<算术表达式>],任选一种学过的语法分析方法,针对运算对象为无符号常数和变量的四则运算,设计并实现一个语法分析程序。 G2[<算术表达式>]: <算术表达式>→<项> | <算术表达式>+<项> | <算术表达式>-<项> <项>→<因式>|<项>*<因式>|<项>/<因式> <因式>→<运算对象> | (<算术表达式>) 若将语法范畴<算术表达式>、<项>、<因式>和<运算对象>分别用E、T、F和i 代表,则G2可写成: G2[E]:E → T | E+T | E-T T → F | T*F | T/F F → i | (E) 输入:由实验一输出的单词串,例如:UCON,PL,UCON,MU,ID······输出:若输入源程序中的符号串是给定文法的句子,则输出“RIGHT”,并且给出每一步分析过程;若不是句子,即输入串有错误,则输出“ERROR”,并且显示分析至此所得的中间结果,如分析栈、符号栈中的信息等,以及必要的出错说明信息。 3、语义分析程序设计与实现 对文法G2[<算术表达式>]中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。 输入:包含测试用例(由标识符、无符号数和+、?、*、/、(、)构成的算术表达式)的源程序文件。 输出:将源程序转换为中间代码形式表示,并将中间代码序列输出到文件中。 若源程序中有错误,应指出错误信息 二、设计思路 1、词法分析程序设计与实现 1)单词分类 为了编程的实现。我们假定要编译的语言中,全部关键字都是保留字,程序员不得将它们作为源程序中的标识符;作了这些限制以后,就可以把关键字和标识符的识别统一进行处理。即每当开始识别一个单词时,若扫视到的第一个字符为字母,则把后续输入的字母或数字字符依次进行拼接,直至扫视到非字母、数字字符为止,以期获得一个尽可能长的字母数字字符串,然后以此字符串查所谓保留字表(此保留字表要事先造好),若查到此字符串,则取出相应的类别码;反之,则表明该字符串应为一标识符。

相关主题
文本预览
相关文档 最新文档