首页 > 代码库 > 实验二

实验二

一、        实验目的

 

         编制一个词法分析程序

 

二、        实验内容和要求

 

  1. 输入:源程序字符串
  2. 输出:二元组(种别,单词本身)
  3. 待分析语言的词法规则

 

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

 

  1. 1.      源程序名:压缩包文件(rarzip)中源程序名 cifafenxi.c  cifafenxi.exe

 

  1. 2.      原理分析及流程图

技术分享

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

    do

    {

           scanf("%s\n",input);

           i=0;

           while(input[i] !=‘\0‘)

           {

                  //printf("char=%c\n",input[i]);

                  if(input[i] == ‘+‘ || input[i] == ‘-‘ || input[i] == ‘*‘ || input[i] == ‘/‘ || input[i] == ‘=‘)       //对字符串中的表达式做分词,并记录相应运算符 

                  {

                         //printf("\nhello\n");

                         p=(NODE*)malloc(sizeof(NODE));

                         p->next=NULL;

                         p->string=(char*)malloc(sizeof(char)*2);

                         p->string[0]=‘\0‘;

                         strncpy(p->string,&input[i],1);

                         p->next=yunsuanfu->next;

                         yunsuanfu->next=p;

                  //     printf("yunsuanfu is %c\n",input[i]);

                  }

                  else if(ispunct(input[i]) && input[i] != ‘~‘)   //对字符串中出现界符的地方做分词,并记录相应界符

                  {

                         //ch=(char*)malloc(sizeof(NODE));

                         p=(NODE*)malloc(sizeof(NODE));

                         p->next=NULL;

                         p->string=(char*)malloc(sizeof(char)*2);

                         p->string[0]=‘\0‘;

                         strncpy(p->string,&input[i],1);

                         p->next=jiefu->next;

                         jiefu->next=p;

                  }

                  i++;

           }

           ch=strtok(input,delim);

           do

           {

                  if(input[0] ==‘~‘)

                         break;

                  q=head;

                  p=(NODE*)malloc(sizeof(NODE));

                  p->next=NULL;

                  p->string=(char*)malloc(sizeof(input));

                  p->string[0]=‘\0‘;

                  strcat(p->string,ch);           //连接前后字符串,合成新的字符串

                  while(q->next !=NULL)

                         q=q->next;

                  p->next=q->next;

                  q->next=p;

           }while(ch=strtok(NULL,delim));         

    }while(input[0] !=‘~‘);

 

                  if(strspn(p->string,biaowords))              //使用strspn()来对字符串中是否含有biaowords数组中的字符,若有则为标识符

                  {

 

                                q->string=p->string;

                                q->next=biaoshi->next;

                                biaoshi->next=q;                            

                  }

 技术分享

  1. 4.      运行结果及分析

一般必须配运行结果截图,结果是否符合预期及其分析。

   (截图需根据实际,截取有代表性的测试例子)

四、        实验总结

这个实验一开始不是很能理解,感觉非常难,问了一些会的同学,参考了网上的一些资料,才逐步有了一些了解。这个实验需要为不同的关键词分配不同的种别码,再逐步输出,我的代码相比别人还很拙略,还要更加努力。

实验二