当前位置:文档之家› 编译技术课程设计A实验报告(华北电力大学科技学院)

编译技术课程设计A实验报告(华北电力大学科技学院)

编译技术课程设计A实验报告(华北电力大学科技学院)
编译技术课程设计A实验报告(华北电力大学科技学院)

课程设计报告

( 2011-- 2012年度第1学期)

名称:编译技术课程设计A 院系:科技学院信息工程系班级:软件09k2

学号:0919********

学生姓名:闫雪峰

指导教师:郭丰娟

设计周数: 2

成绩:

日期:2011年12 月6日

《编译技术课程设计A》

任务书

一、目的与要求

1. 理解和掌握编译程序设计原理及常用的技术,建立编译程序的整体概念;

2. 理解和掌握编译程序词法分析、语法分析、语义分析、中间代码生成和目标代码生成等几个关键环节原理和实现算法;

3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。

二、主要内容

定义一个简化的类C语言—L语言作为源语言,重点针对词法分析、语法分析、语义分析、中间代码生成和目标代码生成等几个关键环节进行编程和调试训练,最终设计实现L

语言的编译程序。

通过调试L编译程序,了解一般编译程序的总体框架,掌握编译各阶段程序的构造,理解和掌握错误处理方法及符号表的组织方式,理解和掌握语法制导翻译方法。还可以适当扩展L语言成分,并对相应的编译程序进行扩充。可使用C、VC++等语言编程实现。

具体内容包括:

1.由单词的语法规则出发、画出识别单词的状态转换图,然后用程序实现扫描器设计。

2.设计、编写和调试算法优先分析程序,了解算法优先分析器的组成结构以及对文法

的要求,掌握实现通用算法优先分析算法的方法。

3.在算符优先分析文法的基础上进行翻译工作,生成四元式表;

4.设计一个简单的代码生成器,该代码生成器以基本块为单位,依次将每条中间代码

变换成相应的目标代码。

5.综合以上实验的结果,并进行集成与设计,开发出一个小型编译程序。

对于各项主要内容的实现细节描述和指导,请参考《计算机综合实践指导》编译技术的相关内容。

三、进度计划

四、设计(实验)成果要求

至少完成简单变量定义语句及包含算术运算符的赋值语句的整个编译过程,统一使用课程设计报告书,文字清楚、工整。

五、考核方式

实验结果(60%)+实验报告(30%)+实验过程表现(10%)

学生姓名:

指导教师:

年月日

一、课程设计(综合实验)的目的与要求

实验整体思想:

a)词法分析

总体概述:由单词的语法规则出发、画出识别单词的状态转换图,然后用程序实现扫描器设计。

具体要求:设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次,就输出一个以内部形式表示的单词符号。

(1)单词符号及其内部表示

注:其中关键字保留,不支持将关键字作为变量名。

(2)输入预处理

1.词法分析器工作的第一步就是输入源程序文本。

2.预处理工作会剔除源程序中多余的空格(将多个空格换行符合并成一个)。

3.能识别//*** 这样的单行注视将其过滤掉。

4.将固定字长的过滤过字节放到循环扫缓冲区,并记录扫描位置,下次继续从上次扫描

结尾继续扫描取固定字长。

5.本程序设计为255个字节,最大单个标识符长度不能超过255个字节。

(3)输入缓冲区设计

扫描缓冲去一分为二。

每半个缓冲区可容纳256个字符,两个半区互补。如果搜索指示器从单词起点出发搜索到半区边缘尚未到达单词的终点,那么就调用预处理程序,另其把后序的256个字符装进另半区

(4)缓冲区中字符的存放

其中如下代码在缓冲区里的存放

a=b+c;

(5)识别单词符号的状态装换图

b)语法分析

总体概述:采用自下而上规约过程,根据算符优先文法。

具体要求:设计、编写和调试算法优先分析程序,了解算法优先分析器的组成结构以及对文法的要求,掌握实现通用算法优先分析算法的方法。

(1)算符优先文法定义

算符优先文法是一种自下而上的分析方法,其文法的特点是文法的产生式中不含两

个相邻的非终结符。自上而下的分析方法,通常要求文法的产生式不含左递归,如

LL(I)文法就是一种可以自上而下分析的文法。

假定G是不含ε- 产生式的算符文法。对于任何一对终结符a、b,我们说:

(1)a等于b 当且仅当文法G中含有形如P→ ···ab···或P→···aQb···的产生式;

(2)a小于b 当且仅当G中含有形如P→···aR···的产生式,而R(+=>)b···或R(+=>)Qb···;

(3)a大于 b 当且仅当G中含有形如P→···Rb···的产生式,而R(+=>)···a或

R(+=>)···aQ;如果一个算符文法G中的任何终结符对(a,b)之多满足下述三

个条件之一:a=b,ab则称G是一个算符优先文法。

(2) 文法

S->D;E

D->T spe L;

T->key

L->var

E->Evar=F;|var=F;

F->M+F|M|M-F

M->M*T|M|M/T|T

T->L|const

(3)优先表

程序采用递归方式求的优先关系表

(4)符号栈

1.每次入站判断栈顶终结符和栈外终结符的有限关系,小于等于就入栈,大于规约

2.每次规约比较靠近栈顶的第二个终结符和栈顶终结符的有限关系,若小于规约第

二个终结符到栈顶。

3.每次规约查找文发表进行规约。

4.

二、课程设计(综合实验)总结或结论

1.1通过实验掌握了词法分析和语法分析的设计以及制导过程如何生成四元式。

1.2了解了算符优先文法的原理及具体过程。

1.3加深了c语言文件应用,加深了编程能力,深入掌握了库函数的用法。

三、参考文献

[1] 陈火旺, 刘春林 编译原理. 国防工业出版社, 第三版. 2009.6

附录(设计流程图、程序、表格、数据等)

头文件MyHead.h

#pragma once

#define SBUFSIZE 256//定义扫描缓冲区的大小

#define ARROPELEN 9//定义运算符数组的长度

#define ARRKEYLEN 2//定义关键字数组的长度

struct sBinaryRelation//返回值若为关键字或变量

{

int iId;//区分是什么

int iSubScript;//存放操作符和关键字的偏移量,若是常量返回为常量的整型值

char acTempValName[SBUFSIZE];//存放变量的值

};

char * apcKeyWords[]={"","int"};

char apcOperator[]={' ','=','+','-','*','/','(',')',';','#'};

char * apcWordList[]={"key","var","const","operate","nonTerminalSymbol","special"}; 词法分析器

/*Lu语言词法分析器颜海镜 11.12.30

代码已通过编译,尚未优化

没次调用正确返回一个符合词法规则的单词

源文件保存在.lu文件

支持形如变量定义(仅支持int类型),基本加减乘除法,不支持,支持单行注视支持()

可扩展:支持N个关键字,单个标识符最大支持256个字符,支持运算符扩展,支持函数名扩展int a=b+c;

int a=100;

//颜海镜

*/

#include

#include

#include

#include"MyHeader.h"

static char acScanBufL[SBUFSIZE]={0};//扫描缓冲区

static char acScanBufR[SBUFSIZE]={0};

static long lnOffset=0;//偏移量,记录当前文件指针距离开头的距离

char CheckChar(FILE * pfSubSourceFile,char ** ppcSubCurrent,char cSubTemp,char fcSubBlank)//检查字符功能,具有合并空格,去除回车

{

if(cSubTemp==EOF)

{

return 0x20;

}//判断是否到文件末尾,结束返回空格

if(cSubTemp!=10&&isspace(cSubTemp))//判断是否为空格,合并多个空格为一个

{

if(fcSubBlank=='N')

{

**ppcSubCurrent=0x20;

(*ppcSubCurrent)++;

fcSubBlank='Y';//修改空格标志位

}

cSubTemp=fgetc(pfSubSourceFile);//空格的话再读入一个字符

cSubTemp=CheckChar(pfSubSourceFile,ppcSubCurrent,cSubTemp,fcSubBlank);//递归检查}

{

char cTemp;//临时变量,用于检查下一个是否为'/'

cTemp=fgetc(pfSubSourceFile);//再读入一个字符

if(cTemp=='/') //若为注视一直读入知道换行符,否则退回刚才读入的字符

{

while(fgetc(pfSubSourceFile)!='\n');

//遇到注视,在注视结尾返回空格

cSubTemp='\n';

}

else ungetc(cTemp,pfSubSourceFile);//退回刚才读入的字符

}

return cSubTemp;//返回字符

}

int PreProcess(char *pcSubName)//预处理子程序,完成功能每次向ScanBuffer中装入固定字长的源程序代码

{

static char fcFlag='L';

int i;

//将源程序中读入剔除空格注视等放到buffer

char * pcCurrent=0;//只是当前要赋值的字节

char ** ppcCurrent=&pcCurrent;//指向指针的指针

char * pcStart;//指向数组的开始,计算偏移量用

char * pcTemp;//临时变量,初始化用

//初始化pcCurrent确认当前要装入的缓冲区

if(fcFlag=='L')

{

pcCurrent=acScanBufL;

pcStart=acScanBufL;

}

else

{

pcCurrent=acScanBufR;

pcStart=acScanBufR;

}

//初始化当前缓冲区为空字符

pcTemp=pcCurrent;

for(i=0;i

{

*pcTemp=0;

pcTemp++;

}

//打开文件

pfSourceFile=fopen("test.txt","r");

if(pfSourceFile==NULL)

{

printf("The file %s was not opened\n",pcSubName);//判断文件打开是否成功exit(0);//装入失败退出

}

else//打开成功读入

if(fseek(pfSourceFile,lnOffset,SEEK_SET))//移动文件指针到应该的位置

{

perror("Fseek failed");

exit(1);//移动光标失败退出

}

while((pcCurrent-pcStart)!=SBUFSIZE)//循环读入指定长度字符

{

char cTemp;//临时变量

cTemp=fgetc(pfSourceFile);//读入一个字符

cTemp=CheckChar(pfSourceFile,ppcCurrent,cTemp,'N');//获取一个合法的字符

if(cTemp==0x20)

{

*pcCurrent=cTemp;

pcCurrent++;

*pcCurrent='#';//程序结束

break;//判断是否到文件末尾

}

*pcCurrent=cTemp;//若刚才输入的不为空格也没结束则输入到缓冲区

pcCurrent++;

}

//修改偏移量为当前偏移量,为下次读入用

lnOffset=ftell(pfSourceFile);

//关闭文件

//修改fcFlag为下次再次装入,更改缓冲区

if(fcFlag=='L') fcFlag='R';

else fcFlag='L';

}

return 3;

}

int CheckOperate(char cCheck)//检查是否运算符,返回在运算符数组中的偏移量{

int i;

for(i=0;i

{

if(cCheck==apcOperator[i]) return i;//返回在运算符数组中的偏移量}

return 0;//不是运算符

}

int CheckNewLine(char cCheck,int *piSubLine)//检测字符是否为回车

{

if(cCheck=='\n')

{

(*piSubLine)++;

return 1;

}

return 0;

}

int CheckKeyWords(char acCheckWords[])//检查单词是否为关键字若是返回在关键字列表中的下标,不是返回0

{

int i;

for(i=0;i

{

if(!strcmp(acCheckWords, apcKeyWords[i])) return i;

}

return 0;

}

int Error(int iSubLine)//错误处理函数,buffer质控

{

//打印错误信息

printf("第%d行",iSubLine);

lnOffset=0;//初始化文件偏移量

return 0;

}

int CheckEndBuffer(char **ppcCheckPoint,char *pcSubName)//检测是否越界,并自动切换缓冲区,bufferL越界返回1,bufferR越界返回2,没有越界返回0

{

static char fcBuffer ='L';//初始化第一次扫描bufferl

int iTempOffset;//临时偏移量变量

fcBuffer=='L'?(iTempOffset=*ppcCheckPoint-acScanBufL):(iTempOffset=*ppcCheckPoint-acSca nBufR);//计算偏移量

if(iTempOffset>=SBUFSIZE-1)//越界

{

{

PreProcess(pcSubName);//装入Buffer

*ppcCheckPoint=acScanBufR;//修改当前的指示器到下一个缓冲区的开始

fcBuffer='R';//修改buffer标志,当前指针在bufferR中

return 1;//bufferL越界返回1

}

else

{

PreProcess(pcSubName);//装入Buffer

*ppcCheckPoint=acScanBufL;//修改当前的指示器到下一个缓冲区的开始

fcBuffer='L';//修改buffer标志,当前指针在bufferL中

return 2;//bufferR越界返回2

}

}

return 0;//没有越界返回0

}

struct sBinaryRelation LexicalAnalyzer(char *pcSubName)//词法分析器

{

static char fcFirst='Y';

//初始化扫描指示器为第一个元素

static char *fpcStart;

char **fppcStart=&fpcStart;//取fpcstart的地址

static char *fpcSerching;

char **fppcfpcSerching=&fpcSerching;//取fpcSerching的地址

static int iLine=1;//记录当前的行数

int *piLine=&iLine;//指向行数的指针

struct sBinaryRelation sTempResult;//存放返回结果

{

PreProcess(pcSubName);

fcFirst='N';

fpcStart=acScanBufL;//将start和serch都指向第一个地址

}

while(*fpcStart==0x20)

{

if(!CheckEndBuffer(fppcStart,pcSubName)) fpcStart++;//检查是否越界,若没越界将start 指针指向一个不为空格的字符

}

fpcSerching=fpcStart;//serching指向start

//fpcSerching++;//serching指向start的下一个位置

while(*fpcSerching!=0x00)

{

if(CheckNewLine(*fpcStart,piLine))//检查回车,记录行数加一

{

//待扩建是否将\n也算作标识符

fpcStart++;

fpcSerching=fpcStart;//serching指向start

}

else if(isalpha(*fpcStart))//第一个字符是字母,为关键字

{

char cTempResult[SBUFSIZE]={0};

char *pcCurrent=cTempResult;

//检查是否为变量或关键字

while(isalnum(*fpcSerching))//下一个是字符或数字

//if(isspace(*fpcSerching)) break;//若为空格结束

*(pcCurrent++)=*fpcSerching;//将字符保存到临时数组,并且指针后移

if(!CheckEndBuffer(fppcfpcSerching,pcSubName)) fpcSerching++; //检查是否越界,若没越界将serching++

}//循环完成时fpceSerching指向当前标识符的下一个位置

//将start和serching重合

fpcStart=fpcSerching;

//返回当前的标识符放到结构体中

int KeyWordScript;//关键字的下标

if((KeyWordScript=CheckKeyWords(cTempResult))!=0)//检查是否为关键字还是普通变量

{

sTempResult.iId=0;//标志符置为0,关键字的下标

sTempResult.iSubScript=KeyWordScript;

sTempResult.acTempValName[0]='\0';//赋值

}

else//普通变量

{

sTempResult.iId=1;//单词为变量

int i=-1;

while(cTempResult[++i]!='\0')//将变量的值赋给变量名字数组

{

sTempResult.acTempValName[i]=cTempResult[i];

}

sTempResult.acTempValName[i]=cTempResult[i];//赋值个'\0'

sTempResult.iSubScript=0;//赋值

//返回结构体

return sTempResult;

}

else if(isdigit(*fpcStart))//如果是数字常量

{

int iTemp=0;

while(*fpcSerching!=0x20)//下面字符都要是数字

{

if((!isdigit(*fpcSerching))&&(isalpha(*fpcSerching)))//若后面是字幕或者不是操作符

{

printf("词法分析:");

Error(iLine);//不是数字报错

printf(" %d %c非法字符\n",iTemp,*fpcSerching);

}

iTemp=iTemp*10+int(*fpcSerching-0x30);//将数字字符转化为整形

if(!CheckEndBuffer(fppcfpcSerching,pcSubName)) fpcSerching++; //检查是否越界,若没越界将serching++

//判断是否是;若下一个字符是分号或者操作符就结束

if(*fpcSerching==';') break;

if(CheckOperate(*fpcSerching)) break;

}

//循环完成时fpceSerching指向当前标识符的下一个位置

fpcStart=fpcSerching;//将start和serching重合

//返回当前的标识符放到结构体中

sTempResult.iId=2;

sTempResult.iSubScript=iTemp;

return sTempResult;

}

else if(CheckOperate(*fpcStart)) //判断运算符

{

int iTempOperateOffset;//记录标识符下标

iTempOperateOffset=CheckOperate(*fpcStart);

//不需要因为serching本来就在start的下一个fpceSerching++;

if(!CheckEndBuffer(fppcStart,pcSubName)) fpcStart=++fpcSerching;//检查serching 是否越界,若没越界将start和serching重合

//返回当前的标识符放到结构体中

sTempResult.iId=3;

sTempResult.iSubScript=iTempOperateOffset;

sTempResult.acTempValName[0]='\0';//赋值

return sTempResult;

}

else

{

printf("词法分析:");

Error(iLine);//不是数字报错

printf(" %c非法字符\n",*fpcSerching);

exit(1);//退出程序

}

}

if(*fpcSerching!=0) printf("词法分析:未知错误\n");//若不为结束符,显示未知错误

exit(1);//失败返回空

int DebugLexicalAnalyzer(char *pcSubName)

{

struct sBinaryRelation sDebugResult;//存放返回结果

int i;

for(i=0;i<500;i++)

{

sDebugResult=LexicalAnalyzer(pcSubName);

printf("%d %d %d %s\n",i,sDebugResult.iId,sDebugResult.iSubScript,sDebugResult.acTempV alName);

}

return 0;

}

语法分析

#include"MyHeader.h"

#include

#include

#define GRAMMARLEN 14//定义问法表长度

#define FIRSTTABLELEN 12//定义优先表长度

#define VTLEN 10//定义vp集的长度

#define STACLSIZE 100//第一堆栈大小

#define NULL {1000,1000,"end"}

extern struct sBinaryRelation LexicalAnalyzer(char *pcSubName);//来自lexicalanalyzer中的函数struct sQuarternaryForm //四元式数组

int iOperateScript;//操作符的下标

struct sBinaryRelation sArgLeft;

struct sBinaryRelation sArgRight;

struct sBinaryRelation sArgResult;

//next;//指向下一个

};

struct sVp//vt集的结构体

{

struct sBinaryRelation sHead;//标识符

struct sBinaryRelation asVt[VTLEN];//vp集

};

struct sStack//栈结构体

{

char cType;

struct sBinaryRelation sPlace;

};

static struct sBinaryRelation aasQuarternaryForm[GRAMMARLEN][10]={

{{4,0,"start"},{4,0,"define"},{3,8,""},{4,0,"operate"},NULL},//非终结符start开始符号全部归结到start程序的开始符号start->define;operate;

{{4,0,"type"},{5,0,"special"},{4,0,"name"},NULL},//define->type special name

{{4,0,"type"},{0,0,""},NULL},//type->key

{{4,0,"name"},{1,0,""},NULL},//name->var

{{4,0,"operate"},{1,0,""},{3,1,""},{4,0,"operater"},{3,8,""},{4,0,"operate"},NULL},//op erate->var=operater;operate

{{4,0,"operate"},{1,0,""},{3,1,""},{4,0,"operater"},NULL},//operate->var=operater

{{4,0,"operater"},{4,0,"left"},{3,2,""},{4,0,"right"},NULL},//operater->left+right

编译原理课程设计

《编译原理》课程设计大纲 课程编号: 课程名称:编译原理/Compiler Principles 周数/学分:1周/1学分 先修课程:高级程序设计语言、汇编语言、离散数学、数据结构 适用专业:计算机科学与技术专业、软件工程专业 开课学院,系或教研室:计算机科学与技术学院 一、课程设计的目的 课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,设计题中的问题比平时的练习题要复杂,也更接近实际。编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。 要求学生在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法编制和程序代码的编写。 设计时间: 开发工具: (1) DOS环境下使用Turbo C; (2) Windows环境下使用Visual C++ 。 (3) 其它熟悉语言。 二、课程设计的内容和要求 设计题一:算术表达式的语法分析及语义分析程序设计。 1.目的

通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词 法检查和分析。 2.设计内容及要求: 算术表达式的文法: 〈无符号整数〉∷= 〈数字〉{〈数字〉} 〈标志符〉∷= 〈字母〉{〈字母〉|〈数字〉} 〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉} 〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’ 〈加法运算符〉∷= +|- 〈乘法运算符〉∷= *|/ (1) 分别选择递归下降法、算符优先分析法(或简单优 先法)完成以上任务,中间代码选用逆波兰式。 (2) 分别选择LL(1)、LR法完成以上任务,中间代码选 用四元式。 (3) 写出算术表达式的符合分析方法要求的文法,给出 分析方法的思想,完成分析程序设计。 (4) 编制好分析程序后,设计若干用例,上机测试并通 过所设计的分析程序。 设计题二:简单计算器的设计 1.目的 通过设计、编制、调试一个简单计算器程序,加深对语法及语 义分析原理的理解,并实现词法分析程序对单词序列的词法检 查和分析。 2.设计内容及要求 算术表达式的文法:

华北电力大学 两级放大电路实验报告

实验三 两级放大电路 一、实验目的 进一步掌握交流放大器的调试和测量方法,了解两级放大电路调试中的某些特殊问题; 二、实验电路 实验电路如图5-1所示,不加C F ,R F 时是一个无级间反馈的两级放大电路。在第一级电路中,静态工作点的计算为 3Β11123 R V V R R R ≈ ++, B1BE1 E1C156V V I I R R -≈ ≈+, CE11C1456()V V I R R R =-++ 9B21789 R V V R R R ≈ ++, B2BE2 E2C21112V V I I R R -≈ ≈+, C2CE21101112()V V I R R R =-++ 图5-1 实验原理图 第一级电压放大倍数14i2V1be115 (//) (1)R R A r R ββ=- ++ 其中i2789be2211()////[(1)]R R R R r R β=+++ 第二级电压放大倍数21013V2be2211 (//) (1)R R A r R ββ=- ++ 总的电压放大倍数 O1O2 O2V V1V2O1 i i V V V A A A V V V = = ?=?g g g g g g

三、预习思考题 1、学习mutisim2001或workbenchEDA5.0C 电子仿真软件 2、按实际电路参数,估算E1I 、CE1V 、C1I 和E2I 、CE2V 、C2I 的理论值 3、按预定静态工作点,以β1 =β2 = 416计算两级电压放大倍数V A 4、拟定Om V g 的调试方法

四、实验内容和步骤 1、按图5-1连接电路(三极管选用元件库中NPN 中型号National 2N3904) 实验中电路图的连接如下 2、调整静态工作点 调节R 1和R 7分别使E1V =1.7V ,E2V =1.7V 左右,利用软件菜单Analysis 中DC Oprating Point 分析功能或者使用软件提供的数字万用表(Multimeter )测量各管C V 、E V 、B V 。可以通过计算获得C I ,CE V ,将结果填入表5-1中。 1)、静态工作点调节后,两处调节值如图所示:

华北电力大学课程设计报告模板

课程设计(综合实验)报告( 2012-- 2013年度第一学期) 名称:电子技术综合实验 题目:数字电子钟的设计 院系:电气与电子工程学院 班级:电气1112 学号: 学生姓名:张三 指导教师:赵东 设计周数:1周 成绩: 日期:2014 年1 月17 日

任务书 (1) 一、课程设计(综合实验)的目的与要求 (3) 二、设计框图及电路系统概述 (4) 三、各单元电路的设计方案及原理说明、参数计算 (5) 四、调试过程及结果分析 (6) 五、设计、安装及调试中的体会 (7) 参考文献 (8) 附录(设计流程图、程序、表格、数据等) (9)

《电子技术》综合实验 任务书 一、目的与要求 1.目的 1.1综合实验是教学中必不可少的重要环节,通过课程设计巩固、深化和扩展学生的理论知识与初步的专业技能,提高综合运用知识的能力,逐步增强实际工程训练。 1.2注重培养学生正确的设计思想,掌握综合实验的主要内容、步骤和方法。 1.3培养学生获取信息和综合处理信息的能力、文字和语言表达能力以及协作工作能力。 1.4提高学生运用所学的理论知识和技能解决实际问题的能力及其基本工程素质。 2.要求 2.1 能够根据设计任务和指标要求,综合运用电子技术课程中所学到的理论知识与实践技能独立完成一个设计课题。 2.2根据课题需要选择参考书籍,查阅手册、图表等有关文献资料。要求通过独立思考、深入钻研课程设计中所遇到的问题,培养自己分析、解决问题的能力。 2.3进一步熟悉常用电子器件的类型和特性,掌握合理选用的原则。 2.4学会电子电路的安装与调试技能,掌握常用仪器设备的正确使用方法。利用“观察、判断、实验、再判断”的基本方法,解决实验中出现的问题。 2.5学会撰写综合实验总结报告。 2.6通过综合实验,逐步形成严肃认真、一丝不苟、实事求是的工作作风和科学态度,培养学生树立一定的生产观点、经济观点和全局观点。要求学生在设计过程中,坚持勤俭节约的原则,从现有条件出发,力争少损坏元件。 2.7在综合实验过程中,要做到爱护公物、遵守纪律、团结协作、注意安全。 二、主要内容 共有8个既有学习价值又有一定的实用性和趣味性的设计课题,学生根据自身情况自由选择其中之一。 1.移位寄存器型彩灯控制器 2.智力竞赛抢答器 3.电子拔河游戏机 4.交通信号灯控制器 5.数字电子钟 6.电子密码锁 7.电子秒表 8.数字电子钟(硬件)

编译原理课程设计报告(一个完整的编译器)

编译原理程序设计报告 一个简单文法的编译器的设计与实现专业班级:计算机1406班 组长姓名:宋世波 组长学号: 20143753 指导教师:肖桐 2016年12月

设计分工 组长学号及姓名:宋世波20143753 分工:文法及数据结构设计 词法分析 语法分析(LL1) 基于DAG的中间代码优化 部分目标代码生成 组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0) 部分目标代码生成 组员2学号及姓名:孙何奇20143754 分工:符号表组织 部分目标代码生成

摘要 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。 一.编译器的概述 1.编译器的概念 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。 2.编译器的种类 编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语

编译实验报告+源代码

课程设计报告 ( 2013-- 2014年度第1学期) 名称:编译技术课程设计B 题目:简单编译程序的设计与实现院系:计算机系 班级:XXX 学号:XXX 学生姓名:XXX 指导教师:XXX 设计周数:XXX 成绩: 日期:XX 年XX 月

实验一.词法分析器的设计与实现 一、课程设计(综合实验)的目的与要求 1.1 词法分析器设计的实验目的 本实验是为计算机科学与技术专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。 1.2 词法分析器设计的实验要求 设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。 单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。 表1-1 单词符号及其内部表示

二、设计(实验)正文 1.词法分析器流程图 2.词法分析器设计程序代码 // first.cpp : 定义控制台应用程序的入口点。// #include"stdafx.h" #include #include using namespace std; int what(char a) { if((int(a)>=48)&&(int(a)<=57)) {

华北电力大学课程设计综合实验电子密码锁

课程设计(综合实验)报告 ( 2013 -- 2014 年度第 1 学期) 名称:综合实验 题目:电子密码锁 院系: 班级: 学号: 学生姓名: 指导教师: 设计周数:1周 日期:2012年1 月14 日

一、课程设计(综合实验)的目的与要求 锁是人们生活中的常用物品。本题要求用电子器件设计制作一个密码锁,使之在输入正确的代码时,输出开锁信号以推动机构动作,并用红灯亮、绿灯灭表示关锁,而绿灯亮、红灯灭表示开锁。 1.在锁的控制电路中存储一个可修改的8421BCD码作为密码,当输入代码和锁的密码相等时,进入开锁状态使锁打开。 2.从第一次密码输入之后的5秒内若未将所打开,则电路进入自锁状态,使之无法再打开,并由扬声器发出持续20秒的报警信号。 二、设计(实验)正文 1.电子密码锁的原理框图如图6.1 图6.1 电子密码锁的原理框图 2.设计思路 (1)该题的主要任务是产生一个开锁信号,而开锁信号的形成条件是输入代码和已设置的密码相同。实现这种功能的电路构思有多种。比如:用2片8位数据锁存器或2片4 位寄存器,一片存入开锁的代码,另一片存入密码,通过比较的方法判断,若二者相等,则形成开锁信号。 (2)在产生开锁信号后,要求输出声、光信号。其中音响的产生可以由开锁信号去触发一个音响电路。其中的光信号可以用开锁信号点亮LED指示灯。 (3)用按钮开关的第一个动作信号触发一个5S的定时器,若在5秒内未将锁打开,则电路进入自锁状态,使之无法再打开,并由扬声器发出持续20秒的报警信号。

3.具体方案 1)密码修改与储存电路: 该题的主要任务是产生一个开锁信号,而开锁信号的形成条件是输入代码和已设置的密码相同。利用74LS148实现编码,用两个相同的74LS148,非常易于操作,底下的电路用于设置密码,上面的用来输入密码。 2)比较电路 利用74LS85比较器进行比较,是一个重要的枢纽环节,前面的密码输入正确时,A=B 时可令后面的绿灯亮,红灯灭,还可以决定后面的计时电路工作与否。

编译技术课程设计A实验报告(华北电力大学科技学院)

课程设计报告 ( 2011-- 2012年度第1学期) 名称:编译技术课程设计A 院系:科技学院信息工程系班级:软件09k2 学号:0919******** 学生姓名:闫雪峰 指导教师:郭丰娟 设计周数: 2 成绩: 日期:2011年12 月6日

《编译技术课程设计A》 任务书 一、目的与要求 1. 理解和掌握编译程序设计原理及常用的技术,建立编译程序的整体概念; 2. 理解和掌握编译程序词法分析、语法分析、语义分析、中间代码生成和目标代码生成等几个关键环节原理和实现算法; 3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。 二、主要内容 定义一个简化的类C语言—L语言作为源语言,重点针对词法分析、语法分析、语义分析、中间代码生成和目标代码生成等几个关键环节进行编程和调试训练,最终设计实现L 语言的编译程序。 通过调试L编译程序,了解一般编译程序的总体框架,掌握编译各阶段程序的构造,理解和掌握错误处理方法及符号表的组织方式,理解和掌握语法制导翻译方法。还可以适当扩展L语言成分,并对相应的编译程序进行扩充。可使用C、VC++等语言编程实现。 具体内容包括: 1.由单词的语法规则出发、画出识别单词的状态转换图,然后用程序实现扫描器设计。 2.设计、编写和调试算法优先分析程序,了解算法优先分析器的组成结构以及对文法 的要求,掌握实现通用算法优先分析算法的方法。 3.在算符优先分析文法的基础上进行翻译工作,生成四元式表; 4.设计一个简单的代码生成器,该代码生成器以基本块为单位,依次将每条中间代码 变换成相应的目标代码。 5.综合以上实验的结果,并进行集成与设计,开发出一个小型编译程序。 对于各项主要内容的实现细节描述和指导,请参考《计算机综合实践指导》编译技术的相关内容。 三、进度计划

编译原理 C++编译器课程设计报告

编译器的设计与分析 学号: 1233050143 姓名:李博 专业:计算机科学与技术 __ 课程:编译原理 指导教师:闫红

实验目的 本实验设计的小型编译程序涉及到编译前端的三个阶段:词法分析、语法分析和语义分析生成中间代码 ((四元式),编译程序的重点放在中间代码生成阶段。编译程序的输出结果包括词法分析后的二元式序 列、变量名表;语法分析后的状态栈分析过程显示;语义分析生成中间代码后的四元式程序。整个程序 分为三个部分:(1)词法分析部分(2)语法分析、语义分析及四元式生成部分(3)输出显示部分 实验要求: 本程序仅考虑由下面产生式所定义的程序语句: S →if B then S else S | while B do S | begin L end | A L →S;L | S A →i:= E B →B∧B|B∨B|~B|(B)|I rop i|i

其中,各个非终结符的含义是: S---语句 L—语句串 A—赋值句 B---布尔表达式 E---算术表达式 各个终结符的含义: i---整型变量或常数,布尔变量或常数; rop---为六种关系运算符的代表; ;---起语句分隔作用; :=---赋值符号 ~--逻辑非运算符; ∧----逻辑与运算符; ∨---逻辑或运算符; 规定程序是由一条语句或由begin和end嵌套起来的复合语句组成的,并且规定的语句末加上#@表示程序结束。下面是符合规定的程序示例:begin A:=A+B*C; C:=A+2; while AB do

if M=N THEN C:=D else while A<=D do A:=D end#@ 实验内容: 第一部分:词法分析 一.词法分析的功能: 输入:所给文法的源程序字符串 输出:1.二元组(单词种别,单词符号的属性值)构成的序列 2.关键字: { (相当于Pascal语言中的begin) , if ,else , while , }(相当于 Pascal语言中的end ) 所有的关键字都是小写字母. 3.运算符: + , - , * , / , = , < , <= , == , > , >= ,<> , && ,|| , ! 4.界符: 逗号,分号,左圆括号, 右圆括号, # 5.常数: 在这里只涉及到int型常量 6.其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义: ID = letter(letter|digit)* NUM = digit digit * 7.空格由空白,制表符和换行符组成,空格一般用来分隔ID,NUM,运算符,界符和关键字,词法分析阶段通常会被过滤掉。 二.词法分析程序设计

华北电力大学操作系统实验报告

华北电力大学 实验报告 | | 实验名称____ 操作系统综合实验 课程名称______ 操作系统 | | 专业班级:网络学生姓名: 学号:成绩: 指导教师:王德文/姜丽梅实验日期:2015年11月4日

实验一实验环境的使用 一、 实验目的 1. 熟悉操作系统集成实验环境 OS Lab 的基本使用方法。 2. 练习编译、调试EOS 操作系统内核以及EOS 应用程序。 二、 实验内容 1. 启动 OS Lab; 2. 学习OS Lab 的基本使用方法:练习使用 OS Lab 编写一个 Windows 控制台应用程 序,熟悉 OS Lab 的基本使用方法(主要包括新建项目、生成项目、调试项目等); 3. EOS 内核项目的生成和调试:对 EOS 内核项目的各种操作(包括新建、生成和各 种调试功能等)与对 Windows 控制台项目的操作是完全一致的; 4. EOS 应用程序项目的生成和调试; 5. 退出 OS Labo 三、 实验内容问题及解答 1. 练习使用单步调试功能(逐过程、逐语句),体会在哪些情况下应该使用“逐过 程”调试, 在哪些情况下应该使用“逐语句”调试。练习使用各种调试工具(包括“监 视”窗口、“调用堆栈”窗口等)。 答:逐语句,就是每次执行一行语句,如果碰到函数调用,它就会进入到函数里面。 而逐过程,碰到函数时,不进入函数,把函数调用当成一条语句执行。因此,在需要进 入函数体时用逐语句调试,而不需要进入函数体时用逐过程调试。 四、实验过程 1. 新建Windows 控制台应用程序 生成项目: 执行项目: 调试项目: int Func (Int 口〕,// 芦明F UEK 函数 i. nx n - 0, n = FunjcdO); print f CHello World 查看 EOS SDK( Software Development Kit )文件夹: 修改EOS 应用程序项目名称: pflMSni-E-l (Prftss Ctrl+FVFR switcli corisnlfi uiitdnu...) Ucleone to EOS shell 五、实验心得 这次是验证性试验,具体步骤和操作方法都是与实验教程参考书上一致, 实验很顺利, 实验过程没有遇到困难。通过这次实验,我掌握了 OS Lab 启动和退出操作;练习使用 OS Lab 编写一个Windows 控制台应用程序,熟悉 OS Lab 的基本使用方法新建项目、生 成项目、调试项目等。 2. 使用断点终端执行: 13

编译原理实验报告

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

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

编译原理课程设计

先简要分析一下语法分析的大致流程: 当有句子要进行处理时,首先要对其进行词法分析来分解出该句子中的每个符号,然后将该句子按照算符优先算法压入归约栈中,如果可以顺利归约,则说明这是一个合法的句子,否则该句子非法。 这里有一个需要考虑的地方,就是如何进行归约。由于文法已经给定,所以我们考虑设计一个文法表,文法表中的内容就是可归约串的种别码的顺序,比如v=E可以表示为9,1,13。这样的话当我们要进行一次归约时,只用按顺序存储最左素短语中符号的种别码,然后拿这个种别码序列与文法表进行匹配,就可知道当前归约需要执行哪些操作。 还有一点需要注意,就是如何对一个表达式进行求值。这里需要我们设计一个二元组的变量名表,这个变量名表可以根据变量的名称来返回变量的数据。变量名表的具体设计见详细设计部分。 由于是简化分析,所以这个程序只考虑整数的处理。 有了上面的分析,可以构造出算符优先分析算法的流程图,如下图所示。

详细设计 (1)词法分析部分 由于词法分析的内容在课程设计1中已经介绍,并且这次的状态转换图与课程设计1中的非常相似,所以这里就不过多介绍。(2)优先关系表 在程序中我们用一个二维数组priTable[][]来存储算符间的优先关系。priTable[a][b]=1表示a>b; 。priTable[a][b]=0表示a=b; 。priTable[a][b]=-1表示a

华北电力大学EDA实验报告

课程设计报告 (2013--2014年度第1学期) 名称:电子电工实习(EDA部分)院系:科技学院信息系 班级: 学号: 学生姓名: 指导教师:张宁孙娜 设计周数:分散1周 成绩: 日期:2013年11月9日

一、课程设计(综合实验)的目的与要求 1、实验目的 设计一个具有基本功能的电子钟 2、实验要求 (1)、在6位数码管上按24小时进制显示“时”“分”“秒”; (2)、有对“时”“分”“秒”的校时功能; (3)、具有正点报时功能。当快到正点,即某点59分50秒时,电子钟报时,蜂鸣器鸣叫,10秒后结束; 二、设计实验 1、设计原理及其框图 (1)数字钟的构成

数字钟是一个将“时”,“分”,“秒”显示于人的视觉器官的计时装置。它的计时周期为24小时,显示满刻度为23时59分59秒,。因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”计数器、校时电路、报时电路和蜂鸣器组成。干电路系统由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路组成。秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度。将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计时器,可实现对一天24小时的累计。译码显示电路将“时”、“分”、“秒”计数器的输出状态送到六段显示译码器译码,通过六位LED 六段显示器显示出来。整点报时电路时根据计时系统的输出状态产生一脉冲信号,然后去触发一音频发生器实现报时。校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整的。 (2)、简述74LS163 2、设计思路 通过分析实验要求得出:选用74LS163芯片共计6片,采用同步计数的方法来设计相关计时器(同一源输入脉冲接至CLK ,控制ENT 使能端实现计数),秒位计时器与分位计时器均为60进制,时位计时器为24进制。 控制验证当数字电子钟的输出为59分50秒时,与一个本电路所用的源输入脉冲信号,利用与门的特性输出相应的高低电平接通蜂鸣器实现整点报时。 三、实验具体设计 1、秒位计时电路设计(60进制) 秒低位计数用十进制计数器(74163改装)计数,由脉冲信号触发计数,9秒(秒低位输出1001B )时,秒低位清零;秒高位计数用六进制计数器(74163改装)计数,9秒时,秒高位芯片ENT 输入高电平,由此触发计数,59秒(秒低位输出1001B ,秒高位输出0101B )时,秒高位清零。如图(1)所示 74LS163芯片 4位二进制输出

华北电力大学实验报告

华北电力大学 实验报告 实验名称:超外差收音机安装与调试 一、实验目的 1.了解常用电子器件的类别、型号、规格、性能及其使用范围,能查阅有关的 电子器件图书。能够正确识别和选用常用的电子器件,并且能够熟练使用万用表。 2.学习并掌握超外差收音机的工作原理 3.了解超外差式收音机的调试方法。

4.熟悉手工焊锡的常用工具的使用及其维护与修理,基本掌握手工电烙铁的焊 接技术。 二、实验原理图 三、元器件清单 元件型号数量位号元件型号数量位号 三极管9013 2只V6、V7 电阻56Ω1只R5 三极管9014 1只V5 电阻100KΩ2只R7、R10 三极管9018 4只V1、V2、V3、V4 电阻120KΩ1只R1 发光二极管红色1只LED 瓷片电容103 1只C2 磁棒及线圈4x8x80mm 1套T1 瓷片电容C1、C4、C5 振荡线圈TF10(红色)1只T2 瓷片电容223 7只C6、C7、C10 中频变压器TF10(黄色)1只T3 瓷片电容C11 中频变压器TF10(白色)1只T4 电解电容 4.7uF 2只C3、C8 中频变压器TF10(绿色)1只T5 电解电容100uF 3只C12、C13、C9 输入变压器蓝色1只T6 双联电容CBM-223PF 1只CA 扬声器0.5W 8Ω1只BL 耳机插座?3.5mm 1只CK 电位器10KΩ1只RP 装配说明书1分 电阻51Ω1只R8 机壳上盖1个 电阻100Ω2只R13、R15 机壳下盖1个 电阻120Ω2只R12、R14 刻度面板1块 电阻150Ω1只R3 调谐拨盘1只 电阻220Ω1只R11 电位器拨盘1只 电阻510Ω1只R16 磁棒支架1只

编译原理课程设计 C语言编译器的实现

编译原理课程设计报告 设计题目编译代码生成器设计 学生姓名 班级 学号 指导老师 成绩

一、课程设计的目的 编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,它在系统软件中占有十分重要的地位,是计算机专业学生的一门主修课。为了让学生能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识,提高他们的软件设计能力,特设定该课程的课程设计,通过设计一个简单的PASCAL语言(EL语言)的编译程序,提高学生设计程序的能力,加深对编译理论知识的理解与应用。 二、课程设计的要求 1、明确课程设计任务,复习编译理论知识,查阅复印相关的编译资料。 2、按要求完成课程设计内容,课程设计报告要求文字和图表工整、思路清晰、算法正 确。 3、写出完整的算法框架。 4、编写完整的编译程序。 三、课程设计的内容 课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于编译的知识量较复杂而且综合性较强,因而对一个完整的编译程序不适合平时实验。通过课程设计可以达到综合设计编译程序的目的。本课程的课程设计要求学生编写一个完整的编译程序,包括词法分析器、语法分析器以及实现对简单程序设计语言中的逻辑运算表达式、算术运算表达式、赋值语句、IF语句、While语句以及do…while语句进行编译,并生成中间代码和直接生汇编指令的代码生成器。 四、总体设计方案及详细设计 总体设计方案: 1.总体模块 主程序 词法分析程序语法分析 程序 中间代码 生成程序

2. 表2.1 各种单词符号对应的种别码 单词符号种别码单词符号种别码bgin 1 :17 If 2 := 18 Then 3 < 20 wile 4 <> 21 do 5 <= 22 end 6 > 23 lettet(letter|digit)* 10 >= 24 dight dight* 11 = 25 + 13 ;26 —14 ( 27 * 15 ) 28 / 16 # 0 详细设计: 4.1界面导入设计 (1)一共三个选项: ①choice 1--------cifafenxi ②choice 2--------yufafenxi ③choice 3--------zhongjiandaima (2)界面演示 图一

(重庆理工大学计算机学院)编译原理课程设计报告

编译原理课程设计报告 实验名称编译原理课程设计 班级 学号 姓名 指导教师 实验成绩 2013 年06月

一、实验目的 通过设计、编写和调试,将正规式转换为不确定的有穷自动机,再将不确定的有穷自动机转换为与之等价的确定的有穷自动机,最后再将确定有穷自动机进行简化。 通过设计、编写和调试构造LR(0)项目集规范簇和LR分析表、对给定的符号串进行LR分析的程序,了解构造LR(0)分析表的步骤,对文法的要求,能够从文法G出发生成LR(0)分析表,并对给定的符号串进行分析。 二、实验内容 正规式——>NFA——>DFA——>MFA 1.正规式转化为不确定的有穷自动机 (1)目的与要求 通过设计、编写和调试将正规式转换为不确定的有穷自动机的程序,使学生了解Thompson算法,掌握转换过程中的相关概念和方法,NFA的表现形式可以是表格或图形。 (2)问题描述 任意给定一个正规式r(包括连接、或、闭包运算),根据Thompson算法设计一个程序,生成与该正规式等价的NFA N。 (3)算法描述 对于Σ上的每个正规式R,可以构造一个Σ上的NFA M,使得L(M)=L(R)。 步骤1:首先构造基本符号的有穷自动机。 步骤2:其次构造连接、或和闭包运算的有穷自动机。

(4)基本要求 算法实现的基本要求是: (1) 输入一个正规式r; (2) 输出与正规式r等价的NFA。(5)测试数据 输入正规式:(a|b)*(aa|bb)(a|b)* 得到与之等价的NFA N

(6)输出结果 2.不确定的有穷自动机的确定化 (1)目的与要求 通过设计、编写和调试将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,使学生了解子集法,掌握转换过程中的相关概念和方法。DFA的表现形式可以是表格或图形。(2)问题描述 任意给定一个不确定的有穷自动机N,根据算法设计一个程序,将该NFA N变换为与之等价的DFA D。 (3)算法描述 用子集法将NFA转换成接受同样语言的DFA。 步骤一:对状态图进行改造 (1) 增加状态X,Y,使之成为新的唯一的初态和终态。从X引ε弧到原初态结点, 从原终态结 点引ε弧到Y结点。 (2) 对状态图进一步进行如下形式的改变

编译原理实验报告总结

学年第学期《编译原理》实验报告 学院(系):计算机科学与工程学院 班级: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).语义分析 语义分析器对各句子的语法做检查:运算符两边类型是否相兼容;该做哪些类型转换(例如,实数向整数赋值要"取整");控制转移是否到不该去的地方;是

华北电力大学微机课程设计

. 课程设计(综合实验)报告 ( 20 14 -- 20 15 年度第1学期) 名称:微机原理课程设计 题目:课题2 交通灯控制系统 院系:控制与计算机工程学院 班级:自动化1203 学号:1121190308 学生:帅__ 指导教师:吴华 设计周数:1周 成绩: 日期:年月日

一、课程设计(综合实验)的目的与要求 1.1目的:在微机原理及应用课程中分别了微计算机各个基本组成模块的原理和编程技术的基础之上,综合应用各部分知识,在实验室现有设备情况下,设计一个具有一定功能的应用系统,达到对各部分知识加深理解,融会贯通的目的。 1.2要求:用8255实现交通信号灯软件,硬件设计。8255控制LED发光管实现的十字路口信号灯电路及管理程序,并尽量接近真实信号灯的工作情况。 二、设计(实验)正文 1. 设计题目:一个十字路口的交通信号灯,东西向为一组,南北向为一组,组信号灯亮灭情况相同,R6、Y5、G4 作为南北路口的交通灯,R2、Y1、G0作为东西路口的交通等. 程使六个灯按交通等变化规律亮灭。要求进行周期性重复控制: g) 南北路口的绿灯、东西路口的红灯同时亮20 秒。 h) 南北路口的黄灯闪烁3 秒,同时东西路口的红灯闪3 秒。 i) 南北路口的红灯、东西路口的绿灯同时亮90 秒。 j) 南北路口的红灯、同时东西路口的黄灯亮闪烁3 秒。 k) 在LED 上同步显示倒计时。 2 设计过程: 2.1 芯片类型及使用: ( 1 )交通信号灯的灯光变化和数码显示通过8255实现控制。PA口用于输出信号控制灯光的变化,PB口用于输出信号控制数码管的显示,PC0用于输入k0的控制开关信号,PC1用于输入用于硬件延时的方波信号。PC7用于输出控制数码管工作/不工作的信号。故写入方式控制字为10000001B=81H ( 2 )LED数码显示:数码管采用共阴极接法,位选信号为0则数码管工作。 a~dp段发亮条件:对应位输入1,见下表所示:

编译技术课程设计报告模板静

编译技术课程设计 班级网络1102 学号3110610035 姓名徐静 指导老师年轶 2014年6 月

目录 一、目的 (2) 二、题目 (2) 三、要求 (2) 四、实验环境 (2) 五、系统实现 (2) 六、程序运行结果 (8) 七、总结 (9)

一、目的 通过《编译原理》课程设计进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解,掌握词法分析、语法分析、语义分析、代码生成和报错处理等理论与实践的结合,提高自己的编程能力,培养好的程序设计风格。同时通过某种可视化编程语言的应用,具备初步的Windows环境下的编程思想。 二、题目 输入文法,自动生成分析表,并完成语法分析工作 三、要求 题目3 文法编译器的自动生成器 输入文法,自动生成分析表,并完成语法分析工作。 语法分析方法可以是:LL(1)分析法或LR分析法。 为文法构造分析表,并对输入串进行语法分析,判别是否符合语法规则,如果不符合,则输出错误信息。 输入:文法,文法符号串 输出:分析表、分析栈、分析结果 四、实验环境 开发环境Visual Studio6.0 语言C++ 五、系统实现 1.分析方法说明 所谓LL(1)分析法,就是指从左到右扫描输入串(源程序),同时采用最左推导,且每次直接推导只需向前看一个输入符号,便可确定当前所应当选择的规则。实现LL(1)分析的程序又称为LL(1)分析程序或LL(1)分析器。 我们知道一个文法要能进行LL(1)分析,那么这个文法应该满足:无二义性,无左递归,无左公因子。当文法满足条件后,再分别构造文法每个非终结符的FIRST和FOLLOW集合,然后根据FIRST和FOLLOW集合构造LL(1)分析表,最后利用分析表,根据LL(1)语法分析构造一个分析器。LL(1)的语法分析程序包含了三个部分,总控制程序,预测分析表函数,先进先出的语法分析栈,本程序也是采用了同样的方法进行语法分析,该程序是采用了C++语言来编写。 2.分析表的构造算法 在构造LL(1)预测分析表之前,首先要构造该文法的每个非终结符的FIRST和FOLLOW 集合,按照下面描述的算法来构造这两个集合。 ①FIRST集合的构造算法: (1)若X∈VT,则FIRST(X)={X}。 (2)若X∈VN,且有产生式X→a……,则把a加入到FIRST(X)中;若X→ε也是一条产生式,则把ε也加到FIRST(X)中。 (3)若X→Y……是一个产生式且Y∈VN,则把FIRST(Y)中的所有非ε-元素都加到FIRST(X)中;若X→Y1Y2…Yk是一个产生式,Y1,…,Yi-1都是非终结符,而且,对于任何j,1≤j

编译原理课程设计报告

2011-2012学年第二学期 《编译原理》课程设计报告 学院:计算机科学与工程学院 班级: 学生姓名:学号: 成绩: 指导教师: 时间:2012年5 月

目录 一、课程设计的目的 ---------------------------------------------------------------- - 1 - 二、课堂实验及课程设计的内容 -------------------------------------------------- - 1 - 2.1、课堂实验内容-------------------------------------------------------------- - 1 - 2.2、课程设计内容-------------------------------------------------------------- - 1 - 三、visual studio 2008 简介------------------------------------------------------- - 2 - 四、问题分析及相关原理介绍 ----------------------------------------------------- - 3 - 4.1、实验部分问题分析及相关原理介绍 ---------------------------------- - 3 - 4.1.1、词法分析功能介绍及分析------------------------------------- - 3 - 4.1.2、语法分析功能介绍及分析------------------------------------- - 3 - 4.1.3、语义分析功能介绍及分析------------------------------------- - 4 - 4.2、课程设计部分问题分析及相关原理介绍 ---------------------------- - 5 - 4.2.1、编译程序介绍 ----------------------------------------------------- - 5 - 4.2.2、对所写编译程序的源语言的描述(C语言) -------------- - 6 - 4.2.3、各部分的功能介绍及分析 -------------------------------------- - 7 - 4.3、关键算法:单词的识别-------------------------------------------------- - 8 - 4.3.1、算法思想介绍 ----------------------------------------------------- - 8 - 4.3.2、算法功能及分析 -------------------------------------------------- - 8 - 五、设计思路及关键问题的解决方法 ------------------------------------------ - 10 - 5.1、编译系统------------------------------------------------------------------ - 10 - 5.1.1、设计思路 --------------------------------------------------------- - 10 - 5.2、词法分析器总控算法--------------------------------------------------- - 12 - 5.2.1、设计思路 --------------------------------------------------------- - 12 - 5.2.2、关键问题及其解决方法 --------------------------------------- - 13 - 六、结果及测试分析-------------------------------------------------------------- - 14 - 6.1、软件运行环境及限制--------------------------------------------------- - 14 - 6.2、测试数据说明------------------------------------------------------------ - 14 - 6.3、运行结果及功能说明--------------------------------------------------- - 16 - 6.4、测试及分析说明--------------------------------------------------------- - 16 - 七、总结及心得体会 --------------------------------------------------------------- - 17 - 7.1、设计过程------------------------------------------------------------------ - 17 - 7.2、困难与收获 ------------------------------------------------------------- - 17 - 八、参考文献 ------------------------------------------------------------------------ - 18 -

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