编译原理实验报告(手打)_第1页
编译原理实验报告(手打)_第2页
编译原理实验报告(手打)_第3页
编译原理实验报告(手打)_第4页
编译原理实验报告(手打)_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、编译原理实验报告班级:计C104姓名:李云霄学号:实验一 词法分析程序实现一、实验目的与要求通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。二、实验内容选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。输入:由无符号数和+,*,/, ( , ) 构成的算术表达式,如1.5E+2100。输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。三、实现方法与环境1、首先设计识别各类单词的状态转换图。描述无符号常数的确定、最小化状态转换图如图1所示。其中编号

2、0,1,2,6代表非终结符号、及, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。图1 文法G的状态转换图其中编号0,1,2,6代表非终结符号、及, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。在一个程序设计语言中,一般都含有若干类单词符号,为此可首先为每类单词建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,即得到了一个有限自动机,再进行必要的确定化和状态数最小化处理,最后据此构造词法分析程序。四则运算算术符号的识别很简单,直接在状态图的0状态分别引出相应标记的矢线至一个新的终态即可。根据自己的习惯,也可以将其转换为状态矩阵形式。2、词法分析程

3、序编写根据描述语言中各类单词的文法状态转换图或状态矩阵,利用某种语言(C语言或JAVA语言)直接编写词法分析程序。3、词法分析程序测试用于测试扫描器的实例源文件中应有词法正确的,也应有错误的字符串,对于输入的测试用例的源程序文件,以对照的形式将扫描器的分析结果信息在输出文件中表示出来。4、 实验源程序#includestdafx.h#include#includechar test100,comp100;char ch;int num,p;void scan();void main()p=0;printf(Please input string and Use # as an finish o

4、perator :n);doscanf_s(%c,&ch);test+p=ch;while(ch!=#);p=0; ch=test+p; while(ch=n | ch= )ch=test+p;int m=1;while(m)switch(ch) case 0:scan();break;case 1:scan();break;case 2:scan();break;case 3:scan();break;case 4:scan();break;case 5:scan();break;case 6:scan();break;case 7:scan();break;case 8:scan();br

5、eak;case 9:scan();break;case +:num=2;printf(n(类别码:%d,值:%c),num,ch);compm+=ch;ch=test+p;break;case -:num=3;printf(n(类别码:%d,值:%c),num,ch);compm+=ch;ch=test+p;break;case *:num=4;printf(n(类别码:%d,值:%c),num,ch);compm+=ch;ch=test+p;break;case /:num=5;printf(n(类别码:%d,值:%c),num,ch);compm+=ch;ch=test+p;break;

6、case (:num=6;printf(n(类别码:%d,值:%c),num,ch);compm+=ch;ch=test+p;break;case ):num=7;printf(n(类别码:%d,值:%c),num,ch);compm+=ch;ch=test+p;break;case #:m=0;break;default :num=0;printf(n(非法符号:%d,值:%c),num,ch);compm+=ch;ch=test+p;break;void scan() int m=0;while(ch=0&ch=0;n-)compn=0;5、 实验过程六、实验结果7、 实验心得实验一很艰难

7、:我一眼就能看出来的事,破电脑愣是读不出来总结:程序来自网络,截图绝对原创。实验二 语法分析程序实现一、实验目的与要求通过设计、编制、调试典型的SLR(1)语法分析程序,实现对实验一所得词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。二、实验内容选择对各种常见高级程序设计语言都较为通用的语法结构无符号数的算术四则运算作为分析对象,给出其文法描述(注意应与所采用的语法分析方法比较贴近),设计并实现一个完整的语法分析程序。输入:由实验一输出的单词类别串,如1,3,1。输出:对于所输入的源程序,如果输入符号串是给定文法定义的合法句子,则输出“RIGHT”,并且给出每

8、一步归约的过程;如果不是句子,即输入串有错误,则输出“ERROR”,并且显示已经归约出的各个文法符号,以及必要的出错说明信息。三、实现方法与环境1、首先根据算术四则运算的语法定义,构造SLR(1)分析表。无符号数的算术四则运算的语法可表示为:E-E+T| E-T|TT-T*F| T/F|FF-(E)|i2、语法分析程序编写设置输入缓冲区、状态栈、符号栈,并根据SLR(1)分析表利用某种语言(C语言或JAVA语言)直接编写移进、归约、接受子程序,编写语法分析程序。3、语法分析程序测试用于测试的实例源文件中应有语法正确的,也应有语法错误的符号串,以对照的形式将分析结果信息在输出文件中表示出来。4、

9、 实验源程序#include StdAfx.h#includeusing namespace std;#include#include#define MAX 150 /词洙法分?析?表括的?最?大洙容量?#define MAXBUF 255 /缓o冲?区?的?最?大洙缓o冲?量?void term();void lrparser();void statement();void yucu();void expression();void factor();char progMAXBUF,tokenMAX; char ch;int syn,p,m,n,sum,kk; char * rwtab6=b

10、egin,if,then,while,do,end;/*词洙法扫描程序:阰*/void scaner() for(m=0;mMAX;m+) tokenm=NULL; m=0;sum=0; ch=progp+; while(ch= )ch=progp+; if(ch=a)|(ch=A) while(ch=a)|(ch=A)|(ch=0) tokenm+=ch; ch=progp+; /读取?下?一?个?字?符? tokenm+=0; ch=prog-p; syn=10; for(n=0;n6;n+) if(strcmp(token,rwtabn)=0) syn=n+1; /给?出?syn值 br

11、eak; else if(ch=0) sum=0; while(ch=0) sum=sum*10+ch-0; ch=progp+; ch=prog-p; syn=11; else switch(ch) case ) syn=21; tokenm+=ch; else if(ch=) syn=22; tokenm+=ch; else syn=20; ch=prog-p; break; case :tokenm+=ch; ch=progp+; if(ch=) syn=24; tokenm+=ch; else syn=23; ch=prog-p; break; case :tokenm+=ch; ch

12、=progp+; if(ch=) syn=18; tokenm+=ch; else syn=17; ch=prog-p; break; case +:syn=13;token0=ch;break; case -:syn=14;token0=ch;break; case *:syn=15;token0=ch;break; case /:syn=16;token0=ch;break; case :=:syn=18;token0=ch;break; case :syn=21;token0=ch;break; case =:syn=24;token0=ch;break; case =:syn=25;t

13、oken0=ch;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; break; /void statement()if (syn=10) scaner(); /读下?一?个?单蹋词洙符?号? if (syn=18) scaner(); /读下?一?个?单蹋词洙符?号?expression(); /调獭用?expression函数簓 else printf

14、(error!); kk=1; else printf(error!); kk=1;return;/void expression()term();while(syn=13 | syn=14) scaner(); term();return;/void term()factor();while(syn=15 | syn=16) scaner(); factor();return;/void lrparser()if (syn=1) /begin scaner();yucu(); if (syn=6) /end scaner(); if (syn=0 & kk=0) printf(success

15、 n); else if(kk!=1) printf(error,lose end ! n); kk=1; else printf(error,lose begin ! n); kk=1; return;/void yucu()statement();while(syn=26) /; scaner(); statement();return;/void factor()if(syn=10 | syn=11) scaner(); /为a标括识?符?或整?常数簓时骸,?读下?一?个?单蹋词洙符?号?else if(syn=27) scaner(); expression(); if(syn=28)

16、 scaner(); else printf( ) 错洙误n); kk=1;else printf(表括达?式?错洙误n); kk=1;return;/void main()p=0; printf(*语?法分?析?程序*n);printf(请?输?入?源程序:n);do scanf_s(%c,&ch); progp+=ch;while(ch!=#);p=0;scaner(); lrparser();printf(语?法分?析?结束?!?n);五、实验过程六、实验结果(1)输入字符串begin x:=2*y end #其结果如下图所示:(2)输入的字符串少了begin,则会有提示信息:(3)输入

17、的字符串的括号不全,也会有提示信息:7、 实验心得实验二,改错的截图只截了几个,改错越改越多,一度改到128个错误,还好,改完了总结:能做出结果来,全靠同学帮助,再加上运气实验三 语义分析程序实现一、实验目的与要求通过设计、编制、调试一个简单的语义处理分析程序,实现对实验一和实验二所得单词和语句的语义信息简单处里,进一步掌握语义处理的内容和简单方法。二、实验内容对实验一进行扩展,对识别的无符号数进行计值,并将输出形式改为(类别码,值)的二元式形式。对实验二进行扩展,在语法分析的基础上,增加语义操作来实现语法制导翻译。对于给定文法中的每一产生式,编写相应的语义子程序。在语法分析过程中,每当用一产

18、生式进行推导或归约时,语法分析程序除执行相应的语法分析动作之外,还要调用相应的语义子程序,计算并输出算术表达式的值。将实验一与实验二的程序合并,以能对完整的输入源文件进行词法分析生成中间文件,然后进行语法制导翻译,输出最终翻译结果。输入:由无符号数和+,*,/, ( , ) 构成的算术表达式。输出:如果输入单词串是合法的无符号数的算术四则运算,输出运算结果,并且给出每一步的分析过程;如果不是无符号数的算术四则运算,输出“非法四则运算表达式”。三、基本实验题目对实验一中每个无符号数识别状态插入计值处理,最终获得无符号数的取值。对实验二进行扩展,在归约(分析表中的归约动作已经反应了运算优先级)处理

19、子程序中加入计值处理,接受子程序中加入输出算数表达式值的处理。4、 实验源程序#include StdAfx.h#include#include#include char prog80,token8;char ch;int syn,p,m,n,sum;int kk=0,ii,N,nn=0;int k=0,t,i=0;char tt;char * keywords6 = begin,if,then,while,do,end; /关?键字?表括。int scaner();int parser();int statement();int sentence();char *term();char *f

20、actor();char *expression();void emit(char *result,char *ag1,char *op,char *ag2);struct /四?元a式?的?结构1。char resulted8;char ag1ed8;char oped8;char ag2ed8;quad20;void main() p=0;printf(请?输?入?字?符?串?,?以?#号?结束?: n);doscanf(%c,&ch);progp+=ch;while(ch != #); /没?有瓺遇?到?结束?符?,?则首骸先调獭用?scaner()进?行D词洙法分?析?,?之?后进?行

21、D语?义?分?析?。p=0;scaner();parser();char * newtemp(void) /返回?一?个?新?的?临时骸变?量?名?,临时骸变?量?名?产生的?顺3序为at1,t2,-。char * P;char M8;P = (char *)malloc(8);k+;itoa(k,M,10);strcpy(P+1,M);P0 = t;return(P);int parser() /在语?法分?析?的?基础?上?插?入?相应畖的?语?义?动作痢:阰将?输?入?串?翻?译?成四?元a式?序列。只?对?表括达?式?、赋3值语?句?进?行D翻?译?。int schain = 0;kk

22、 = 0;if(syn = 1)scaner();schain = sentence(); /调獭用?语?句?串?分?析?函数簓进?行D分?析?。if(syn = 6) /“end”。scaner();if(syn = 0 & (kk = 0)printf(success);else if(kk!=1)printf(缺纄nd错洙误); / 输?出?“end”错洙误。kk=1;elseprintf(begin错洙误); /输?出?“begin”错洙误。kk=1; return(schain);int sentence() /语?句?串?分?析?函数簓。int schain = 0;schain

23、= statement(); /调獭用?语?句?分?析?函数簓进?行D分?析?。while (syn = 26) /“;”。scaner();schain = statement(); /调獭用?语?句?分?析?函数簓进?行D分?析?。return(schain);int statement() /语?句?分?析?函数簓。char tt8,eplace8;int schain = 0;switch(syn)case 10:strcpy(tt,token);scaner();if(syn = 18) /赋3值语?句?。scaner();strcpy(eplace,expression();emi

24、t(tt,eplace,);schain = 0;elseprintf(缺少赋3值号?); /缺少“:=”错洙误。kk=1;return(schain);break;char * expression(void)char * tp,* ep2,* eplace,* tt;tp = (char *)malloc(12); /分?配?空?间?。ep2 = (char *)malloc(12);eplace = (char *)malloc(12);tt = (char *)malloc(12);strcpy(eplace,term(); /调獭用?term分?析?产生表括达?式?计?算?的?第台一

25、?项?eplace。while(syn = 13 | syn = 14) /加减?。strcpy(tt,token);scaner();strcpy(ep2,term(); /调獭用?term()分?析?产生表括达?式?计?算?的?第台二t项?ep2。strcpy(tp,newtemp(); /调獭用?newtemp()产生临时骸变?量?tp存?储洹计?算?结果?。emit(tp,eplace,tt,ep2); /生成四?元a式?送入?四?元a式?表括。strcpy(eplace,tp);return(eplace);char * term(void)char * tp,* ep2,* epl

26、ace,* tt;tp = (char *)malloc(12);ep2 = (char *)malloc(12);eplace = (char *)malloc(12);tt = (char *)malloc(12);strcpy(eplace,factor();while(syn = 15 | syn = 16) /乘?除y。strcpy(tt,token);scaner();strcpy(ep2,factor();strcpy(tp,newtemp();emit(tp,eplace,tt,ep2);strcpy(eplace,tp);return(eplace);char * facto

27、r(void)char * fplace;fplace = (char *)malloc(12);strcpy(fplace, );if(syn = 10) /字?母?。strcpy(fplace,token);scaner();else if (syn = 11) /数簓字?。itoa(sum,fplace,10);scaner();else if(syn = 27) /“(”。scaner();strcpy(fplace,expression();if(syn = 28) /有瓺“)”。scaner();elseprintf()错洙误); /只?有瓺“(”,?缺少“)”。kk=1;else

28、printf(错洙误);kk=1;return(fplace);void emit(char * result,char * ag1,char * op,char * ag2) /生成一?个?三地?址码?并返回?到?四?元a式?代洙码?中D。strcpy(quadnn.resulted,result);strcpy(quadnn.ag1ed,ag1);strcpy(quadnn.oped,op);strcpy(quadnn.ag2ed,ag2);printf(%d) %s=%s%s%sn, nn+1,quadnn.resulted,quadnn.ag1ed,quadnn.oped,quadnn

29、.ag2ed);nn+;int scaner() /此?函数簓为a词洙法分?析?。 int n; for(n=0;n=a) & (ch=a) & (ch=0) & (ch=9) /判D断?下?一?个?是?否?是?字?母?或数簓字?。 tokenm+=ch; ch=progp+; tokenm+=0; p-; syn=10; for(n=0;n=0 & ch=0)&(ch=9) /判D断?下?一?个?是?否?是?数簓字?。sum=sum*10+(int)ch-0; ch=progp+; p-; syn=11; else switch(ch) case: /是?否?是?“) /是?否?是?“”。 syn=21; tokenm+=ch; else if(ch=) /判D断?下?一?个?是?否?是?“=”,?即为a判D断?符?号?“: /是?否?

温馨提示

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

评论

0/150

提交评论