编译原理——网工0801—夏涛_第1页
编译原理——网工0801—夏涛_第2页
编译原理——网工0801—夏涛_第3页
编译原理——网工0801—夏涛_第4页
编译原理——网工0801—夏涛_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、黄冈师范学院提高型实验报告实验课题简易C语言编译器(实验类型:口综合性 设计性 口应用性)实验课程编译原理实验时间2010年12 月19日学生姓名夏涛专业班级 网络200801学 号 200826340124一、 设计题目- 1 -二、 运行环境- 1 -三 、 算法设计的思想- 1 -四、 算法的流程图- 3 -五、 算法设计分析- 6 -六 、 源代码 - 11 -七 、 运行结果分析- 15 -八 、 收获及体会- 18 -一、设计题目简易C语言编译器二、运行环境? 硬件环境:奔腾IV处理器,主频2.0GHz;内存512M;硬盘80G以 上;1024X 768显示分辨率? 软件环境: W

2、indows XP2; Visual C+6.0三、算法设计的思想编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。每一个阶段在功能上 是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另 一方面由将结果传递给下一个阶段。由编译程序的五个阶段就对应了编 译系统的结构。其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成 为一个一个的单词符号二元式。一般程序语言的单词符号包括关键字、 运算符、常数、标识符和界符。语法分析器将这些单词符号作为输入, 对它进行语法分析。语法分析分为两种方法:自上而下分析法和自下而 上分析法。针对不

3、同程序语言的语法规则可以采取不同的分析方法,当 然两种方法也可以同时使用。语法分析器把语法单元作为输入供语义分 析器使用。一般的语义分析器主要采用的是语法制导方法,即在语法分析的同时进行语法分析,并产生一定的语义动作,来生成中间代码。上 面三个过程可以与硬件无关,而接下来的优化器和目标代码生成器是针 对某一种处理器而言的。代码优化是将语义分析生成的中间代码进行优 化,产生执行效率更高的代码。目标代码生成器最终生成可以在某种机 器上运行的机器语言或者汇编语言。在整个编译过程中还包括对表格的 操作和对错误的处理,这些也都是非常重要的环节。下图给出了编译系统的结构框图:词法分析器1,单词符号语法分析

4、器1r语法单元语义分析与中间代码生成器1:中间代码优化器1,中间代码目标代码生成器源程序目标代码出错处理-21 -四、算法的流程图1、词法分析:ar)isalpha(buffer isdigit(bufferChbufferChar=alpha( bufferChar);bufferChar=digit (bufferChar);bufferChar=other (bufferChar);rollback。;rollback。;rollback。;Char)bufferChar!='#'Tbu他rChar!=#'T2、语法分析:开始从词法输出中读入token序列,放入i

5、nput初始化堆栈,并将 '#'和'S'放入堆栈3、语义分析:五、算法设计分析1、使用的数据结构和关键变量struct Stack /栈结构体:序号、内容、连接下一结点指针int num;char name;struct Stack *next;;struct Guiyue /规则集结构体:序号、规则长度、符号、连接下一结点 指针int num;int count;char name;struct Guiyue *next;struct Relation /分析表结构体:状态序号、对应符号列、操作类型的对 应序号、操作类型、连接下一结点指针int line_St

6、ates ;char rank_Letter;int relationship;char name;struct Relation *next;struct Sign /符号表结构体:自变量名、标识类型、连接下一结点指针char name20;char kind;struct Sign *next;;struct Word /单词表结构体:单词名字、标识类型、状态、序号、行号、 连接符号表指针、连接下一结点指针char name20;char mark_name;int state;int num;int line;struct Sign *link;struct Word *next;FIL

7、E *fp1, fp2; / 文件指针int row = 1;/字符行变量int line10000, Lin300;/ 字符行int w_num; /单词所在行、字符数char buffer10000; / 字符串缓冲区struct Word *head,*find;/单词表结构体头指针struct Relation *r_head;/分析表结构体头指针struct Guiyue *g_head;/规约集结构体头指针struct Stack *s_head;/栈结构体头指针2、用到的LR文法Terminator m v ( ) i = ; f e w a b c d , & | &l

8、t; > # + - * / nNonTerminator B Q S A C X Y Z E H G L I K T FStarter BPrecept00、B->Q01、Q->v m ( ) A 02、S->C ; S03、A->S A04、A->S05、C->C ; X06、C->X07、X->Y Z08、Y->a09、Y->b10、Y->c11、 Y->d12、Z->i , i13、Z->i14、S->f ( E ) A e A 15、S->w ( E ) A 16、S->i =

9、 L ;17、E->E & H18、E->H19、H->H | G20、H->G 21、G->i < i22、G->i > i23、G->i # i24、G->i i25、G->( E )26、G->! E27、G->i28、L->L + I29、L->I30、I->I - K31、I->K32、K->K / T33、K->K34、T->T * F35、T->F36、F->( L )37、F->n38、 F->i3、主要功能函数简述以下是实现的

10、主要功能函数的信息简述,具体实现请参看六、源代码int judge(char ch)功能:接收ch判断字符,变量flag返回字符类别void scan()功能:扫描输入源文件,并生成单词种别码struct Word *InitWord()功能:包括分割单词、标识单词、生成变量符号表、完善单词属性表int ResultAnely(Relation* r_head,Stack *s_head, char str口,Guiyue *g_head, int cal)功能:词法分析函数int ResultAnely(Relation *r_head,Stack *s_head,charstr口,Guiy

11、ue *g_head,int cal)功能:语法分析函数void ProduceStyle(char str口,int order_num)功能:算术表达式四元式函数void BoolStyle(char str口,int order_num)功能:布尔表达式四元式函数void FourStyle(int goon, Word *head)功能:显示四元式函数Stack *MarkPush(Stack *ip,char mark,int I_i)功能:进栈void MarkPop(Stack *ip)功能:出栈void FindWordDeclare(Word *head)功能:正确性检测函数

12、,查找保留字是否被声名和符号是否对称Relation *FirstRelation()功能:初始化分析表函数Guiyue *FirstGuiyue()功能:初始化规则表函数六、源代码(部分)由于此次实验中所用全部代码量太多,在此只列出主要的功能模块(函数)的代码以做基本概要的说明:int judge(char ch)/接收ch判断字符,变量flag返回字符类别(int flag;if(ch='!'11ch='$'|ch='&'|ch='*'11ch='('|ch=')'11ch='-

13、'|ch='_'| ch='+'|ch='='|ch='|'|ch=''|ch=''11ch=''11ch=''11ch=''| ch=':'|ch='"'|ch='<'|ch=','|ch='>'|ch='.'|ch='/'|ch=''') flag=1;else if('0&#

14、39;<=ch&&ch<='9')flag=2;else if('a'<=ch&&ch<='z')|('A'<=ch&&ch<='Z')flag=3;else if(ch='')flag=4;else if(ch='n')flag=5;else if(ch='?')flag=6;else if(feof(fp1)flag=7;/结束elseflag=0; /illegal charac

15、terreturn(flag);void scan()char ch;int flag,j=0,i=-1;while(!feof(fp1) ch=fgetc(fp1);flag=judge(ch);printf("%c",ch);/显示打开的文件if(flag=1|flag=2|flag=3) i+;bufferi=ch;linei=row;else if(flag=4)i+;bufferi='?'linei=row;else if(flag=5)i+;bufferi=''row+;else if(flag=7) continue;else

16、cout<<"n请注意,第"<<row<< "行的"<<ch<<"是非法字符! "<<endl;w_num=i;/*确定单词所在的行*/int one,two,k=0;for(i=0;i<w_num;i+)one=judge(bufferi);two=judge(bufferi+1);if(one!=two&&bufferi!='?'&&bufferi!='')|one=1) Link=line

17、i;k+; void FindWordDeclare(Word *head)struct Sign *s_first;struct Word *find,*w_name1000,*word_fu100;struct Stack *ip,*q;int i,cal=0,ca=0,end;find=head;cout<<endl<<"=显 示 检 查 结 果 ="<<endl;while(find)if(find->mark_name='i') w_namecal=find;cal+;if(find->next!=N

18、ULL)if(find->mark_name=find->next->mark_name)&&(find->mark_name!='')&&(find->mark_name!='')&&(find->mark_name!='(')&&(find->mark_nam e!=')cout<<"第"<<find->line<<"行,"<<find-

19、>mark_name<<"'存在字符重复错误!"<<endl;elseif(find->mark_name='i'&&find->next->mark_name='')|(find->mark_na me=','&&find->next->mark_name='')|(find->mark_name=','&&find->next->mark_name=&#

20、39;')|(find->mark_n ame=''&&find->next->mark_name=',')|(find->mark_name='('&&find->next->mark_name=',')|(find->mark_n ame=','&&find->next->mark_name='(')|(find->mark_name=')'&&fi

21、nd->next->mark_name='')|(find->mark_n ame=')'&&find->next->mark_name=',')|(find->mark_name=')'&&find->next->mark_name='') cout<<"第"<<find->line<<"行,"<<find->name<<&

22、quot;处存在符号连接错误!"<<endl;if(find->mark_name='a'|find->mark_name='b'|find->mark_name=' c'|find->mark_name='d')&&(find->next->mark_name=''|find->next->mark_name=''|find->next- >mark_name=','|find->

23、;next->mark_name=''|find->next->mark_name='('|find->next-> mark_name=')'|find->next->mark_name='+'|find->next->mark_name='-'|find->next- >mark_name='*'|find->next->mark_name='/'|find->next->mark_name

24、='&'|find->next- >mark_name='>'|find->next->mark_name='<'|find->next->mark_name='='|find->next->mark_name='!'|find->next->mark_name=''|find->next->mark_name='n') cout<<"第"<<fin

25、d->line<<"行,"<<find->mark_name<<"'存在自变量声明搭配错误!"<<endl;if(find->mark_name='('|find->mark_name=')'|find->mark_name=''| |find->mark_name='')word_fuca=find;ca+;iffind->name0>='0'&&find

26、->name0<='9'&&find->name1>='a'&&f ind->name1<='z')cout<<"第"<<find->line<<"行,"<<find->name<<"存在变 量声明错误!"<<endl;find=find->next;int j=0;for(i=0;i<cal;i+)s_first=head-

27、>link;end=1;while(s_first&&end)if(strcmp(s_first->name,w_namei->name)=0) end=0;else s_first=s_first->next;if(end=1&&i!=cal-1) cout<<"错误!第"<<w_namei->line<<"行,变量"<<w_namei->name<<"没有被声 明!"<<endl;q=ip=(

28、struct Stack *)malloc(sizeof(struct Stack);ip->name='$'for(i=0;i<ca;i+)if(word_fui->mark_name='(')|(word_fui->mark_name='') ip=MarkPush(ip,word_fui->mark_name,i);elseif(ip->name='('&&word_fui->mark_name=')')|(ip->name=''

29、&&word _fui->mark_name='') MarkPop(ip);else cout<<"错误! 第"<<word_fui->line<<”行," "<<word_fui->name<<" ”存在符号匹配错误! "<<endl;if(ip->name!='$') cout<<"错误!第"<<word_fui-1->line<<"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论