河北工业大学编译原理实验报告(精品资料).doc_第1页
河北工业大学编译原理实验报告(精品资料).doc_第2页
河北工业大学编译原理实验报告(精品资料).doc_第3页
河北工业大学编译原理实验报告(精品资料).doc_第4页
河北工业大学编译原理实验报告(精品资料).doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、【最新整理,下载后即可编辑】编译原理实验报告组员:韦廷廷(112455)、熊敏(112456)、马昊(113042) 任课老师:吴清【最新整理,下载后即可编辑】一、 任务概述本次实验我们要完成的任务主要是实现一个简单语言 集的词法、语法和语义分析程序,验证实际编译系统的实现方法。 我们组的分工并不是词法分析、语法分析、语义分析每人负责一 个,而是先确定每种分析按照哪一种方法实现,然后每个人写出 自己的想法,按照自己的想法实验,最后总结到一起,有问题大 家一起讨论,共同商量解决的办法。二、系统设计实验采用的实现方法和依据:语言中的各类单词符号及其分类码表单词符号类别编码类别码的 助记符单词值be

2、gin1BEGINend2ENDif3IFthen4THENelse5ELSE标识符6ID字母打头的字母数字串无符号 常数7UCON机内二进制表 示<8LT<=9LE1()EQ<>11NE>12GT>=13GE14IS+15PL16MI*17MU/18DI实验采用的实现方法和依据: 文法:E->T | E+T | E-T T F | T*F | T/F F -> i | (E)SLR分析表状 态ACTIONGOTO()+*/ 1#ETF0S4S51231S6S7AcC2R3R3R3S8S9R33R6R6R6R6R6R64S4S510235R8R8

3、R8R8R8R86S4S51137S4S51238S4S5139S4S51410S15S6S711R1R1R1S8S9R112R2R2R2S8S9R213R4R4R4R4R4R414R5R5R5R5R5R515R7R7R7R7R7R7三、系统实现(包括必要的框图,各上和.C文件说明,所有函数 功能的说明,数据结构、各种表格、变量等的说明,以及函数调 用关系图等)(1)各.h和.c文件说明Cifa.cpp的功能:字符串扫描识别。Table.cpp的功能:存放SLR分析法需要用到的ACTION和GOTO 表。Yufa.cpp的功能:引用Cifa.cpp、Tablc.cpp两个文件进行语法、 语义的

4、分析。(2)函数功能说明词法分析部分函数说明:int lookup (char * token) / /比较是否是关键字int GctChar(char ch) 每调用一次,就把扫描指示器当前所指 示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字 符位置。int HandlcErrcr (void)/报错函数int EXCUTE (int state, int symbol)/状态转换int lookup (char * token) 比较是否是关键字void out(int a,char *tckcn)输出函数void scanncr_example (FILE *fp)/词法分析

5、语法、语义部分函数功能说明:void REP()RT_ERRQRO/报错函数void Accept。”语法成功接受int INDEX(chara) 获取当前字符串对应的索引void yuyi(int n)/语义子程序void INPUT(int a)语法分析程序数据结构、各种表格、变量等的说明Cifa.cpp 中:char *KcyWordTablcNlAX_KEY_NUMBER = nbegin','cndn, nif "then", nelse", KEY_W()RD_END;/数组指针关键字intw,n,p,c,d;w尾数累加器,n小数位数计

6、数器,p指数累加器, c指数符号标记,int Class;标识单词类型Tablc.cpp# dcfine MAXROW 16 行数# define MAXCOL 11 /歹"数int Table MAXROW7 MAXCOLYufa.cpp 中# define NUMBER 9/表达式的个数int StatcMAXState,/状态栈int CURRENTSTATE=O;/标识当前状态int 16714>;m£用=1,3,3,1,3,3,1,3,1;表达式右边的长度intYcs=O;判断是否结束int tag=();/判断是否需要调用词法程序四、系统工作过程及运行说明

7、(使用操作指南)程序使用:在工程里创建一个b.txt文件以识别算数运算表 达式五、源程序清单(要求有详细注释)和实例程序运行结果源程序清单: Cifa.cpp #includc<stdio.h> #includc<ctypc.h> #include<stdlib.h> #includc<string.h> #includc<math.h># dcfine DIGIT 1# dcfine POINT 2# dcfine OTHER 3 #dcfine POWER 4# define ID 6# define UCON 7# define

8、 LT 8# define LE 9# define EQ 1()# define NE 11# define GT 12# define GE 13# define IS 14# define PL15/+# define MI 16 /-# define MU 17# define DI 18# dcfinc zuokuohao 19# dcfinc voukuohao 20 J#dcfine jin 21#dcfinc ClassOther 200#definc EndState -1#define MAX_KEY_NUMBER20 /*关键字的数量*/#dcfine KEY_WORD_

9、END "END" /*关键字结束标记*/ char*KeyWordTablc MAX_KEY_N UMBER = "begin",ncndn, ”iF, “then","elsen,KEY_WORD_END; 数组指针 char TOKEN 20; char ch;int w,n,p,e,d;/w 尾数累加器,n 小数位数计数器,p指数累加器,。指数符号标记,int Class;标识单词类型int ICON;double FCON;static int CurrcntStatc=();int result;int start=();

10、/指示程序的开始int cnd=0;指示程序的结束int GctChar (void);int EXCUTE (int,int);int HandlcOthcrWord (void)return ClassOthcr;)int HandlcError (void)printf (nError!nn); return (); int lookup (char * token) / 比 较是否是关键字int n=();while(s tremp (KeyWordT able n, KEY_WORD_END) /*strcmp 比较两串是否相同,若相同返 回0*/ if(! s tr c m p (

11、KeyWordT ablcn, token) /*比较token所指向的 关键字和保留字表中哪个关键 字相符*/return n+1; /* 根据单 词分类码表I,设置正确的关键 字类别码,并返回此类别码的 值*/break;) n+;)return 0; /*单词不是关键字, 而是标识符*/)int GctChar (char a)char c=a;if(isdigit(c)d=c-,0,; /字符c与字符 0的ascii码差值,返回类型为一 个整数return DIGIT;if (c=?) return POINT;if (c='E'| |c二二'c') r

12、eturn POWER;if (c='+) return PL;if (c='-*) return MU;return OTHER;)void rcport_error()printf("错误n”);)void outl (int a,char * token)/输出函数switch (a)casel:printf(" (BEGIN, )n");brcak;case2:printf("(END, )n");break;case3:printf(H(IF, )nH);break;case4:printf("(THEN,

13、)n");brcak;case5:printf("(ELSE, )nM);break;case6:printf(n (ID,%s)nn, token) ;brcak;case8:printf(H (LT,%s)nn,token) ;brca k;case9:printf("(LE,%s)nu,token) ;brca k;casel():printf(n (EQ,%s)nu, token) ;brc ak;case11 :printf(u(NE,%s)nn,token);break;case12:printf(,GT/>()s)nM, token) ;bre

14、 ak;case13:printf("(GE,%s)n",tckcn);brc ak;case14:printf(" (IS,%s)n", token) ;brcak;case15:printf(H (PL,%s)nu, token) ;bre ak;case16:printf(" (MI,%s)nn, token) ;brc ak;case17:printf(',(MU,%s)n,tokcn);br cak;case18:printf(H (DI,%s)n",token) ;brc ak;case 19:printf(n(,

15、 )n");brcak;case 2O:printf(H0, )n");brcak; default: rcport_crror( );brcak; )int out(int a)switch (a)(case 7:return 6;brcak;/ 常 量case 15:rcturn 2;break;/+case 16: re turn 3;break;case 17:return 4;break;case 18:rcturn 5;brcak;case 19:rcturn ();brcak;case 20:rcturn 1 ;break;case 21:rcturn 7;b

16、reak;case 22:rcturn l()();brcak;/判断是否是空格或换行case 26: return 26;brcak;/标 识符dcfault:rcturn()01 ;report_error 0 ;break;)void scanner_cxamplc (FILE*a)/文件扫描器int i, c;ch=fgctc(fp);if(ch=* *| |ch='n')scanncr_cxample (fp);elseif (isalpha (ch) /判断 是否是英文字母(T()KEN0=ch;ch二 fgctc(fp);i二l; while (isalnum (

17、ch)TOKENi=ch; i+; ch=fgctc (fp);)T()KENi=,0,;fscek(fp,-l,l);/*retract*/c=lookup (TOKEN);if (c=()(/printf("算术表达式 不需要n”);result=out(26); /标识 符) else if(c=l) (start=l;oucl (cj ”);if (c=2)cnd=l;OUtl(C,"elseif (isdigit(ch) | | ch=,.1)/判断是否是数字或i二();/T()KENi=ch;if(isdigit(ch)d=ch-U; 字符c与字 符()的asc

18、ii码差值,返回类型为 一个整数EXCUTE(CurrcntState,DIGIT);)if(ch=?)EXCUTE(CurrcntStatc,POINT);if(ch=二'E'| |ch='d)EXCUTE(CurrcntStatc,POWER);if(ch=,+,)EXCUTE(CurrcntState ,PL);if(ch=')EXCUTE(CurrcntStatc,MU);whilc(CurrentState!=EndState)(TOKEN。尸 ch;i+;ch=fgetc(fp);int c=GetChar(ch);EXCUTE(CurrentSta

19、te,c);)TOKEN 口尸0'fseck(fp,-l,l);/printf(H(UC()N,%g)nn,FC()N); result=out(UC()N);)else switch(ch) / 关系运算符case *<*: ch=fgctc(fp);if(ch=T=)outl(LE/ ”);else if(ch='>') outl (NE);elsefscckprintf(n算术表达式不 需要n");/ out (UCON);break;case *=*: printf("算术表达式 不需要心;/out(EQ, " n);b

20、reak;case *>*: ch=fgctc(fp);if(ch=二'二)(printf("算术表达式不 需要n");。皿GE,” ”);elsefseek(fp,-l,l);printf("算术表达式 不需要W);/out(GT,"");)break;case ':':ch=fgctc(fp);if(ch='=) printf("算术表达式不 需要n");/out(IS;1 ");break;case r+!:rcsult=out(PL);break;case ':

21、rcsult=out(MI);break;case '*':rcsult=Qut(MU);break;case 7':rcsult=Qut(DI);break;case,(l:result=out(zuokuohao);brcak;casey:result=out(roukuohao);brcak; case ?:rcsult=Qut(jin);brcak;case E()F:brcak;default:rcport_error();break;) return;)int EXCUTE (int state, int symbol)(switch (state)(cas

22、e 0:switch (symbol) case DIGIT: n=();p=();e=l ;w=d;CurrcntState= 1 ;Class=UC()N;break;case POINT: w=();n=();p=();c=1 ;CurrcntStatc= 3;Class=UCON;break;default: Handlc()thcrWord( );Class=Class Other;CurrcntS tate=EndStatc;) break;case 1:switch (symbol)case DIGIT: w=w*l ()+d;brcak;/CurrcntState=lcaseP

23、OINT:CurrcntStatc=2;brcak;casePOWER:CurrcntS tatc=4;brcak;default: FC()N=w;CurrcntState=EndStat e;) break;case 2:switch (symbol) (case DIGIT: n+;w=w* l()+d;brcak;casePOWER:Currents tatc=4;break;default: FCON =w*pow(l (),e*p-n) ;Currcn tStatc=EndState;) break;case 3:switch (symbol) (case DIGIT: n+;w=

24、w*10+d;CurrcntStatc=2; break; default: HandlcError( );CurrcntState=En dStatc;break;case 4:switch (symbol)(case DIGIT:p=p*10+d;CurrentState=6;break;caseMU:;CurrcntState=5;break;casePL:c= 1 ;CurrcntStatc=5;brcak;default: HandlcError( );CurrcntStatc=En dState;|break;case 5:switch (symbol)case DIGIT:p=p

25、* 10+d;CurrentS tate=6;break; default:HandlcError( );CurrcntStatc=En dState;break;case 6:switch (symbol)case DIGIT: p=p*l()+d;brcak;default:FCON=w*pow(l (),e*p-n) ;Currcn tState=EndStatc;) break;return CurrentState;int cifa(FILE *fp)CurrentState=O;/ 初始 0 状态scanner_examplc (fp);return (result);Tablc.

26、cpp#includc<stdio.h>#includc<ct'pc.h>#include < s tdlib. h > #includc<string.h> #includc<math.h># define MAXROW 16 行数# dcfine MAXCOL 11 /列数# define SI 1# dcfinc S2 2# dcfine S3 3# dcfine S4 4# dcfine S5 5# dcfinc S6 6# dcfint S7 7# dcfine S8 8#define S9 9#dcfineSl()

27、 1()#dcfineSll 11#dcfineS12 12#define SI3 13#define SI4 14#define S15 15#dcfinc RI 21#dcfine R2 22#dcfine R3 23#dcfine R4 24#dcfine R5 25#dcfinc R6 26#dcfine R7 27#dcfine R8 28#define acc 10()/SLR分析表,213()表示规约,120表示移近,()报错 int Table MAXROVC7 MAXCOL=S4,(),0,(),0,0,S5,0,Sl,S2,S3,0,0,S6,S7,0,0,0,acc,()

28、,(),(), 0,23,23,23,8,9,0,23,0,0,0, 0,26,26,26,26,26,0,26,(),(),(), 4,0,0,0,0,0,5,0,10,2,3,0,28,28,28,28,28,0,28,(),(),(),4,0,0,0,0,0,5,0,0,11,3,4,0,0,0,0,0,5,0,0,12,3,4,0,0,0,(),(),5,0,0,0,13,4,0,0,0,0,0,5,(),0,0,14,(),15,6,7,0,(),0,0,(),(),(), 0,21,21,21,8,9,0,21,0,0,0, (),22,22,22,8,9,0,22,0,0,0,

29、0,24,24,24,24,24,0,24,(),(),(), 0,25,25,25,25,25,0,25,0,(),(),(),27,27,27,27,27,0,27,(),0,0;Yufa.cpp#include<stdio.h>#include<stdlib.h>#include<ct'pe.h>#include<string.h>#include<math.h>#includencifa.cpp"#includentablc.cppn# define PL15/+# define MI 16 /-# defi

30、ne MU 17# define DI 18# define acc 10()# define MAXStatc 20# dcfine NUMBER 9表达式 的个数# define MAXTEMP 10 最多 临时变量的个数int StatcMAXState;状态栈 int i=();int CURRENTSTATE=();/ 标 识当前状态intLENGTH NUMBER = 1,3,3,1, 3,3,1,3,1;表达式右边的长度 int length;int index;/ 索弓| intYcs=0;判断是否结束 int sg=0;/判断是否需要调用 词法程序/extern char *

31、 cifaQ;double cl,t4,f7;/整形char cl220,t4220,f722();/ 字 符型int TEMPMAXTEMP;int temp=();int biaoshifu=();FILE * fp;void REP()RT_ERR()ROYcs=l;long fl=ftell(fp);char ch=fgctc(fp); fseek(fp,-l,l);printf("语法错误,第%d个字符 %。处/工1小); )void AcccptQYcs=l;/printf("语法分析成功 W);)int INDEX(char a)/ 获取当 前字符串对应的索引

32、 int i;switch (a)case fE!:i=8;rcmrn(i);brcak;case 'T:i=9;rctuni(i);brcak;case 'F:i=10;rcturn(i);brcak; default:REP()RT_ERR()RQ ;rcturn(O); break;)void Gcn(int a,double il .double i2,int t)输出四元式 switch (a)casePL:printf("(+,%g,%g,%d)n,il 42,t);break;caseMI:printf(n(-,%g,%g,%d)n",il,i

33、2 ,t);break;caseMU:printf("(*,%g,%g,%d)n",il,i 2,t);break;caseDI:printf(,(/,%g,%g,%d)n,il ,i2 ,t);break;dcfault:break;|)void yuyi(int n)/语义子程序switch (n)case 1:tcmp+;/产生临时 变量,Gen (PL,el, t4,temp);cl 二temp;break;case 2:tcmp+;产生临时 变量,TEMP tempGen(MI,el ,t4,temp);cl=tcmp;break;|case 3:cl=t4;br

34、eak;case 4:tcmp+;Gen(MU,t4,f7,temp);t4=temp;break;case 5:tcmp+;Gen(DI,t4,f7,temp);t4=temp; break;)case 6:t4=f7;break;)case 7:f7=el;break;)case 8:f7=FCQN;break;)default :printf(ncrrornn); break;)void Gen2(int a,char *il,char*i2,intt)输出四元式switch (a)casePL:printf(n(H-,%s,%s,%d)n",&ilbreak;case

35、MI:printf(n(-,%s,%s,%d)nn,&il,break;caseMU:printf("(*,%s,%s,%d)n”,&ilbreak;caseDI:printf(n(/,%s,%s,%d)n",&il,break;default:brcak;)void fuzhi(char *a,char *b)/将 数组b赋值给数组a()void yuyi2(int n)/语义子程序switch (n)case 1:(变量tcmp+;/产生临时Gcn2(PL,el 2,t42,tcmp);cl20=temp; break;case 2:( tcmp

36、+;/产生临时 变量,TEMPtcmpGen2(MI,el 2,t42,temp); cl20=temp; break;)case 3: /el2=t42; strcpy(el2,t42); break;)case 4: tcmp+;Gcn2 (NIU, t42,f72, temp); t420 = temp;break;)case 5: tcmp+;Gen2(DI,t42>f72,tcmp);t420=temp; break;case 6:/t42 = f72;strcpy(t42,f72); break;case 7:/f72=el2;strcpy(f72,c12); break;c

37、ase 8:/f72二TOKEN。;strcpy(f72,TOKEN); break;default :printf("crrorn"); break;)void INPUT(int a)indcx=a;int index2=0;if(TablcCURRENTSTATE index !=acc)if(Tabic CURRENTSTATE index尸=()/报错REP()RT_ERR()RQ;) elseif(Tabic CURRENTSTATE index V2O)移近i+;Statci=TablcCURRENTSTAT E index;CURRENTSTATE=Stat

38、e。;)sc/规约tag=l;lcngth=LENGTHTablcCU RRENTSTATE index-20;i=i-lcngth;/指针回 退switch (Table CURRENTSTATEindex-20) ease 1:case 2:case 3:index2=8;brcak; case 4:case 5:ease 6:index2=9;brcak; ease 7:case8:index2=l();break;default :REP()RT_ERR()RQ; break;)if (biaoshifu!=l) 不 是标识符yuyi(TablcCURRENTSTAT Eindex-20);/规约调用语义 子程序) elseyuyi2(TablcCURRENTSTA TE index-20);/规约调用语义 子程序CURRENTSTATE=State i; i+;St

温馨提示

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

评论

0/150

提交评论