首页 > 代码库 > 0930 实验一 词法分析

0930 实验一 词法分析

 

一.实验目的: 编写一个词法分析程序

二.实验要求: ①输入源程序字符串 ②输出二元组(种别,单词符号本身)

三.各种单词符号对应的种别码(删减版)

技术分享

四.程序代码

 

  1 #include<stdio.h>  2 #include<string.h>  3 void F(char c,char b);  4 void word(char a[]);  5 void number(char a[]);  6 int i; //定义全局变量i  7 int s=1; //用来记录是否存在非法字符  8 main(){  9        char a[50]; 10        printf("请输入需要分析的字符串:"); 11        gets(a); 12        printf("您要分析的字符串为:"); 13        printf("%s",a); 14        printf("\n"); 15        for(i=0;(a[i]!=\0)&&(i<50)&&s==1;i++){ 16        if((a[i]>=a && a[i]<=z)||(a[i]>=A && a[i]<=Z)) 17        word(a); 18        else if(a[i]>=0 && a[i]<=9) 19        number(a); 20        else 21        F(a[i],a[i+1]); 22        } 23        printf("\n"); 24 } 25  26 void number(char a[]) //对数字字符进行扫描分析 27 { 28        char b[50]; 29        int m,k=0,t; 30        m=i; 31        while(a[m]>=0 && a[m]<=9)  32        { 33        b[k]=a[m]; //用数组b存放数组a中的数字 34        k++; 35        m++; 36        } 37        i=m-1; 38        printf("(11,"); 39        for(t=0;t<k;t++) 40        printf("%c",b[t]); 41        printf(")"); 42        printf("\n"); 43 } 44  45 void word(char a[]) //对字母字符进行扫描分析,并识别保留字 46 { 47 int k=0,m,flag=0,t; 48 char b[50]; 49 char *key[6]={"begin","if","then","while","do","end"}; 50 m=i; 51 while((a[m]>=a&&a[m]<=z)||(a[m]>=A&&a[m]<=Z)) //用数组b存放数组a中的字母 52 { 53     b[k]=a[m];  54     k++; 55     m++; 56     b[k]=\0;  57 } 58     i=m-1; 59     for(t=0;t<6;t++) 60     { 61     if(strcmp(b,key[t])==0) //将数组b与关键字进行比较 62     { 63     printf("(%d,%s)",t+1,key[t]); //输出关键字 64     flag=1; 65     printf("\n"); 66 } 67 } 68     if(flag==0) 69 { 70     printf("(10,%s)",b); //输出标识符 71     printf("\n"); 72 } 73 } 74 void F(char c,char b) //对特殊字符进行扫描分析 75 { 76     switch(c){ 77       case +: 78              printf("(13,+)\n"); 79              break; 80  81       case -: 82              printf("(14,-)\n"); 83              break; 84  85       case *: 86              printf("(15,*)\n"); 87              break; 88  89       case /: 90              printf("(16,/)\n"); 91              break; 92  93       case :: 94              if(b===) 95              { 96               i++; 97               printf("(18,:=)\n"); 98              } 99              else100               printf("(17,:)\n");101              break;102 103        case  :104              break;105 106        case <:107              if(b==>)108              {109                i++;110                printf("(21,<>)\n");111              }112              else if(b===)113              {114               i++;115               printf("(22,<=)\n");116              }117              else118              printf("(20,<)\n");119              break;120 121       case >:122              if(b===)123              {124              printf("(24,>=)\n");125              i++;126              }127              else128              printf("(23,>)\n");129              break;130 131       case =:132              printf("(25,=)\n");133              break;134 135       case ;:136              printf("(26,;)\n");137              break;138 139       case (:140              printf("(27,()\n");141              break;142 143       case ):144              printf("(28,))\n");145              break;146 147       case #:148              printf("(0,#)\n");149              break;150 151 152 default:153 {154 printf("\n存在字符 ‘%c‘,无法继续识别!\n",c);155 s=0; //用s=0记录存在非法字符156 break;157 }158 }159 }

 

五.程序结果

技术分享

 

 

六.个人心得:

通过存储输入的字符串,用循环的方式逐个提取出来与种别码比较,然后进行输出。

本人觉得该实验难点在于如何让程序自动识别“ ”与“#”等特殊方式,以及循环的跳出条件

0930 实验一 词法分析