实验一、词法分析实验

专业   姓名  学号

一、        实验目的

      编制一个词法分析程序

 

二、        实验内容和要求

输入:源程序字符串

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

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


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

可执行程序名:cifafenxi.exe

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

主要总体设计问题。

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

                     流程图

词法分析javacc 词法分析实验报告_词法分析

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

  1. 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'; 
   }
  1. 运行结果及分析

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

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

 

词法分析javacc 词法分析实验报告_字符数组_02


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


四、        实验总结

 

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

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