实验一 词法分析实验

商软一班  刘畅   201506110126

 

一、 实验目的

通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解。

二、 实验内容和要求

在原程序中输入源代码

  • 对字符串表示的源程序  
  • 从左到右进行扫描和分解
  • 根据词法规则
  • 识别出一个一个具有独立意义的单词符号
  • 以供语法分析之用
  • 发现词法错误,则返回出错信息

在源程序中,自动识别单词,把单词分为五种,并输出对应的单词种别码。

  1. 识别关键字:main if int for while do return break continue,该类的单词码为1.
  2. 识别标识符:表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum,该类的单词码为2.
  3. 运算符:+、-、*、/、=、>、<、>=、<=、!=
  4. 分隔符:,、;、{、}、(、)
  5. 常数,如123,4587

各种单词符号对应的种别码。

输出形式:

  • 二元式

– (单词种别,单词自身的值)

  • 单词种别,表明单词的种类,语法分析需要的重要信息

– 整数码

  • 关键字、运算符、界符:一符一码
  • 标识符:10, 常数:11
  • 单词自身的值

– 标识符token、常数sum

– 关键字、运算符、界符token

 

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

  1. 源程序名:词法分析.c 词法分析.exe

可执行程序名:编译原理 实验报告.exe

  1. 原理分析及流程图   
  2.  主要程序段及其解释:实现主要功能的程序段,重要的是程序的注释解释。
      1 #include <stdio.h>
      2 #include <string.h>
      3 
      4 char string[80],simbol[8],ch;
      5 int wordID,index,m,n,sum;
      6 char *rwtab[6]={"begin","if","then","while","do","end"};
      7 
      8 void scaner(void);
      9 
     10 main()
     11 {
     12     int index=0;
     13    // printf("\n lease inindexut a string(end with '#'):\n");
     14  printf("Please input string (end#):");
     15 
     16     do{
     17             scanf("%c",&ch);
     18             string[index++]=ch;
     19     }while(ch!='#');
     20 
     21     index=0;
     22     do{
     23             scaner();
     24             switch(wordID)
     25             {
     26                 case 11:
     27                     printf("( %-10d%5d )\n",sum,wordID);
     28                 break;
     29 
     30                 case -1:
     31                     printf("you have inindexut a wrong string\n");
     32                     //getch();
     33                     return 0;
     34                 break;
     35 
     36                 default:
     37                 printf("( %-10s%5d )\n",simbol,wordID);
     38                 break;
     39             }
     40         }while(wordID!=0);
     41     //getch();
     42  return 0;
     43  }
     44 
     45 void scaner(void)
     46 {
     47     sum=0;
     48 
     49     for(m=0;m<8;m++)
     50         simbol[m++]= NULL;
     51 
     52         ch=string[index++];
     53         m=0;
     54 
     55     while((ch==' ')||(ch=='\n'))
     56         ch=string[index++];
     57 
     58     if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
     59      {
     60         while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
     61         {
     62             simbol[m++]=ch;
     63             ch=string[index++];
     64         }
     65 
     66         index--;
     67         wordID=10;
     68 
     69         for(n=0;n<6;n++)
     70         if(strcmp(simbol,rwtab[n])==0)
     71         {
     72             wordID=n+1;
     73             break;
     74         }
     75      }
     76      else if((ch>='0')&&(ch<='9'))
     77      {
     78         while((ch>='0')&&(ch<='9'))
     79         {
     80             sum=sum*10+ch-'0';
     81             ch=string[index++];
     82         }
     83         index--;
     84         wordID=11;
     85     }
     86     else
     87     {
     88         switch(ch)
     89         {
     90         case '<':
     91             simbol[m++]=ch;
     92             ch=string[index++];
     93             if(ch=='=')
     94             {
     95                 wordID=22;
     96                 simbol[m++]=ch;
     97             }
     98             else
     99             {
    100                 wordID=20;
    101                 index--;
    102             }
    103         break;
    104 
    105         case '>':
    106             simbol[m++]=ch;
    107             ch=string[index++];
    108             if(ch=='=')
    109             {
    110                 wordID=24;
    111                 simbol[m++]=ch;
    112             }
    113             else
    114             {
    115                 wordID=23;
    116                 index--;
    117             }
    118         break;
    119 
    120         case '+':
    121             simbol[m++]=ch;
    122             ch=string[index++];
    123             if(ch=='+')
    124             {
    125                 wordID=17;
    126                 simbol[m++]=ch;
    127             }
    128             else
    129             {
    130                 wordID=13;
    131                 index--;
    132             }
    133         break;
    134 
    135         case '-':
    136             simbol[m++]=ch;
    137             ch=string[index++];
    138             if(ch=='-')
    139             {
    140                 wordID=29;
    141                 simbol[m++]=ch;
    142             }
    143             else
    144             {
    145                 wordID=14;
    146                 index--;
    147             }
    148         break;
    149 
    150         case '!':
    151             ch=string[index++];
    152             if(ch=='=')
    153             {
    154                 wordID=21;
    155                 simbol[m++]=ch;
    156             }
    157             else
    158             {
    159                 wordID=31;
    160                 index--;
    161             }
    162         break;
    163 
    164         case '=':
    165             simbol[m++]=ch;
    166             ch=string[index++];
    167             if(ch=='=')
    168             {
    169                 wordID=25;
    170                 simbol[m++]=ch;
    171             }
    172             else
    173             {
    174                 wordID=18;
    175                 index--;
    176             }
    177         break;
    178 
    179         case '*':
    180             wordID=15;
    181             simbol[m++]=ch;
    182         break;
    183 
    184         case '/':
    185             wordID=16;
    186             simbol[m++]=ch;
    187         break;
    188 
    189         case '(':
    190             wordID=27;
    191             simbol[m++]=ch;
    192         break;
    193 
    194         case ')':
    195             wordID=28;
    196             simbol[m++]=ch;
    197         break;
    198 
    199         case '{':
    200             wordID=5;
    201             simbol[m++]=ch;
    202         break;
    203 
    204         case '}':
    205             wordID=6;
    206             simbol[m++]=ch;
    207         break;
    208 
    209         case ';':
    210             wordID=26;
    211             simbol[m++]=ch;
    212         break;
    213 
    214         case '\"':
    215             wordID=30;
    216             simbol[m++]=ch;
    217         break;
    218 
    219         case '#':
    220             wordID=0;
    221             simbol[m++]=ch;
    222         break;
    223 
    224         case ':':
    225             wordID=17;
    226             simbol[m++]=ch;
    227         break;
    228 
    229         default:
    230             wordID=-1;
    231         break;
    232         }
    233     }
    234         simbol[m++]='\0';
    235 }

     

  3.    运行结果及分析

输入源代码:begin x:2; end#

符合个字符的单词码

    实验总结

学会编写一个简单的词法分析程序,利用词法分析程序分析源代码,逐个单词进行分析拆分,把标识符,保留字区分,并且能识别出空格,并把数据能从文件中读出来.

posted @ 2016-10-14 17:18  126刘畅  阅读(202)  评论(5编辑  收藏  举报