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

    河北工业大学编译原理实验报告(共15页).docx

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

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

    河北工业大学编译原理实验报告(共15页).docx

    精选优质文档-倾情为你奉上编译原理实验报告组员: 韦廷廷()、熊敏()、马昊()任课老师:吴 清一、 任务概述 本次实验我们要完成的任务主要是实现一个简单语言集的词法、语法和语义分析程序,验证实际编译系统的实现方法。我们组的分工并不是词法分析、语法分析、语义分析每人负责一个,而是先确定每种分析按照哪一种方法实现,然后每个人写出自己的想法,按照自己的想法实验,最后总结到一起,有问题大家一起讨论,共同商量解决的办法。二、系统设计实验采用的实现方法和依据: 语言中的各类单词符号及其分类码表单词符号类别编码类别码的助记符单词值begin1BEGINend2ENDif3IFthen4THENelse5ELSE标识符6ID字母打头的字母数字串无符号常数7UCON机内二进制表示<8LT<=9LE=10EQ<>11NE>12GT>=13GE:=14IS+15PL-16MI*17MU/18DI 实验采用的实现方法和依据:文法:E T | E+T | E-T T F | T*F | T/F F i | (E)SLR(1)分析表状态ACTIONGOTO()+-*/i#ETF0S4S51231S6S7Acc2R3R3R3S8S9R33R6R6R6R6R6R64S4S510235R8R8R8R8R8R86S4S51137S4S51238S4S5139S4S51410S15S6S711R1R1R1S8S9R112R2R2R2S8S9R213R4R4R4R4R4R414R5R5R5R5R5R515R7R7R7R7R7R7三、系统实现(包括必要的框图,各.h和.c文件说明,所有函数功能的说明,数据结构、各种表格、变量等的说明,以及函数调用关系图等)(1)各.h和.c文件说明Cifa.cpp的功能:字符串扫描识别。Table.cpp的功能:存放SLR分析法需要用到的ACTION和GOTO表。Yufa.cpp的功能:引用Cifa.cpp、Table.cpp两个文件进行语法、语义的分析。(2)函数功能说明词法分析部分函数说明:int lookup (char *token) /比较是否是关键字 int GetChar(char ch) /每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。 int HandleError (void)/报错函数 int EXCUTE (int state, int symbol)/状态转换 int lookup (char *token) /比较是否是关键字void out(int a,char *token)/输出函数 void scanner_example (FILE *fp)/词法分析语法、语义部分函数功能说明:void REPORT_ERROR()/报错函数void Accept()/语法成功接受int INDEX(char a)/获取当前字符串对应的索引void yuyi(int n)/语义子程序void INPUT(int a)/语法分析程序(2) 数据结构、各种表格、变量等的说明Cifa.cpp中:char *KeyWordTableMAX_KEY_NUMBER="begin","end", "if", "then", "else", KEY_WORD_END;/数组指针关键字int w,n,p,e,d;/w尾数累加器,n小数位数计数器,p指数累加器,e指数符号标记,int Class;/标识单词类型Table.cpp#define MAXROW 16 /行数#define MAXCOL 11 /列数int TableMAXROWMAXCOLYufa.cpp中#define NUMBER 9/表达式的个数int StateMAXState;/状态栈int CURRENTSTATE=0;/标识当前状态int LENGTHNUMBER=1,3,3,1,3,3,1,3,1;/表达式右边的长度int Yes=0;/判断是否结束int tag=0;/判断是否需要调用词法程序四、系统工作过程及运行说明(使用操作指南)程序使用:在工程里创建一个b.txt文件以识别算数运算表达式五、源程序清单(要求有详细注释)和实例程序运行结果源程序清单:Cifa.cpp专心-专注-专业#include<stdio.h>#include<ctype.h>#include<stdlib.h>#include<string.h>#include<math.h>#define DIGIT 1#define POINT 2#define OTHER 3#define POWER 4# define ID 6# define UCON 7# define LT 8# define LE 9# define EQ 10# define NE 11# define GT 12# define GE 13# define IS 14# define PL 15 /+# define MI 16 /-# define MU 17# define DI 18#define zuokuohao 19#define youkuohao 20#define jin 21#define ClassOther 200#define EndState -1#define MAX_KEY_NUMBER 20 /*关键字的数量*/#define KEY_WORD_END "END" /*关键字结束标记*/char *KeyWordTableMAX_KEY_NUMBER="begin","end", "if", "then", "else", KEY_WORD_END;/数组指针char TOKEN20;char ch;int w,n,p,e,d;/w尾数累加器,n小数位数计数器,p指数累加器,e指数符号标记,int Class;/标识单词类型int ICON;double FCON;static int CurrentState=0;int result;int start=0;/指示程序的开始int end=0;/指示程序的结束int GetChar (void);int EXCUTE (int,int);int HandleOtherWord (void) return ClassOther; int HandleError (void) printf ("Error!n"); return 0;int lookup (char *token) /比较是否是关键字 int n=0; while (strcmp(KeyWordTablen, KEY_WORD_END) /*strcmp比较两串是否相同,若相同返回0*/ if (!strcmp(KeyWordTablen, token) /*比较token所指向的关键字和保留字表中哪个关键字相符*/ return n+1; /*根据单词分类码表I,设置正确的关键字类别码,并返回此类别码的值*/ break; n+; return 0; /*单词不是关键字,而是标识符*/int GetChar (char a) char c=a; if(isdigit(c) d=c-'0' /字符c与字符0的ascii码差值,返回类型为一个整数 return DIGIT; if (c='.') return POINT; if (c='E'|c='e') return POWER; if (c='+') return PL; if (c='-') return MU; return OTHER;void report_error( ) printf("错误n");void out1(int a,char *token)/输出函数 switch (a) case 1:printf("(BEGIN, )n");break; case 2:printf("(END, )n");break; case 3:printf("(IF, )n");break; case 4:printf("(THEN, )n");break; case 5:printf("(ELSE, )n");break; case 6: printf("(ID,%s)n",token);break; case 8:printf("(LT,%s)n",token);break; case 9:printf("(LE,%s)n",token);break; case 10:printf("(EQ,%s)n",token);break; case 11:printf("(NE,%s)n",token);break; case 12:printf("(GT,%s)n",token);break; case 13:printf("(GE,%s)n",token);break; case 14:printf("(IS,%s)n",token);break; case 15:printf("(PL,%s)n",token);break; case 16:printf("(MI,%s)n",token);break; case 17:printf("(MU,%s)n",token);break; case 18:printf("(DI,%s)n",token);break; case 19:printf("(, )n");break; case 20:printf("(), )n");break; default: report_error( );break; int out(int a)switch(a)case 7:return 6;break;/常量case 15:return 2;break;/+case 16:return 3;break;case 17:return 4;break;case 18:return 5;break;case 19:return 0;break;case 20:return 1;break;case 21:return 7;break; case 22:return 100;break;/判断是否是空格或换行case 26: return 26;break;/标识符default:return 001;report_error();break;void scanner_example (FILE *fp)/文件扫描器 int i, c; ch=fgetc(fp);if(ch=' '|ch='n') scanner_example (fp); else if (isalpha (ch) /判断是否是英文字母 TOKEN0=ch; ch=fgetc(fp); i=1; while (isalnum (ch) TOKENi=ch; i+; ch=fgetc (fp); TOKENi='0' fseek(fp,-1,1); /* retract*/ c=lookup (TOKEN); if (c=0) /printf("算术表达式不需要n"); result=out(26); /标识符 else if(c=1) start=1; out1 (c," "); if (c=2)end=1;out1(c," "); else if (isdigit(ch)|ch='.') /判断是否是数字或“.” i=0; /TOKENi=ch; if(isdigit(ch) d=ch-'0' /字符c与字符0的ascii码差值,返回类型为一个整数 EXCUTE(CurrentState,DIGIT); if (ch='.') EXCUTE(CurrentState,POINT); if (ch='E'|ch='e') EXCUTE(CurrentState,POWER); if (ch='+')EXCUTE(CurrentState,PL) ; if (ch='-') EXCUTE(CurrentState,MU); while(CurrentState!=EndState) TOKENi=ch; i+;ch=fgetc(fp);int c=GetChar(ch); EXCUTE(CurrentState,c); TOKENi='0' fseek(fp,-1,1); / printf("(UCON,%g)n",FCON); result=out(UCON);else switch(ch) /关系运算符 case '<': ch=fgetc(fp); if(ch='=')out1(LE," "); else if(ch='>') out1 (NE," "); else fseek (fp,-1,1); printf("算术表达式不需要n"); / out (UCON); break; case '=': printf("算术表达式不需要n"); /out(EQ, " "); break; case '>': ch=fgetc(fp); if(ch='=') printf("算术表达式不需要n"); /out(GE," "); else fseek(fp,-1,1); printf("算术表达式不需要n"); /out(GT," "); break;case ':':ch=fgetc(fp); if(ch='=') printf("算术表达式不需要n"); /out(IS," "); break;case '+':result=out(PL);break;case '-':result=out(MI);break;case '*':result=out(MU);break;case '/':result=out(DI);break;case '(':result=out(zuokuohao);break;case ')':result=out(youkuohao);break;case '':result=out(jin);break;case EOF:break;default:report_error();break;return;int EXCUTE (int state, int symbol) switch (state) case 0:switch (symbol) case DIGIT: n=0;p=0;e=1;w=d;CurrentState=1;Class=UCON;break; case POINT: w=0;n=0;p=0;e=1;CurrentState=3;Class=UCON;break; default: HandleOtherWord( );Class=ClassOther; CurrentState=EndState; break; case 1:switch (symbol) case DIGIT: w=w*10+d;break; /CurrentState=1 case POINT: CurrentState=2;break; case POWER: CurrentState=4;break; default: FCON=w;CurrentState=EndState; break; case 2:switch (symbol) case DIGIT: n+;w=w*10+d;break; case POWER: CurrentState=4;break; default: FCON=w*pow(10,e*p-n);CurrentState=EndState; break; case 3:switch (symbol) case DIGIT: n+;w=w*10+d;CurrentState=2;break; default: HandleError( );CurrentState=EndState; break; case 4:switch (symbol) case DIGIT: p=p*10+d;CurrentState=6;break; case MU: e=-1;CurrentState=5;break; case PL: e=1;CurrentState=5;break; default: HandleError( );CurrentState=EndState; break; case 5:switch (symbol) case DIGIT: p=p*10+d;CurrentState=6;break; default: HandleError( );CurrentState=EndState; break; case 6:switch (symbol) case DIGIT: p=p*10+d;break; default: FCON=w*pow(10,e*p-n);CurrentState=EndState; break; return CurrentState; int cifa(FILE *fp) CurrentState=0;/初始0状态 scanner_example (fp); return(result);Table.cpp#include<stdio.h>#include<ctype.h>#include<stdlib.h>#include<string.h>#include<math.h>#define MAXROW 16 /行数#define MAXCOL 11 /列数#define S1 1#define S2 2#define S3 3#define S4 4#define S5 5#define S6 6#define S7 7#define S8 8#define S9 9#define S10 10#define S11 11#define S12 12#define S13 13#define S14 14#define S15 15#define R1 21#define R2 22#define R3 23#define R4 24#define R5 25#define R6 26#define R7 27#define R8 28#define acc 100/SLR(1)分析表,2130表示规约,120表示移近,0报错int TableMAXROWMAXCOL=S4,0,0,0,0,0,S5,0,S1,S2,S3,0,0,S6,S7,0,0,0,acc,0,0,0,0,23,23,23,8,9,0,23,0,0,0,0,26,26,26,26,26,0,26,0,0,0,4,0,0,0,0,0,5,0,10,2,3,0,28,28,28,28,28,0,28,0,0,0,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,0,0,5,0,0,0,13,4,0,0,0,0,0,5,0,0,0,14,0,15,6,7,0,0,0,0,0,0,0,0,21,21,21,8,9,0,21,0,0,0,0,22,22,22,8,9,0,22,0,0,0,0,24,24,24,24,24,0,24,0,0,0,0,25,25,25,25,25,0,25,0,0,0,0,27,27,27,27,27,0,27,0,0,0;Yufa.cpp#include<stdio.h>#include<ctype.h>#include<stdlib.h>#include<string.h>#include<math.h>#include"cifa.cpp"#include"table.cpp" # define PL 15 /+# define MI 16 /-# define MU 17# define DI 18#define acc 100#define MAXState 20#define NUMBER 9/表达式的个数#define MAXTEMP 10/最多临时变量的个数int StateMAXState;/状态栈int i=0;int CURRENTSTATE=0;/标识当前状态int LENGTHNUMBER=1,3,3,1,3,3,1,3,1;/表达式右边的长度int length;int index;/索引int Yes=0;/判断是否结束int tag=0;/判断是否需要调用词法程序/extern char * cifa();double e1,t4,f7;/整形char e1220,t4220,f7220;/字符型int TEMPMAXTEMP;int temp=0;int biaoshifu=0;FILE * fp;void REPORT_ERROR()Yes=1;long f1=ftell(fp);char ch=fgetc(fp);fseek(fp,-1,1);printf("语法错误,第%d个字符'%C'处n",f1,ch);void Accept()Yes=1;/printf("语法分析成功n");int INDEX(char a)/获取当前字符串对应的索引int i;switch (a)case 'E':i=8;return(i);break;case 'T':i=9;return(i);break;case 'F':i=10;return(i);break;default: REPORT_ERROR();return(0); break;void Gen(int a,double i1,double i2,int t)/输出四元式switch(a)case PL:printf("(+,%g,%g,%d)n",i1,i2,t);break;case MI:printf("(-,%g,%g,%d)n",i1,i2,t);break;case MU:printf("(*,%g,%g,%d)n",i1,i2,t);break;case DI:printf("(/,%g,%g,%d)n",i1,i2,t);break;default:break;void yuyi(int n)/语义子程序switch(n)case 1: temp+;/产生临时变量,Gen(PL,e1,t4,temp);e1=temp;break;case 2:temp+;/产生临时变量,TEMPtempGen(MI,e1,t4,temp);e1=temp;break;case 3:e1=t4;break;case 4:temp+;Gen(MU,t4,f7,temp);t4=temp;break;case 5:temp+;Gen(DI,t4,f7,temp);t4=temp;break;case 6:t4=f7;break;case 7:f7=e1;break;case 8:f7=FCON;break;default :printf("errorn");break;void Gen2(int a,char *i1,char *i2,int t)/输出四元式switch(a)case PL:printf("(+,%s,%s,%d)n",&i1,&i2,t);break;case MI:printf("(-,%s,%s,%d)n",&i1,&i2,t);break;case MU:printf("(*,%s,%s,%d)n",&i1,&i2,t);break;case DI:printf("(/,%s,%s,%d)n",&i1,&i2,t);break;default:break;void fuzhi(char *a,char *b)/将数组b赋值给数组avoid yuyi2(int n)/语义子程序switch(n)case 1: temp+;/产生临时变量Gen2(PL,e12,t42,temp);e120=temp;break;case 2:temp+;/产生临时变量,TEMPtempGen2(MI,e12,t42,temp);e120=temp;break;case 3:/e12=t42;strcpy(e12,t42);break;case 4:temp+;Gen2(MU,t42,f72,temp);t420=temp;break;case 5:temp+;Gen2(DI,t42,f72,temp);t420=temp;break;case 6:/t42=f72;strcpy(t42,f72);break;case 7:/f72=e12;strcpy(f72,e12);break;case 8:/f72=TOKEN0;strcpy(f72,TOKEN);break;default :printf("errorn");break;void INPUT(int a)index=a;int index2=0;if(TableCURRENTSTATEindex!=acc)if (TableCURRENTSTATEindex=0)/报错REPORT_ERROR();else if (TableCURRENTSTATEindex<20)/移近 i+; Statei=TableCURRENTSTATEindex; CURRENTSTATE=Statei; else /规约tag=1;length=LENGTHTableCURRENTSTATEindex-20; i=i-length;/指针回退 switch(TableCURRENTSTATEindex-20)case 1: case 2:case 3:index2=8;break;case 4:case 5:case 6:index2=9;break;case 7:case 8:index2=10;break;default :REPORT_ERROR();break;if (biaoshifu!=1)/不是标识符yuyi(TableCURRENTSTATEindex-20);/规约调用语义子程序elseyuyi2(TableCURRENTSTATEindex-20);/规约调用语义子程序CURRENTSTATE=Statei;i+; Statei=TableCURRENTSTATEindex2;CURRENTSTATE=Statei;else Accept();CURRENTSTATE=0;void main() int res; State0=0; if(fp=fopen("b.txt","r")=NULL) printf("file open error!n");

    注意事项

    本文(河北工业大学编译原理实验报告(共15页).docx)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

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




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开