欢迎来到得力文库 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
得力文库 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年2022年简化的C语言编译程序 .pdf

    • 资源ID:39897323       资源大小:620.79KB        全文页数:34页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年2022年简化的C语言编译程序 .pdf

    南华大学编译原理课程设计课程设计(2010 2011 学年度第 二 学期)课程名称编译原理设计题目简化的 C语言编译程序专 业:计算机科学与技术姓 名:刘光亮学 号:20084440124 班 级:本科计算机0801 班教 师:陈星地 点:八栋实验室名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 34 页 -南华大学编译原理课程设计一、设计目的及优势目的:对编译的完整过程有一个感性认识,对各个环节的任务,处理方法有一定的熟悉。特点:我写的 C 语言编译程序,分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、表格管理、出错处理。每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成为一个一个的单词符号二元式。一般程序语言的单词符号包括关键字、运算符、常数、标识符和界符。语法分析器将这些单词符号作为输入,对它进行语法分析。语法分析分为两种方法:自上而下分析法和自下而上分析法。我采用的是自上而下的分析法。语法分析器把语法单元作为输入供语义分析器使用。语义分析器主要采用的是语法制导方法,即在语法分析的同时进行语法分析,并产生一定的语义动作,来生成中间代码(中间代码采用是四元式)。同时,在上面的几个过程中,涉及到表格管理和出错处理。在这个编译程序中,可以对 C 语言的所有结构:顺序结构,选择结构(if-else),循环结构(while)进行编译,有了这三种结构理论上可以现实任何程序。在数据类型上采用整型,常数,当然也可以加入其他C 语言类型。同时,有 C 语言必要的赋值语句,声明语句,转移语句(我采用的是goto 语句)。在其中比较复杂的控制语句中运用回填技术,超前搜索,状态转换,以及标记状态等方法。我建立起了一个C 语言编译器的架构,如果要全部实现其功能的话理论上只需把要各种语法语义加入其中即可。二、设计内容及步骤设计内容:自选一种常见高级语言为背景,对其进行简化例如只包括整型常数和其四则运算以及相应的赋值语句,转移语句,条件语句和最简单的输入输出语句等编制一个包括必要处理阶段(词法分析、语法分析、语义分析、代码生成)简化又完整的编译程序。词法单元的种别码单词符号种别码if 1 else 2 while 3 read 4 write 5 int 6 goto 7 8 9 名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 34 页 -南华大学编译原理课程设计程序的文法:=:=int:=|:=|:=if()|else:=while():=ID=:=goto :=+|-:=*|/:=ID|NUM|()单词符号种别码Identity 10 NUM 11 LABEL 30+13-14*15/16=17=18=24;26(27)28 20!=21 23#0 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 34 页 -南华大学编译原理课程设计编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。由编译程序的五个阶段就对应了编译系统的结构。其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成为一个一个的单词符号二元式。一般程序语言的单词符号包括关键字、运算符、常数、标识符和界符。语法分析器将这些单词符号作为输入,对它进行语法分析。语法分析分为两种方法:自上而下分析法和自下而上分析法。针对不同程序语言的语法规则可以采取不同的分析方法,当然两种方法也可以同时使用。语法分析器把语法单元作为输入供语义分析器使用。一般的语义分析器主要采用的是语法制导方法,即在语法分析的同时进行语法分析,并产生一定的语义动作,来生成中间代码。上面三个过程可以与硬件无关,而接下来的优化器和目标代码生成器是针对某一种处理器而言的。代码优化是将语义分析生成的中间代码进行优化,产生执行效率更高的代码。目标代码生成器最终生成可以在某种机器上运行的机器语言或者汇编语言。在整个编译过程中还包括对表格的操作和对错误的处理,这些也都是非常重要的环节。编译系统的结构框图表格管理出错处理单词符号语法单元中间代码中间代码目标代码语法分析器语义分析与中间代码生成器优化器目标代码生成器词法分析器名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 34 页 -南华大学编译原理课程设计(1)设计符号表确定符号表的组织方式,一般应包括名字栏和信息栏,其中名字栏作为关键字。要考虑能够存储有关名字的信息,并可以高效地完成如下操作:a.查找:根据给定的名字,在符号表中查找其信息。如果该名字在符号表中不存在,则将其加入到符号表中,否则返回指向该名字的指针;b.删除:从符号表中删除给定名字的表项。(2)设计词法分析器设计各单词的状态转换图,并为不同的单词设计种别码。将词法分析器设计成供语法分析器调用的子程序。功能包括:a.具备预处理功能。将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;b.能够拼出语言中的各个单词;c.将拼出的标识符填入符号表;d.返回(种别码,属性值)。(3)语法分析器要求用预测分析法、递归下降分析法、算符优先分析法、SLR 分析法(几种方法任选),实现对表达式、各种说明语句、控制语句进行语法分析。(4)语义分析器及目标代码生成器主要是生成四元式。三、详细的算法描述(流程图或伪代码)1、总的程序架构图 1 语义分析主程序流程图置初值读入输入的程序调用 scanner 调用 lrparser 输出状态值及四元式结束名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 34 页 -南华大学编译原理课程设计图 3 语句串分析程序流程图图 2 递归下降分析程序流程图图 5statement_list语句序列程序流程图图 4 declaration_stat声明语句程序流程图是否是“”调用 scanner 调用语句串分析函数是否是“”是是调用 scanner es=0?是分析成功否否否出错处理调用 declar_list 函数es=0?是调用 statement_list 函数出错处理返回 es 否调用 scanner Token 是否等于“int”?调用 declaration_stat 函数返回 es 是出错处理否Token 是否等于“int”?调用 statement 函数返回 es 是出错处理否调用 scanner 名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 34 页 -南华大学编译原理课程设计图 6 statement语句函数流程图图 7 expression语句程序流程图图 7 term 函数程序流程图图 8 factor函数程序流程图2、使用的数据结构和关键变量/标识符结构体struct Identity char name8;/名字int address;/值在常数表中的位置 iden50;int labelp=0;/全局标号用于 goto 语句记录标签时使用。char ch;/用户输入的字符判断 syn 值执行相应的语句函数返回 es 名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 34 页 -南华大学编译原理课程设计int datap=0;/常数表中的常数的位置值int idenp=0;/标识符中的在常数中的位置值int syn;/单词的种别码int curreny=0;/四元式的全局标号char prog200;/保存用户输入的程序段token8;/保存单个词法单元char*rwtab7=if,else,while,read,write,int,goto;/关键字struct NUM /常数表 int value;/常数值int point;/常数在表中的位置 num50;int labelp=0;/全局标号struct LABEL /标号结构体,用于保存goto 时的转移地址 char labelname8;int labeladdr;label50;/四元式struct siyuanshi int label;char result8;char ag18;char ag28;char op8;quad100;3、主要功能函数简述在 1 目中我已画出了总的程序架构。在这里说明语句中的if语句、while 语句、赋值语句、goto 语句。int if_stat();功能:对 if 语句进行分析,产生四元式。同时能对else 进行处理。采用了回填技术,超前搜索。返回分析状态值。int while_stat()功能:对 while 语句进行分析,产生四元式。采用了回填技术。返回分析状态值。int assign_stat()功能:对赋值语句进行分析,产生四元式返回分析状态值。void scaner()名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 34 页 -南华大学编译原理课程设计功能:属于词法分析阶段,识别出一个个单词符号传给token,将种别码传给 syn。int goto_stat()功能:对 goto 语句进行分析,产生四元式。采用了回填技术。返回分析状态值。int label_stat()功能:将标号放入标号结构体数组中,返回分析状态值。char*newtemp()功能:新建一个临时变量,并返回此变量int putIntolabel(char*name)功能:将标号插入符号表中,返回分析状态值。int putIntoIdentity(char*name)功能:将标识符及相关信息插入符号表中,返回分析状态值。int lookup(char*name,int*address)功能:在符号表中查找变量名,返回分析状态值。四、设计结果(测试案例)1.声明语句及赋值语句测试输入:int a;int b;a=8;b=4;#输出:2.if语句测试输入:int a;int b;a=9;b=4;if(ab)a=4;else b=3;#输出:名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 34 页 -南华大学编译原理课程设计3.while语句测试输入:int a;int b;a=4;b=3;while(ab)a=5;#输出:名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 34 页 -南华大学编译原理课程设计4.goto 语句测试输入:int a;int b;a=4;b=3;Label1:if(ab)a=4;b=5;goto Label1;a=a+b;#输出:5.综合测试输入:int a;int b;a=5;b=4;if(a=b)a=a+b;else a=a-b;名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 34 页 -南华大学编译原理课程设计 while(ab)a=a+b;a=a-1;Label1:a=a+2;b=b-1;goto Label1;#输出:当然还可设计嵌套的程序,在这里只是演示,不可能穷举出所有测试用例。四、设计总结与心得在做这个课程设计之前,由于对编译原理有一种恐惧感,因此我不敢掉以轻心。我在11周就开始准备了。首先,是将老师给三个实验指导,了解其中的原理,明白其方法,掌握其思想。然后,根据程序框架在12 的时候将三个实验全部用C 语言实现。后来我理清了思路后,打算在原来的基础编写更复杂的编译程序。在13 周的周六下午我开始编码,开始我是想将其生成汇编代码的,我将程序写到晚上11 点钟的样子,发现写不下去了。因为一是汇编代码大部分忘记了,二是不知道怎么组织起来,汇编代码是基于特定的机器的。我在设计的时候进入了低谷。第二天7 点多起来,我决定不生成汇编代码,改用生成四元式,原因是相对来说比较容易实现,书上有,另外一方面是那三个实验的最后语义分析生成的是四元式,我是有一定基础的。虽然前一天在生成汇编代码的问题失败了,但是那些名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 34 页 -南华大学编译原理课程设计工作没有白费,在周日的整个上午,我将在生成汇编代码的地方改成生成四元式。中午休息了一下,下午进行最让人头痛的工作来了调试。我首先修改了程序中的一些语法错误,这个很容易就解决了。最难的是逻辑错误,我碰的最主要的问题是,scaner()函数的调用次序,我是读出一个单词接着进行处理的,scaner()分布在整个编译程序中,这给我的调试带来了难度,这个 scaner()函数的次序就显得很重要了。我花了三分之二的调试时间去把这个问题解决了。最后,我砬到一个很具有戏剧性的问题,我输入了一段代码,进行分析,发现每一次执行到相同的地方就出现了错误,是执行到相同的地方,我强调一下。我百思不得其解,我进行了调试,调试几次都一无所获。接着,我决定加强调试的细度,在调试到 scaner()函数时,跟踪 ch 的值,发现当 prog80 以后,ch 的值和我预期的值不一样,这时我才恍然大悟,原来我将prog 的值长度设为 80 而我输入的程序超过80 个字符,于是我将 prog 的长度设为了 200。再次输入原来的程序段,一点错误也没有。经过一个下午,调试完成。当然我也不可能找到所有的Bug,但总算做完了。我花了一天半的时间,将这个C语言分析程序写完了,用了近1000 行代码。回顾这段时间,心态是呈波浪线式的,有低谷也有兴奋的时候,这段时间很痛苦。在这个程序中我觉得最有技术含量的地方是回填技术,它的思想比较简单,但是用程序实现起来是有一定难度的,它的逻辑性很强。最后,我总结出一个编程经验:只要想得到,就做得到。我认为自己写这个程序的时间是比较短的,原因在于我前期做了很多工作,我加强了理论的基础,和巩固 C语言的编程技巧,做到心中有思路才开始编码的。我最后的心得就是:要做一个有思想的人,有准备地做事!六、附:程序完整代码#include#include char ch;int syn,p,m,n,sum,kk,k=0;char*rwtab7=if,else,while,read,write,int,goto;int curreny=0;/四元式的全局标号char prog200,token8;char place12;int maxNum=50;struct NUM /常数 int value;/常数值int point;/常数在表中的位置 num50;FILE*out=NULL;int labelp=0;/全局标号struct LABEL /标号结构体,用于保存goto时的转移地址 名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 34 页 -南华大学编译原理课程设计char labelname8;int labeladdr;label50;/标识符结构体struct Identity char name8;/名字int address;/值在常数表中的位置 iden50;int datap=0;int idenp=0;/四元式struct siyuanshi int label;char result8;char ag18;char ag28;char op8;quad100;main()void scaner();int lrparser();int es,i;kk=0;p=0;printf(Please input string:n);do ch=getchar();progp+=ch;while(ch!=#);printf(=词法分析及代码生成程序结果=n);p=0;scaner();printf(%s%dn,token,syn);es=lrparser();switch(es)case 0:名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 34 页 -南华大学编译原理课程设计printf(语法、语义分析成功并生成四元式代码!n);break;case 10:printf(标号重复使用!n);break;case 11:printf(无效的标号!);break;case 1:printf(缺少!n);break;case 2:printf(缺少!n);break;case 3:printf(缺少标识符!n);break;case 4:printf(缺少分号!n);break;case 5:printf(缺少(n);break;case 6:printf(缺少)n);break;case 7:printf(缺少操作数!n);break;case 21:printf(符号表溢出!n);break;case 22:printf(变量重复定义!n);break;case 23:printf(变量未声明!n);break;case 24:printf(赋值号错误!n);break;case 25:printf(变量未赋值就使用!n);break;名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 34 页 -南华大学编译原理课程设计for(p=0;pcurreny;p+)/输出四元组 printf(%dt%st%st%st%sn,quadp.label,quadp.result,quadp.ag1,quadp.op,quadp.ag2);int lrparser()void scaner();int yucu();int es=0;kk=0;if(syn=8)es=yucu();if(syn=9)/结束 scaner();if(syn=0&(kk=0)printf(success!n);else if(kk!=1)printf(lost error!n);es=2;else printf(error!n);es=1;return es;名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 34 页 -南华大学编译原理课程设计/程序:=program:=int yucu()int i;int statement();void scaner();int declar_list();int declaration_stat();int es=0;es=declar_list();/声明语句if(es0)return es;for(i=0;i0)return es;return es;/:=int/int declaration_stat()int putIntoIdentity(char token8);int es=0;名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 34 页 -南华大学编译原理课程设计void scaner();scaner();printf(%s%dn,token,syn);if(syn!=10)return es=3;es=putIntoIdentity(token);if(es0)return es;scaner();printf(%s%dn,token,syn);if(strcmp(token,;)return(es=4);scaner();printf(%s%dn,token,syn);return es;/:=|/:=|int statement_list()int statement();int es=0;void scaner();while(strcmp(token,)es=statement();if(es0)return es;scaner();printf(%s%dn,token,syn);return es;/:=|/:=|int statement()void scaner();char tt8,eplace8;void emit(char*result,char*ag1,char*op,char*ag2);int assign_stat();int label_stat();名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 34 页 -南华大学编译原理课程设计int if_stat();int while_stat();int es=0;switch(syn)/是标识符 case 10:/赋值语句es=assign_stat();break;case 1:es=if_stat();break;case 3:es=while_stat();break;case 30:es=label_stat();/标号break;case 7:es=goto_stat();break;return es;int label_stat()int es=0;es=putIntolabel(token);return es;int goto_stat()void scaner();int es=0,i;char*tt=malloc(12);scaner();printf(%s%dn,token,syn);for(i=labelp-1;i=0;i-)名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 34 页 -南华大学编译原理课程设计if(strcmp(labeli.labelname,token)=0)break;if(i0)return es=11;scaner();printf(%s%dn,token,syn);if(strcmp(token,;)return es=4;itoa(labeli.labeladdr,tt,10);emit(tt,j,);return es;/:=if()|else/:=if()else int if_stat()void scaner();int expression(char place8);void emit(char*result,char*ag1,char*op,char*ag2);char place12;char*tt,*arg1,*op,*arg2;int es=0,label1,label2,label3,label4,label5,label6,label7,i,tokenp;char token18;int flag=0;tt=(char*)malloc(12);arg1=(char*)malloc(12);op=(char*)malloc(12);arg2=(char*)malloc(12);for(i=0;i0)return es;strcpy(arg1,place);/第一个操作数if(strcmp(token,)=0|strcmp(token,=)=0|strcmp(token,)=0|strcmp(token,0)return es;if(strcmp(token,)return es=6;scaner();printf(%s%dn,token,syn);if(strcmp(token,)return es=1;strcpy(op+1,token1);op0=j;strcpy(arg2,place);itoa(curreny+2,tt,10);emit(tt,arg1,op,arg2);emit(,j,);/执行假操作时,转移。label2=curreny-1;scaner();printf(%s%dn,token,syn);名师资料总结-精品资料欢迎下载-名师精心整理-第 21 页,共 34 页 -南华大学编译原理课程设计es=statement_list();/执行语句序列。if(es0)return es;emit(,j,);label6=curreny-1;label3=curreny;/if条件为假时的回填itoa(label3,tt,10);strcpy(quadlabel2.result,tt);/回填tokenp=p;/记住回退的位置scaner();printf(%s%db,token,syn);if(strcmp(token,else)=0)flag=1;scaner();printf(%s%dn,token,syn);if(strcmp(token,)return es=1;es=statement_list();/执行语句序列。if(es0)return es;if(flag=0)p=tokenp;/恢复到原来的位置label5=curreny;itoa(label5,tt,10);strcpy(quadlabel6.result,tt);/回填 if条件为真时的转移点return es;else es=7;return es;名师资料总结-精品资料欢迎下载-名师精心整理-第 22 页,共 34 页 -南华大学编译原理课程设计/:=while()/:=while()int while_stat()void scaner();int expression(char place8);void emit(char*result,char*ag1,char*op,char*ag2);int es=0,label1,label2,label3,label4,label5,label6,label7,i;char place12;char*tt,*arg1,*op,*arg2;char token18;tt=(char*)malloc(12);arg1=(char*)malloc(12);op=(char*)malloc(12);arg2=(char*)malloc(12);scaner();printf(%s%dn,token,syn);if(strcmp(token,()return es=5;scaner();printf(%s%dn,token,syn);es=expression(place);/第一个表达式if(es0)return es;strcpy(arg1,place);/第一个操作数if(strcmp(token,)=0|strcmp(token,=)=0|strcmp(token,)=0|strcmp(token,0)return es;if(strcmp(token,)return es=6;scaner();printf(%s%dn,token,syn);if(strcmp(token,)return es=1;strcpy(op+1,token1);op0=j;strcpy(arg2,place);itoa(curreny+2,tt,10);emit(tt,arg1,op,arg2);label1=curreny-1;/保存下次循环时的地址emit(,j,);/执行假操作时,转移。label2=curreny-1;scaner();printf(%s%dn,token,syn);es=statement_list();/执行语句序列。if(es0)return es;itoa(label1,tt,10);emit(tt,j,);label6=curreny;/while条件为假时的回填itoa(label6,tt,10);strcpy(quadlabel2.result,tt);/回填 else es=7;名师资料总结-精品资料欢迎下载-名师精心整理-第 24 页,共 34 页 -南华大学编译原理课程设计return es;/:=ID=/:=ID=int assign_stat()void scaner();int lookup(char token8,int*address);int expression(char palce8);char tt8,eplace8;void emit(char*result,char*ag1,char*op,char*ag2);int es=0,i;int address;es=lookup(token,&address);if(es0)return es;strcpy(tt,token);scaner();printf(%s%dn,token,syn);if(syn=17)scaner();printf(%s%dn,token,syn);es=expression(eplace);if(es0)return es;emit(tt,eplace,);else es=24;return es;int expression(char eplace8)int term();void scaner();char*newtemp();名师资料总结-精品资料欢迎下载-名师精心整理-第 25 页,共 34 页 -南华大学编译原理课程设计char*tp,*ep2,*place,*tt;int es=0,i;tp=(char*)malloc(12);ep2=(char*)malloc(12);place=(char*)malloc(12);tt=(char*)malloc(12);es=term(place);if(es0)return es;strcpy(eplace,place);while(syn=13|syn=14)strcpy(tt,token);scaner();printf(%s%dn,token,syn);es=term(place);if(es0)return es;strcpy(ep2,place);strcpy(tp,newtemp();emit(tp,eplace,tt,ep2);strcpy(eplace,tp);return es;int term(char eplace12)int factor();char*newtemp();void emit(char*result,char*ag1,char*op,char*ag2);int es=0,i;char*tp,*ep2,*place,*tt;tp=(char*)malloc(12);place=(char*)malloc(12);ep2=(char*)malloc(12);tt=(char*)malloc(12);es=factor(place);名师资料总结-精品资料欢迎下载-名师精心整理-第 26 页,共 34 页 -南华大学编译原理课程设计if(es0)return es;strcpy(eplace,place);while(syn=15|syn=16)strcpy(tt,token);scaner();printf(%s%dn,token,syn);es=factor(place);if(es0)return es;strcpy(ep2,place);strcpy(tp,newtemp();emit(tp,eplace,tt,ep2);strcpy(eplace,tp);return es;void emit(char*result,char*ag1,char*op,char*ag2)int i=curreny;strcpy(quadi.result,result);strcpy(quadi.ag1,ag1);strcpy(quadi.op,op);strcpy(quadi.ag2,ag2);quadi.label=curreny;curreny+;char*newtemp()char*p;char m8;p=(char*)malloc(8);k+;itoa(k,m,10);strcpy(p+1,m);p0=t;return p;名师资料总结-精品资料欢迎下载-名师精心整理-第 27 页,共 34 页 -南华大学编译原理课程设计int factor(char place12)int expression(char place8);void scaner();int lookup(char token8,int*address);int es=0,address=-1;strcpy(place,);if(syn=10)/id es=lookup(token,&address);if(address=-1)es=25;if(es0)return es;strcpy(place,token);scaner();printf(%s%dn,token,syn);else if(syn=11)itoa(sum,place,10);scaner();printf(%s%dn,token,syn);else if(syn=27)scaner();printf(%s%dn,token,syn);es=expression(place);if(syn=28)scaner();printf(%s%dn,token,syn);else es=6;else es=5;名师资料总结-精品资料欢迎下载-名师精心整理-第 28 页,共 34 页 -南华大学编译原理课程设计 return es;void print()if(syn=11)printf(%d,%d)n,syn,sum);else printf(%d,%s)n,syn,token);void scaner()int n,m,label;for(n=0;n8;n+)tokenn=0;m=0;/读下一个字符ch=progp+;while(ch=|ch=13|ch=10|ch=0)/读下一个字符 ch=progp+;if(isalpha(ch)/标识符或关键字 while(isalpha(ch)|isdigit(ch)tokenm+=ch;ch=progp+;tokenm+=0;p-;syn=10;for(n=0;n7;n+)if(strcmp(token,rwtabn)=0)syn=n+1;break;名师资料总结-精品资料欢迎下载-名师精心整理-第 29 页,共 34 页 -南华大学编译原理课程设计 if(syn=10)label=p;while(ch=|ch=13|ch=10|ch=0)/读下一个字符 if(ch=:)syn=30;/标号类型/*if(syn=10)/说明是标识符,应该放符号表中。putIntoIdentity(token);*/else if(isdigit(ch)/数字 sum=0;while(isdigit(ch)sum=sum*10+ch-0;ch=progp+;p-;syn=11;else switch(ch)case:syn=8;tokenm=ch;break;case:syn=9;tokenm=ch;break;case:m=0;tokenm+=ch;ch=progp+;if(ch=)syn=24;tokenm+=ch;else syn=23;p-;break;case!:/不等于tokenm+=ch;ch=progp+;if(ch=)syn=21;tokenm=ch;else p-;break;case+:syn=13;token0=ch;break;case-:syn=14;token0=ch;break;case*:syn=15;名师资料总结-精品资料欢迎下载-名师精心整理-第 31 页,共 34 页 -南华大学编译原理课程设计token0=ch;break;case/:syn=16;token0=ch;break;case=:/赋值号tokenm+=ch;ch=progp+;if(ch=)syn=18;tokenm=ch;else syn=17;p-;break;case;:syn=26;token0=ch;break;case(:syn=27;token0=ch;break;case):syn=28;token0=ch;break;case#:syn=0;token0=ch;break;default:syn=-1;int putIntolabel(char*name)int i,es=0;if(labelp=50)return-1;名师资料总结-精品资料欢迎下载-名师精心整理-第 32 页,共 34 页 -南华大学编译原理课程设计for(i=labelp;i=0;i-)if(strcmp(labeli.labelname,name)=0)es=10;break;if(es=10)return es;strcpy(la

    注意事项

    本文(2022年2022年简化的C语言编译程序 .pdf)为本站会员(C****o)主动上传,得力文库 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知得力文库 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于得利文库 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

    © 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

    黑龙江省互联网违法和不良信息举报
    举报电话:0468-3380021 邮箱:hgswwxb@163.com  

    收起
    展开