河北工业大学编译原理_第1页
河北工业大学编译原理_第2页
河北工业大学编译原理_第3页
河北工业大学编译原理_第4页
河北工业大学编译原理_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1、编译原理实验报告实验一词法分析程序实现一、实验目的与要求通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描 的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析 方法。二、实验设计语言中具有的单词包括五个关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。参考实现方法简述如下。单词的分类:构造上述语言中的各类单词符号及其分类码表。表I语言中的各类单词符号及其分类码表单词符号类别编码类别码的助记符单词值beg in1BEGINend2ENDif3IFthe n4THENelse5ELSE标识符6I

2、D字母打头的字母数字串整常数7INT数字串8LT=9LE=10EQ11NE12GT=13GE14IS+15PL-16MI*17MU/18DI识别表I所列语言中的部分单词的 DFA及相关的语义过程STARTtNTTCATGETCHARdRETRACT LOOKUPCAT GETCHAR丹时.OUT (c+* *e = 0 时CTDTOKEN)CAT GETCHAROUT MTPTOKEN)非d RETRACTCATGETCHARGETCHAROUT (NEZ n) OUT getchOUT CGE非土RETRACTGOTOSTARTM-g 1 ERROR GETCHARUCON将表I单词集中的整

3、常数改为无符号常数,无符号常数的单词分类码助记符: 描述无符号数的正规文法和状态转换图:无符号数的右线性文法 G1如下:无符号数-d余留无符号数无符号数-小数部分无符号数-d余留无符号数-d余留无符号数余留无符号数-十进小数余留无符号数 E指数部分余留无符号数d余留无符号数十进小数E指数部分十进小数f d十进小数十进小数d小数部分d十进小数小数部分d指数部分d余留整指数指数部分+整指数指数部分-整指数指数部分d整指数d余留整指数整指数d余留整指数d余留整指数余留整指数d图所示为上述文法的状态转换图,其中编号 0、1、2、,、6分别代表非终结符 号无符号数 、余留无符号数 、十进小数 、小数部分

4、 、指数部分 、整指 数及 余留整指数。文法G1无符号数 的状态转换图包含语义处理过程的识别无符号数的状态矩阵当前狀蛊扫规字符语文处理操柞或接受动作后堆状态0dn = 0; p = 0| e = 11 w = d j1w = 0| n=0? pH。* e= 113other识别失敵NULL1dt w=w * 10+di)12E4OtherI回送整常敷ICON-w;皓束zdn+ + i w=w * lOH-dj2E4other(回送实常甦 FCONw *pcw(10Te*p-n)t)第束3dn+ r wnw * 10+d f 2other识别失败NULL4dpp * 104-d i64-5e=

5、h5otherNULLSd(pp* 104-dJ6other识剤失败NULL6dfp=p # 10+dH6other回送实 If ft FCON=w * pow(10,e * p tl) ;箱束、源程序#i nclude #in clude #in clude #i nclude #in clude #define BEGIN 1 #defi ne END 2 #defi ne IF 3 #defi ne THEN 4 #defi ne ELSE 5 #defi ne ID6#defi ne INT7#defi ne LT8#defi ne LE 9#defi ne EQ 10#defi ne

6、 NE 11#defi ne GT 12#defi ne GE 13#defi ne PL 14#defi ne MI 15#defi ne MU 16#defi ne DI 17#defi ne IS 18#defi ne TOKEN_SIZE 64#defi ne TAB_SIZE5char TOKENTOKEN_SIZE; exter n in t lookup(char *); exter n void out(i nt ,char*); exter n void report_error(); int GetChar(void);int EXCUTE(i nt,i nt);int L

7、EX(void);#defi ne LETTER 0#defi ne DIGIT 1#defi ne POINT 2#defi ne OTHER 3#defi ne POWER 4#defi ne PLUS 5#defi ne MINUS 6#defi ne ClassNo 100#defi ne ClassOther 200#defi ne En dState -1int w,n ,p,e,d;int Class;int ICON;float FCON;static int Curre ntState;char ch;/信息表保存5个关键字 typedef structint ad;char

8、 id6;i nfo_ele;in fo_ele TabTAB_SIZE=1,begi n,2,e nd,3,if,4,the n,5,else; void scann er_example(FILE *fp)扫描器函数int i,c;ch=fgetc(fp);if(isalpha(ch)TOKEN0=ch;i=1;ch=fgetc(fp);while(isa Inu m(ch) TOKENi=ch; i+; ch=fgetc(fp);fseek(fp,-1,1);TOKENi=O; c=lookup(TOKEN);/是否为字母/是否为字母或数字调用输出函数out()if (c=0)out(I

9、D,TOKEN);elseout(c,TOKEN);else if(isdigit(ch)判断是否为整数TOKEN0=ch;i=1;ch=fgetc(fp);while(isdigit(ch)|ch=.|ch=e|ch=-)TOKENi=ch; i+; ch=fgetc(fp);fseek(fp,-1,1);TOKENi=0; out(INT,TOKEN); LEX();else/判断运算符if(ch= |ch=n);elseswitch(ch)case =:out(EQ,=); break;case :ch=fgetc(fp); if(ch=) out(IS,:=);break;case :

10、ch=fgetc(fp);遇见空格、回车继续if(ch=二)out(GE,=);elsefseek(fp,-1,1); out(GT,);break;casev:ch=fgetc(fp);if(ch=)out(LE,)out(NE,);elsefseek(fp,-1,1);out(LT,);break;/case :=:out(IS,:=);break;case +:out(PL,+);break;case -:out(MI,-);break;case *:out(MU,*);break;case 7:out(DI,/);break;default: report_error();break;

11、int lookup(char p)/查找是否为关键字int i=0;for(i;i宀swioh(a)宀case BEGN prinffsBEG N%s)一n=p)八 break 八 case END - pinff(=(ENp%s)云=p)八 break 八 case -R prinffs-Fs)云=p)八 break 八 case THEM prinff(=(THEN-%s=n=p)?eak- case ELSE prinffvmLSEsrrr-pxbreak- case -g pinff(=(-p%s)云=p)八 break 八 case 乏pinff(=(UCONs=n=p=break

12、- case Lprinff(=(LH%s=n=p)?eak- case LE-brinff(=(LEs=p=break- case EQ-brinffsEQ%S)一 n=p)八 break 八 case NnprinffsNEsrrr-pxbreak- case Gprinff(=(GH%s=n=p)?eak- case GE-brinffsGES)一 n=p)八 break 八 case PL-brinff(=(PL-%s)云=p)?eak 八 case Mpinff(=(M L%s)一 n=p)八 break 八 case M u-bri nff(=(M U - %s)一5p)八 bre

13、ak 八 case DprinffsD L%s)云=p= break八 case -s prinff(=(-s-%s-*/(=i#三、源程序#include#define RIGHT 1#define ERROR 0#define MAXINPUT 300#define MAXSTACK 100char stackMAXSTACK,a=i,+,i,*,i,#;/* a is input line 余留符号栈 */int IsHigherThan (int, int); /*算符优先比较,前者是否高于后者 */int IsLowerThan (int, int); /* /算符优先比较,前者是否

14、低于后者 */int IsEqualTo (int, int);/* /算符优先比较,前者是否等于后者 */int Reduce (int begin, int end, int le n); /归约函数 */char vt3=E,F,T;/ /* determine if stack symbol is in Vt */算符优先表/int table88=1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,0,-1, ,1,1,1,1,1,1, , ,1,1,1,

15、1,1,1, ,1,-1,-1,-1,-1,-1,-1,0,1;int CharTolndex(int ch)II 算符转换表int t;switch(ch)case +:t=0;break;case -:t=1;break;case *:t=2;break;case 7:t=3;break;case (:t=4;break;case ):t=5;break;case i:t=6;break;case #:t=7;break;default:t=8;break;return t;int IsVt(int ch)/判断是否为终结符int i=0;while(ch!=vti) /查看是否为t数组中

16、元素i+;if(i3)return 1; return 0;int lsHigherThan(int i,int j) i = CharTolndex(i);j = CharToIndex(j);if(i =8 |j=8)return 0;else if(tableij=1) return 1;else return 0;int IsLowerThan(int i,int j) i = CharToIndex(i);j = CharToIndex(j);if(i=8 |j=8)return 0;else if(tableij=-1) return 1;else return 0;int IsE

17、qualTo(int i,int j)i = CharToIndex(i);j = CharToIndex(j);if(i =8 |j=8)/算符优先比较,前者是否咼于后者/算符优先比较,前者是否低于后者算符优先比较,前者是否等于后者return 0;else if(tableij=0)return 1;else return 0;/归约函数int Reduce(int begin,int end,int len)int i;char temp50;char NewVn=0;for(i=begin;i%cn,NewVn);return NewVn;int main ()int i, k, r,

18、 NewVn; /* NewVn holds left side of a production */ i=0; k=0;/* i, k is index of a and stack separately */stack0= #;doint j;r=ai+;if (IsVt(stackk) j=k; else j=k-1;while (lsHigherThan(stackj,r)int q;if(j!=0)doq=stackj;if (IsVt(stackj-1)# k!+! : Y嗨 JIHOId ujn)aj i(.#1=ij) a|iqM ujn)aj aspU“uo% .)Buud

19、=i+ioe)s(!bpE)s)o丄lEnbmsi II (!bpE)s)uEq_LeMOis|) jijo pua/ IHOId ujn)aj(m=订和e)s)j!/ iioe)s 1 乙+(bpE)s U+(bpE)s S! JuAMaN=iioe)s/ asejqd aiuud)soiu)p| aq) aonpaj jiujn)aj(.uyodd3.)Buud(.0. = uam9N)J!(卜耳耳1+)。0 npeB=u/vveNX0=iME(bT!bpE)s)UEqj_eMOiS|i)e|!qM:乙=寸aspS3 C:Wi n dows5ystem 3 2crnd,exe-F-FFTE

20、IFFi贝+ 进常进詁进约约纣r 多规多多多多见轨见K-V - M .4:卜-J b J二. r - X - X- -BJ - - 1.-ml” - -fc - 1. - - - 1. - - 1 nr!.,.1页页页TLr2、输入:i+i* #输出结果:屈 C .Wiridow.syitemS2zmd.e:ei iF犍 意 工项;项餐项* 进話进話约R0按 请实验三语义分析程序实现、实验目的与要求在实现词法、语法分析程序的基础上,编写相应的语义子程序,进行简单的语 义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范 畴变换为某种中间代码(四元式)的语义分析方法,并完成相

21、关语义分析器的代码 开发。二、实验设计对文法中的产生式添加语义处理子程序,完成无符号数的四则 运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。程序中出现的主要语义变量和辅助函数的功能为:void QUATERNION(char *result,char *ag1,char *op,char *ag2);用来生成一个四元 式,将其送到四元式表中。char *n ewtemp();产生临时变量的函数,每调用一次都产生一个新的临时变量,并 返回这个新的临时变量名。函数lrparser()在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元 式序列。void scan er()词法

22、分析函数,分析输入单词。三、源程序#include vstdio.h#include #include char prog100,token8,ch;int sta,p,m,n,sum,q;int flag;char *Tab6=begin,if,then,while,do,end;char *factor();char *expression();int douju();char *term();int statement。; int lrparser();char *newtemp();void scaner();void QUATERNION(char *result,char *ag1

23、,char *op,char *ag2);structchar op110;char ag1110;char ag2110;char result10; pQuad20;int lrparser()int schain=0;flag=0;if (sta=1)scaner();/读下一个单词符号schain=douju();II调用语句串分析函数进行分析if(sta=6)scaner();II读下一个单词符号if(sta=0)&(flag=0)printf(Success!n);输出(“succes”)elseif(flag!=1)printf(short of end !n); II 输出 缺

24、 end 错误 flag=1;exit(0);elseprintf(short of begin!n);输出begin错误flag=1;exit(0);return (schain);int douju()int schain=0;schain=statement();调用语句分析函数进行分析if(sta=26)scaner();/读下一个单词符号schain=statement(); /调用语句分析函数进行分析return (schain);int statement。char tt8,eplace8;int schain=0;if (sta=10)strcpy(tt,token);scan

25、er();if(sta=18)scaner();/读下一个单词符号strcpy(eplace,expression();QUATERNION(eplace,tt,=,);schain=0;elseprintf(short of sign := !n);输出缺少赋值号的错误flag=1;exit(0);return (schain);char *expression()char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);分配空间ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt=(char *)mal

26、loc(12);strcpy(eplace,term();II调用term分析产生表达式计算的第一项 eplacewhile(sta=13)|(sta=14)if (sta=13)strcpy(tt,+); II操作符 tt= + 或者一elsestrcpy(tt,-);scaner();II读下一个单词符号strcpy(ep2,term(); II调用term分析产生表达式计算的第二项 ep2 strcpy(tp,newtemp(); II调用newtemp产生临时变量tp存储计算结果QUATERNI0N(tp,eplace,tt,ep2);生成四元式送入四元式表strcpy(eplace,

27、tp);return (eplace);char *term()/仿照函数 expression编写char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt=(char *)malloc(12);strcpy(eplace,factor(); while(sta=15)|(sta=16) if (sta=15)strcpy(tt,*);elsestrcpy(tt,/);scaner(); /读下一个单词符号strcpy(ep2,factor();strc

28、py(tp,newtemp();QUATERNION(tp,eplace,tt,ep2); strcpy(eplace,tp);return (eplace);char *factor()char *fplace;fplace=(char *)malloc(12);strcpy(fplace,);if(sta=10)strcpy(fplace,token);scaner();/读下一个单词符号else if(sta=11)itoa(sum,fplace,10);scaner();/读下一个单词符号else if(sta=27)scaner();/读下一个单词符号fplace=expressio

29、n(); /调用 expression分析返回表达式的值 if(sta=28)scaner();/读下一个单词符号elseprintf(error on ) !n);flag=1;exit(0);elseprintf(error on ( !n);flag=1;exit(0);return (fplace);char *newtemp()char *p;char m8;p=(char *)malloc(8);flag+;itoa(flag,m,10);strcpy(p+1,m);p0=t;return(p);void QUATERNION(char *result,char *ag1,char

30、 *op,char *ag2) / 生成四元式 strcpy(pQuadq.result,result);strcpy(pQuadq.ag11,ag1);strcpy(pQuadq.op1,op);strcpy(pQuadq.ag21,ag2);q+;void scaner()/ 词法分析sum=0;for(m=0;m8;m+)tokenm+=NULL;II清空 tokenm=0;ch=progp+;while(ch=)ch=progp+;if(ch=a)|(chv=Z)&(ch=A)while(chv=z)&(ch=a)|(chv=Z)&(ch=A)|(ch=0)&(chv=9) token

31、m+=ch;ch=progp+;P-;sta=10;II是字符tokenm+=0;I/strcmp比较字符串 当s仁s2for(n=0;n=0)&(chv=9)while(ch=0)&(chv=9)sum=sum*10+ch-0; ch=progp+;p-;sta=11;II是数字else switch(ch)case v:m=0; ch=progp+; if(ch=)sta=21;else if(ch=)sta=22;elsesta=20;P-; break;case :m=0; ch=progp+;if(ch=)sta=24;elsesta=23;p-; break;case :m=0; ch=progp+;if(ch=)sta=18;elsesta=17;P-;break

温馨提示

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

评论

0/150

提交评论