资源描述:
《【精品】语法分析器》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验一:编写C语言的词法分析器输入文件名:*.C输出文件名:*.tok【实验内容】实现C语言的词法分析程序。从输入的C语言源程序中,识别出各个具冇独立意义的单词,以二元组(单词的类别,单词的值)的形式输出。保留字、运算符和分隔符以一字一类的方式编码,所冇的标识符作为一类,所冇的常量作为-•类。【实验目的】明确词法分析的任务,了解词法分析器的设计与实现。【实验耍求】(1)程序(2)实验报告:C语言的词法正规表达式,状态转换图。【实验说明】上机两次4小时,第7周检査。【输入样例】main(){inta,b;a=10;b=a+20;}【输出样例】(id,main)((,_)(),_)({,
2、」(int,_)(id,a)(,,_)(id,b)(;,_)(id,a)(=,_)(const,10)(;,_)(id,b)(=,_)(id,a)(+,_)(const,20)[/watermark]#include^include#include^include^defineLENsizcof(structNode)ttdefineNULL0structNode{chardata;structNode*next;/*定义动态链表数据结构*/};voidoutput(structNode*);/*扫描输出函数
3、*/voidscaner();/*词法分析*/voidgetbcO;voidgetch();voidconcat();intletter(charch);intdegit(charch);intreserve0;voidretract0;voidback(char*a,char*b);structNode*head,*p;charch;/*全局变量*/char*key□二{"float","int","char","if","else","for","while"};/*关键字表*/chartoken[20];/*字符数组,存放构成单词的符号串*/intmain(void){head
4、=(structNode*)malloc(LEN):/*分配头节点存储空间*/if(!head){printf(,,error,/):exit(1);}head->next=NULL;head->data=,';p二head;over・");printf(,zWheninputa'$‘atthebeiginingofanline,thisprogramewillbeprintf(/zAndtheprogramewi11outputthecodesyouinputedjustnow.");printf(z,Pleaseinputyourcodes:");while(l)
5、inti=0;chartemp[256];/*毎行长度不超过256个字符*/gets(temp);/*输入源程序,以行为单位*/if(tern讥0]=='$')break;/*当输入的第一个字符为$时表示输入源代码结束*/p->next=(structNode*)malloc(LEK);if(!(head一〉next))printf("error");exit(1);}p=p->next;while(temp[i]!=, ‘&&i<256)/*将输入的代码以彳亍为单位存入缓冲区*/{p->data=temp[i]:p->ncxt=(structNode*)malloc(LEN);i
6、f(!(p->ncxt)){printfTerror");exit(1);}p=p->next;i++;}/*尾结点*/p->data=,,;p->next=NULL;output(head);/*扫描缓冲区,输出结杲*/p二head->next;while(p->next!=NULL)scaner();/*词法分析*/system(/zpause/z):return0;/*扫描缓冲区函数*/voidoutput(structNode*head)if(!head){printf("error");exit(1);}p=head->next;while(p->next!二NULL)
7、{printf("%c",p->data);-〉next;}prinlf("");voidgetbcO/*若ch中是空口字符,则不停调用getchO直到读入的不是空白字符为止*/{while(ch==,')getchO;}voidgetchO/*从缓冲区读入一字符*/{ch=p->data;p=p->next;}voidconcat0/*将ch中的字符连接到token的后面*/unsignedinti;i=strlen(token):tokor)[i]