实验报告1

mac2022-06-30  29

实验一、词法分析器实验

专业:商业软件工程一班   姓名:王梓斌  学号:201506110116

一、        实验目的

 

编写一个词法分析程序。

 

二、        实验内容和要求

输入:源程序字符串

输出:二元组(种别,单词本身)

    待分析语言的词法规则

三、        实验方法、步骤及结果测试

 

1.      源程序名:压缩包文件(rar或zip)中源程序名 kenk.c

可执行程序名:kenk.exe

2.      原理分析及流程图

对字符串表示的源程序 

从左到右进行扫描和分解

根据词法规则

识别出一个一个具有独立意义的单词符号

以供语法分析之用

发现词法错误,则返回出错信息

3.      主要程序段及其解释:

#include<stdio.h>#include<stdlib.h>#include<string.h>#define _KEY_WOED_END "waiting for your expanding" //关键字结束标志typedef struct{int typenum;char * word;}WORD;char input[255]; //输入换缓冲区char token[255]=""; //单词缓冲区int p_input; //输入换缓冲区指针int p_token; //单词缓冲区指针char ch; //当前所读的字符char *rwtab[]={"begin","if","then","while","do","end",_KEY_WOED_END}; //C语言关键字WORD * scaner(); //词法扫描函数,获得关键字  main(){int over=1;WORD *oneword;oneword=(WORD *)malloc(sizeof(WORD));printf("请输入您的字符串(以#作为结束标志):");scanf("%[^#]s",input); p_input=0;printf("您输入的字符串是:%s\n\n",input);while(over<1000&&over!=-1){oneword=scaner();printf("(%d,%s)\n",oneword->typenum,oneword->word);over=oneword->typenum;}}//需要用到的自编函数参考实现//从输入缓冲区读取一个字符到ch中char m_getch(){ch=input[p_input];p_input=p_input+1;return (ch);} //去掉空白字符void getbc(){while(ch==' '||ch==10){ch=input[p_input];p_input=p_input+1;}} //拼接单词void concat(){token[p_token]=ch;p_token=p_token+1;token[p_token]='\0';} //判断是否字母int letter(){if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')return 1;else return 0;}//判断是否数字int digit(){if(ch>='0'&&ch<='9')return 1;elsereturn 0;}//检索关键字表格int reserve(){int i=0;for(i=0;i<7;i++){if(!strcmp(rwtab[i],token)){return i+1;}i=i+1;}return 10;} //回退一个字符void retract(){p_input=p_input-1;} WORD *scaner(){WORD *myword;myword=(WORD *)malloc(sizeof(WORD));myword->typenum=10;myword->word="";p_token=0;m_getch();getbc();if(letter()){while(letter()||digit()){concat();m_getch();}retract();myword->typenum=reserve();myword->word=token;return(myword);}else if(digit()){while(digit()){concat();m_getch();}retract();myword->typenum=20;myword->word=token;return(myword);}else{switch(ch){case '=':m_getch();if(ch=='='){myword->typenum=39;myword->word="==";return(myword);}retract();myword->typenum=21;myword->word="=";return(myword);break;case '+':myword->typenum=22;myword->word="+";return(myword);break;case '-':myword->typenum=23;myword->word="-";return(myword);break;case '*':myword->typenum=24;myword->word="*";return(myword);break;case '/':myword->typenum=25;myword->word="/";return(myword);break;case '(':myword->typenum=26;myword->word="(";return(myword);break;case ')':myword->typenum=27;myword->word=")";return(myword);break;case '[':myword->typenum=28;myword->word="[";return(myword);break;case ']':myword->typenum=29;myword->word="]";return(myword);break;case '{':myword->typenum=30;myword->word="{";return(myword);break;case '}':myword->typenum=31;myword->word="}";return(myword);break;case ',':myword->typenum=32;myword->word=",";return(myword);break;case ':':myword->typenum=33;myword->word=":";return(myword);break;case ';':myword->typenum=34;myword->word=";";return(myword);break;case '>':myword->typenum=35;myword->word=">";return(myword);break;case '<':myword->typenum=36;myword->word="<";return(myword);break;case '!':m_getch();if(ch=='='){myword->typenum=40;myword->word="!=";return(myword);}retract();myword->typenum=-1;myword->word="ERROR";return(myword);break;case '\0':myword->typenum=1000;myword->word="OVER";return(myword);break;default:myword->typenum=-1;myword->word="ERROR";return(myword);}}}

4.      运行结果及分析

 

 

四、        实验总结

心得体会:在同学的帮助下,网友的教导下,室友的协助下,终于完成了这个代码。再接再厉,再创辉煌!

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/ben-9527/p/5961285.html

最新回复(0)