当前位置:文档之家› 编译原理实验(词法分析)

编译原理实验(词法分析)

编译原理实验报告实验一实验题目:词法分析指导老师:任姚鹏专业班级:计算机科学与技术系网络工程方向1002班姓名:xxxx2013年 4月13日实验类型__验证性__ 实验室_软件实验室三__一、实验项目的目的和任务:了解和掌握词法分析的方法,编程实现给定源语言程序的词法分析器,并利用该分析器扫描源语言程序的字符串,按照给定的词法规则,识别出单词符号作为输出,发现其中的词法错误。

二、实验内容:1.设计一个简单的程序设计语言(语言中有若干运算符和分界符;有若干关健字;若干标识符及若干常数)2.确定编译中使用的表格、词法分析器的输出形式、标识符与关键字的区分方法。

3.把词法分析器设计成一个独立的过程。

三、实验要求:1.从键盘上输入源程序;2.处理各单词,计算个单词的值和类型;3.输出个单词名、单词的值和类型。

四、实验代码#include <stdio.h>#include <string.h>char file[1024];int length=0;int index;char keywords[][10]={"auto","short","int","long","float","double","char","struct","union","enum","typedef","const","unsigned","signed","extern","register","static","volatile","void","default","if","else","switch","case","for","do","while","goto","continue","break","sizeof","return"};char limits[]={'(',')','[',']','{','}',',',';'};char operators[]={'+', '-', '*', '/', '%','>','<','&','|','^','~','!','='}; //13int IsChar(char ch) //是否是字符{ if ( (ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z'))return 1;return 0;}int IsNumber(char ch) {if ( (ch>='0'&& ch<='9'))return 1;return 0;}int IsKeyWord(int idx) //关键字和标示符识别{ char tmp[30];int i=0;while(IsChar(file[idx])) tmp[i++]=file[idx++]; //将单词拷贝tmp[i]='\0';if(i==0)return 0;for (i=0;i<32;i++){ if (0==strcmp(keywords[i],tmp)) //相等{ printf("(关键字 %d, %s )\n",1,tmp); //打印结果,关键字index=idx-1; //新的index的值return 1;} }return 0; }int IsConst(int idx){ char tmp[30];int i=0;if (IsChar(file[idx]) && (file[idx-1]=='\'')) //单个字符判断{ if(file[idx+1]=='\'') //是单个的字符{ tmp[i++]=file[idx++];tmp[i]='\0';printf("(常数 %d, %s )\n",3,tmp);//打印结果index=idx-1;return 1; }else{ return 0; } }else if(IsNumber(file[idx])) //一串数字判断{ while(IsNumber(file[idx]))tmp[i++]=file[idx++];tmp[i++]=file[idx++];tmp[i]='\0';printf("(常数 %d, %s )\n",3,tmp);//打印结果index=idx-1;return 1; }return 0; }int IsWord(int idx) //是否是标示符{ char tmp[30];int i=0;if(IsKeyWord(idx)) //是关键字就不做处理return 0;if(IsConst(idx)) //是常量不做处理return 0;if( (file[idx]=='_') ||(IsNumber(file[idx])) ||(IsChar(file[idx]))) tmp[i++]=file[idx++];if(i==0) return 0;while((IsNumber(file[idx])) ||(IsChar(file[idx])))tmp[i++]=file[idx++]; //将单词拷贝tmp[i]='\0';printf("(标示符 %d, %s )\n",2,tmp); //打印结果index=idx-1;return 1; }int IsOperator(int idx) //是否是运算符{char tmp[30];int k=0;int i=0;for (k=0;k<13;k++){ if(operators[k]==file[idx]){ tmp[i++]=file[idx];index=idx;if( (file[idx+1]=='=') ||((file[idx]=='+') &&(file[idx+1]=='+'))||((file[idx]=='-') &&(file[idx+1]=='-'))){ tmp[i++]=file[++idx];index=idx;}tmp[i]='\0';printf("(运算符 %d, %s )\n",4,tmp); //打印结果return 1;} }return 1; }int IsLimit(int idx) //限界符{ int i;for(i=0;i<8;i++){ if(limits[i]==file[idx]){ printf("(界限符 %d, %c )\n",4,file[idx]);return 1;} }return 0; }int ReadFile(char * name){ int i=0;int length;char ch;FILE *fp =fopen(name,"r");if(fp==NULL){ printf("can't open file %s\n",name);return -1; }length=0;while ( (ch=fgetc(fp))!=EOF)file[length++]=ch;for(i=0;i<length;i++)putchar(file[i]);fclose(fp);return length; }int main(){ if((length=ReadFile("TestDemo.c"))==-1) //读取文件失败return -1;index=0;while(index<length){ while ( (file[index]==' ') && (index<length)) index++; //去除空格if(index>=length) return 0;if(IsKeyWord(index)) //考查是不是关键字{}else if (IsConst(index)){}else if(IsWord(index)) //考查是不是符号{}else if (IsLimit(index)){}else if(IsOperator(index)){}index++; //考查下一个字符 }return 0; }五、运行结果六、实验总结实验一是关于词法分析的实验项目,本次实验中所涉及到的词法分析是编译原理课程中最基本也是特别重要的知识,是学习编译原理的基础。

在实验中需要用C语言编写一个程序模拟出词法分析的过程,这就需要用到前面所学的一系列课程的知识。

通过本次实验内容,使我自己进一步熟悉了编译原理这门课程,也对课程的基本知识和语法有了更加深刻的认识和理解,同时也将前面所学课程得到巩固,使自己发现了一些不足之处,在今后需要加强的地方还有很多很多。

相关主题