收藏 分享(赏)

河北工业大学编译原理.doc

上传人:11xg27ws 文档编号:7392518 上传时间:2019-05-16 格式:DOC 页数:35 大小:1.14MB
下载 相关 举报
河北工业大学编译原理.doc_第1页
第1页 / 共35页
河北工业大学编译原理.doc_第2页
第2页 / 共35页
河北工业大学编译原理.doc_第3页
第3页 / 共35页
河北工业大学编译原理.doc_第4页
第4页 / 共35页
河北工业大学编译原理.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

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

2、e 5 ELSE标识符 6 ID 字母打头的字母数字串整常数 7 INT 数字串11 NE 12 GT= 13 GE:= 14 IS+ 15 PL- 16 MI* 17 MU/ 18 DI识别表 I 所列语言中的部分单词的 DFA 及相关的语义过程将表 I 单词集中的整常数改为无符号常数,无符号常数的单词分类码助记符:UCON描述无符号数的正规文法和状态转换图:无符号数的右线性文法 G1如下:无符号数 d余留无符号数无符号数 小数部分无符号数 d余留无符号数 d余留无符号数余留无符号数 十进小数余留无符号数 E指数部分余留无符号数 d余留无符号数 十进小数 E指数部分十进小数 d十进小数十进小

3、数 d小数部分 d十进小数小数部分 d指数部分 d余留整指数指数部分 +整指数指数部分 -整指数指数部分 d整指数 d余留整指数整指数 d余留整指数 d余留整指数余留整指数 d图所示为上述文法的状态转换图,其中编号 0、1、2、6 分别代表非终结符号 、 及。文法 G1 的状态转换图包含语义处理过程的识别无符号数的状态矩阵3、源程序/扫描器/#include#include#include#include#include#define BEGIN 1#define END 2#define IF 3#define THEN 4#define ELSE 5#define ID 6#define

4、INT 7#define LT 8#define LE 9#define EQ 10#define NE 11#define GT 12#define GE 13#define PL 14#define MI 15#define MU 16#define DI 17#define TOKEN_SIZE 64#define TAB_SIZE 5char TOKENTOKEN_SIZE;extern int lookup(char *);extern void out(int ,char*);extern void report_error();int GetChar(void);int EXCU

5、TE(int,int);int LEX(void);#define LETTER 0#define DIGIT 1#define POINT 2#define OTHER 3#define POWER 4#define PLUS 5#define MINUS 6#define ClassNo 100 #define ClassOther 200#define EndState -1int w,n,p,e,d;int Class;int ICON;float FCON;static int CurrentState;char ch;/信息表保存 5 个关键字typedef structint a

6、d;char id6;info_ele;info_ele TabTAB_SIZE=1,“begin“,2,“end“,3,“if“,4,“then“,5,“else“;void scanner_example(FILE *fp) /扫描器函数int i,c;ch=fgetc(fp);if(isalpha(ch) /是否为字母TOKEN0=ch;i=1;ch=fgetc(fp);while(isalnum(ch) /是否为字母或数字TOKENi=ch;i+;ch=fgetc(fp);fseek(fp,-1,1);TOKENi=0;c=lookup(TOKEN); /调用输出函数 out()if

7、(c=0) out(ID,TOKEN);else out(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); /遇见空格、回车继续else switch(ch)case =:out(EQ,“=“);break;case :ch=fgetc(fp);if(ch=)

8、out(GE,“=“);else fseek(fp,-1,1);out(GT,“);break;case)out(NE,“ - * / ( i # 3、源程序#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); /* /算

9、符优先比较,前者是否低于后者*/int IsEqualTo (int, int); /* /算符优先比较,前者是否等于后者*/int Reduce (int begin, int end, int len); /*归约函数*/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,

10、, ,1,1,1,1,1,1, ,1,-1,-1,-1,-1,-1,-1,0,1;int CharToIndex(int ch) /算符转换表int t;switch(ch)case +:t=0;break;case -:t=1;break;case *:t=2;break;case /: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) /

11、查看是否为 t数组中元素i+;if(i3)return 1;return 0;int IsHigherThan(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 IsLowerThan(int i,int j) /算符优先比较,前者是否低于后者i = CharToIndex(i);j = CharToIndex(j);if(i=8 |j=8)return 0;else if(ta

12、bleij=-1)return 1;else return 0;int IsEqualTo(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 ()i

13、nt i, k, r, 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 (IsHigherThan(stackj,r)int q;if(j!=0)doq=stackj;if (IsVt(stackj-1) j-; else j-=2; while(!IsLowerThan(stackj,q)NewVn=Redu

14、ce(j+1,k,k-j);if(NewVn = 0)printf(“ERRORn“);return ERROR;k=j+1; /* reduce the leftmost prime phrase */stackk=NewVn; /* it is stackj+1 stackj+2 stackk */if(stack1=E)printf(“OK!n“);return RIGHT; /*end of while*/if (IsLowerThan(stackj,r) | IsEqualTo(stackj,r)stack+k=r;printf(“移进 %cn“,r);else return ERR

15、OR; while (r!=#);return RIGHT;四:测试1、 输入:i+i*i #输出结果:2、输入:i+i* #输出结果:实验三 语义分析程序实现一、实验目的与要求在实现词法、语法分析程序的基础上,编写相应的语义子程序,进行简单的语义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范畴变换为某种中间代码(四元式)的语义分析方法,并完成相关语义分析器的代码开发。2、实验设计对文法 中的产生式添加语义处理子程序,完成无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。程序中出现的主要语义变量和辅助函数的功能为:void QUATERNION(

16、char *result,char *ag1,char *op,char *ag2);用来生成一个四元式,将其送到四元式表中。char *newtemp(); 产生临时变量的函数,每调用一次都产生一个新的临时变量,并返回这个新的临时变量名。函数 lrparser()在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。void scaner();词法分析函数,分析输入单词。3、源程序#include #include #include char prog100,token8,ch;int sta,p,m,n,sum,q;int flag;char *Tab6=“begin“,“i

17、f“,“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,char *op,char *ag2);struct char op110;char ag1110;char ag2110;char result10; pQuad20;int lrparser() int schain=0

18、;flag=0;if (sta=1) scaner(); /读下一个单词符号schain=douju(); /调用语句串分析函数进行分析if(sta=6) scaner(); /读下一个单词符号if(sta=0) /输出(“success ”)else if(flag!=1)printf(“short of end !n“); /输出 缺 end 错误flag=1;exit(0);else printf(“short of begin !n“); /输出begin 错误flag=1;exit(0);return (schain);int douju() int schain=0;schain=

19、statement(); /调用语句分析函数进行分析if(sta=26) scaner(); /读下一个单词符号schain=statement(); /调用语句分析函数进行分析return (schain);int statement() char tt8,eplace8;int schain=0;if (sta=10) strcpy(tt,token);scaner();if(sta=18) scaner(); /读下一个单词符号 strcpy(eplace,expression();QUATERNION(eplace,tt,“=“,“);schain=0;else printf(“sho

20、rt 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 *)malloc(12);strcpy(eplace,term(); /调用 term 分析产生表达式计算的第一项 eplacewhile(sta=13)|(sta=14) if (sta=13)strcpy(tt

21、,“+“); /操作符 tt= +或者else strcpy(tt,“-“);scaner(); /读下一个单词符号strcpy(ep2,term(); /调用 term 分析产生表达式计算的第二项 ep2strcpy(tp,newtemp(); /调用 newtemp 产生临时变量 tp 存储计算结果QUATERNION(tp,eplace,tt,ep2); /生成四元式送入四元式表strcpy(eplace,tp);return (eplace);char *term() /仿照函数 expression 编写 char *tp,*ep2,*eplace,*tt;tp=(char *)ma

22、lloc(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,“*“);else strcpy(tt,“/“);scaner(); /读下一个单词符号strcpy(ep2,factor();strcpy(tp,newtemp();QUATERNION(tp,eplace,tt,ep2);strcpy(eplace,tp);return (eplace);char *

23、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=expression(); /调用 expression 分析返回表达式的值if(sta=28)scaner(); /读下一个单词符号else printf(“error on

24、 ) !n“);flag=1;exit(0);else printf(“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 *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;m=a)|(ch=A) while(ch=a)|(ch=A)|(ch=0)ch=progp+;p-;sta=10; / 是字符tokenm+=0;for(n=0;n6;n+)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报