词法分析实验报告

不羁岁月 提交于 2020-01-05 01:50:57

实验一、词法分析实验

专业   姓名  学号

一、        实验目的

      编制一个词法分析程序

 

二、        实验内容和要求

输入:源程序字符串

    输出:二元组(种码,单词符号本身)。

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

 

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

可执行程序名:cifafenxi.exe

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

主要总体设计问题。

(包括存储结构,主要算法,关键函数的实现等)

                     流程图

  总体思想是将输入的源程序将其运用词法分析规则去分类(保留字/关键字/界符/运算符等等),其中保留字包含(字母 数字 下划线)关键字(if/switch/while/case等等),利用数组将其存起来与后面的在进循环的字符进行判断,若是则输出,清空数组,在判断直到源程序的最后一个字符是‘#’ ,结束 显示 (种码,x)。

  1. 3.     主要程序段及其解释:
  2.  #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'; 
       }
    

      

  1. 运行结果及分析

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

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

 

 

 满足了简单的二元组判别功能,已有对应的种码会显示。

 

四、        实验总结

 

心得体会,实验过程的难点问题及其解决的方法。

刚刚接触词法分析,有很不懂得地方,程序还不是完善,只是一个简简单单的词法分析器,还有很多地方要学习。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!