编译原理实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验报告
班 学 姓
级:软件工程0802
号:0808010204 名: ****
2011年3月29
一、实验题目 调试词法分析程序 二、实验目的 1.单词的分类 2.符号表的建立 3.单词串的输出形式 三、实验环境
Visual C++6.0环境 四、实验内容 上网下载一个词法分析程序,然后进行调试 五、实验要求 1.单词的分类 可将所有标示符归于一类;将常数归于一类;保留字和分隔符则 可采取一次一类。 2.符号表的建立 可事先建立一保留字表,以备在识别保留字时进行查询。变量名 表及常数表则在词法分析过程中建立。 3.单词串的输出形式 所输出的每一单词,均按形式 (CLASS , VALUE) 的二进制编码形式。对于变量标识符和常数,CLASS字段为相应 的类别码,VALUE字段则是该标识符,常数在其符号表中登记 项的序号。对于保留字和分隔号,由于采用一词一类的编码方 式,所以仅需在二元式的CLASS字段上放置相应的单词的类别 码,VALUE字段则为“空”。不过,为便于查看由词法分析程序 所输出的单词串,也可以在CLASS字段上直接放置单词符号串本 身。 4.可以仿照3-4的结构来编写上述词法分析程序,但其中的若干语 义过程有待于具体编写 5.写出源程序,上机调试 六、源程序 #include <stdio.h> #include <stdlib.h> #incபைடு நூலகம்ude <string.h> #include <ctype.h> #define START -1//定义数组下表从0开始 #define MAXSIZE 20//PL/0 最大的字符串,保留字等 FILE *fp;//pascal源程序文件 FILE *fp1 = fopen("PL词法分析结果.txt","w");//把词法分析结果写到文
exit(0);//打不开文件,退出 } else//打开文件 { str = fgetc(fp);//从文件中取出一个字符 while (str!=EOF)//文件中还有结束 { if (isalpha(str) != 0)//是英文字符 { str = LetterProcess(str);//字母处理 } else if (isdigit(str) != 0)//是数字 { str = NumberProcess(str);//数字处理 } else str = OtherProcess(str);//其他字符处理 }//while printf("词法分析结束\n"); printf("词法分析结果已写入文件\n"); }//else fclose(fp);//关闭文件 fclose(fp1); getchar();//等待结束 return 0; } 七、调试结果
while (isalnum(ch)!=0)//是字母或者数字 { letter[++i] = ch;//字符或者字符串 ch = fgetc(fp);//继续从源文件中读取字符 }; letter[i+1] = '\0';//空白,供Compare处理时好操作 if (Compare(letter,1))//是保留字 { printf("基本字: %s\n",letter);//到控制台 fprintf(fp1,"基本字:\t\t%s\n",letter);//到文件 } else//是标识符 { printf("标识符: %s\n",letter);//到控制台 fprintf(fp1,"标识符:\t\t %s\n",letter);//到文件 } return ch;//返回不是字符或者数字的字符,继续读取文件进行下一个 字符分析 } ///////////////////////////////////////////////////////////////////////////////////////// //函数名:NumberProcess //参数:char ch //功能:分析源程序中的数字,把空格前的一个字符串或者字符串保存到 数组中, //调用Compare进行分析,输出结果到控制台,并存放结果到文件 //返回值: char char NumberProcess(char ch)//数字处理 { int i = START;//数组下标从0开始 char number[MAXSIZE];//存放字符或者字符串 while (isdigit(ch)!=0)//字符是数字 { number[++i] = ch;//存放数字 ch = fgetc(fp);//继续从源文件中读取字符
} case 3: {//pascal比较符 for(int i = 0;i <= 5;i++) { if(strcmp(compareOperators[i],SearchStr)==0)//字符串在 compareOperators中 return true; } break; } case 4: {//pascal界符 for( int i = 0;i <= 7;i++) { if(strcmp(endOperators[i],SearchStr) == 0)//字符串在endOperators 中 return true; } break; } default: break; } return false; } ///////////////////////////////////////////////////////////////////////////////////////// //函数名:LetterProcess //参数:char ch //功能:分析源程序中的字符,把空格前的一个字符串或者字符串保存到 数组中, //调用Compare进行分析,输出结果到控制台,并存放结果到文件 //返回值: char char LetterProcess (char ch)//字符处理 { int i = START;//数组下标从0开始 char letter[MAXSIZE];//存放字符或者字符串
{ otherChar[++i] = ch;//存放该字符到数组 ch = fgetc(fp);//继续读取 } otherChar[i+1]='\0'; if (Compare(otherChar,2))//是运算符 { printf("运算符: %s\n",otherChar);//到控制台 fprintf(fp1,"运算符:\t\t %s\n",otherChar);//到文件 } else if (Compare(otherChar,3))//是比较符 { printf("比较符: %s\n",otherChar);//到控制台 fprintf(fp1,"比较符:\t\t %s\n",otherChar);//到文件 } else if (Compare(otherChar,4))//是界符 { printf("界符:%s\n",otherChar);//到控制台 fprintf(fp1,"界符:\t\t%s\n",otherChar);//到文件 } else //非法标示符 { printf("非法标示符:%s\n",otherChar);//到控制台 fprintf(fp1,"非法标识符:\t\t%s\n",otherChar);//到文件 } return ch;//返回当前字符 } int main() { char str;//保存文件当前字符 printf("词法分析结果如下:\n\n"); if ((fp = fopen("PL源程序.txt","r")) == NULL)//打开文件 { printf("can not open the file!\n");
件" PL分析结果.txt"中
char *keyWord[] = { "const","do","begin","end","call","if","else","then","procedure","read","write","var","whil 基本字 char *Operators[] = {"+","-","*","/"};//pascal运算符 char *compareOperators[] = {"<","<=","=",">",">=","<>"};//pascal比较符 char *endOperators[] = { "," , ":" , ";" , ":=" , "." , "(" , ")" , "'" };//pascal界符 ///////////////////////////////////////////////////////////////////////////////////////// //函数名:Compare //参数:char SearchStr[],int type //功能: 分析源程序中处理过后的字符串,按照基本字,运算符,比较 符,界符进行分析 //返回值: true / false bool Compare(char SearchStr[],int type) { switch (type) // 字符串类型 { case 1:{//pascal基本字 for(int i = 0;i <= 13;i++) { if (strcmp(keyWord[i],SearchStr) == 0)//字符串在keyWord中 return true; } break; } case 2:{//pascal运算符 for(int i = 0;i <= 3;i++) { if(strcmp(Operators[i],SearchStr) == 0)//字符串在Operators中 return true; } break;
} if(isalpha(ch)!=0)//是英文字母 { while(isspace(ch) == 0)//不是空格 { number[++i] = ch;//存放字符 ch = fgetc(fp);//继续从源文件中读取字符 } number[i+1] = '\0'; printf("非法标识符:%s\n",number);//到控制台 fprintf(fp1,"非法标识符:\t %s\n",number);//到文件 return ch;//返回当前字符 } number[i+1]='\0';//空白,供Compare处理时好操作 printf("数字: %s\n",number);//到控制台 fprintf(fp1,"数字:\t\t %s\n",number);//到文件 return ch;//返回当前字符 } ///////////////////////////////////////////////////////////////////////////////////////// //函数名:OtherProcess //参数:char ch //功能:对不是字符,数字的字符进行处理 //返回值: char char OtherProcess(char ch)//其他字符处理 { int i = START;//数组下标从0开始 char otherChar[MAXSIZE];//存放其他字符 if (isspace(ch)!=0)//空格处理 { ch = fgetc(fp);//读取空格后的字符 return ch;//跳过空格,返回空格后的字符 } while ((isspace(ch) == 0) && ( isalnum(ch) == 0))//不是空格也不是字 母或者数字
相关文档
最新文档