实验一、词法分析实验
专业 姓名 学号
一、 实验目的
编制一个词法分析程序
二、 实验内容和要求
输入:源程序字符串
输出:二元组(种码,单词符号本身)。
三、 实验方法、步骤及结果测试
- 1. 源程序名:压缩包文件(rar或zip)中源程序名cifafenxiqi.c
可执行程序名:cifafenxi.exe
- 2. 原理分析及流程图
主要总体设计问题。
(包括存储结构,主要算法,关键函数的实现等)
流程图
总体思想是将输入的源程序将其运用词法分析规则去分类(保留字/关键字/界符/运算符等等),其中保留字包含(字母 数字 下划线)关键字(if/switch/while/case等等),利用数组将其存起来与后面的在进循环的字符进行判断,若是则输出,清空数组,在判断直到源程序的最后一个字符是‘#’ ,结束 显示 (种码,x)。
- 3. 主要程序段及其解释:
-
#include <stdio.h> #include <string.h> char prog[80],token[8],ch; //创建字符数组 int syn,p,m,n,sum; //syn 是种码 char *rwtab[6]={"begin","if","then","while","do","end"}; //字符数组’关键字’ void scaner(void); main() { p=0; printf("\n please input a string(end with '#'):\n"); //’#’字符为结束标志 // 输入 用prog字符数组存储 do{ scanf("%c",&ch); prog[p++]=ch; }while(ch!='#'); p=0; //prog数组 从头开始 行数53 do{ scaner(); //将输入的源程序分类别 switch(syn) { case 11: printf("( %-10d%5d )\n",sum,syn); break; case -1: printf("you have input a wrong string\n"); //getch(); return 0; break; default: printf("( %-10s%5d )\n",token,syn); break; } }while(syn!=0); //getch(); } void scaner(void) { sum=0; for(m=0;m<8;m++) token[m++]= NULL; //初始化 ch=prog[p++]; //调出prog字符数组的字符 m=0; while((ch==' ')||(ch=='\n')) ch=prog[p++]; //将回车、空格忽略 if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))) //判断是否为字母 { while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) token[m++]=ch; //存储字母到token字符数组中 ch=prog[p++]; } p--; //否,退回一格 syn=10; //输出 for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) //判断是否万为关键字 { syn=n+1; break; } } else if((ch>='0')&&(ch<='9')) //判断是否为数字 { while((ch>='0')&&(ch<='9')) { sum=sum*10+ch-'0'; ch=prog[p++]; } p--; syn=11; } else //界符、运算符、其他特殊符号 { switch(ch) { case '<': token[m++]=ch; ch=prog[p++]; if(ch=='=') //判断是〈还是<= { syn=22; token[m++]=ch; } else { syn=20; p--; } break; case '>': token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24; token[m++]=ch; } else { syn=23; p--; } break; case '+': token[m++]=ch; ch=prog[p++]; if(ch=='+') { syn=17; token[m++]=ch; } else { syn=13; p--; } break; case '-': token[m++]=ch; ch=prog[p++]; if(ch=='-') { syn=29; token[m++]=ch; } else { syn=14; p--; } break; case '!': ch=prog[p++]; if(ch=='=') { syn=21; token[m++]=ch; } else { syn=31; p--; } break; case '=': token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=25; token[m++]=ch; } else { syn=18; p--; } break; case '*': syn=15; token[m++]=ch; break; case '/': syn=16; token[m++]=ch; break; case '(': syn=27; token[m++]=ch; break; case ')': syn=28; token[m++]=ch; break; case '{': syn=5; token[m++]=ch; break; case '}': syn=6; token[m++]=ch; break; case ';': syn=26; token[m++]=ch; break; case '\"': syn=30; token[m++]=ch; break; case '#': syn=0; token[m++]=ch; break; case ':': syn=17; token[m++]=ch; break; default: syn=-1; break; } } token[m++]='\0'; }
- 运行结果及分析
一般必须配运行结果截图,结果是否符合预期及其分析。
(截图需根据实际,截取有代表性的测试例子)
满足了简单的二元组判别功能,已有对应的种码会显示。
四、 实验总结
心得体会,实验过程的难点问题及其解决的方法。
刚刚接触词法分析,有很不懂得地方,程序还不是完善,只是一个简简单单的词法分析器,还有很多地方要学习。
来源:https://www.cnblogs.com/dami666/p/5947547.html