0930 实验一 词法分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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              else
100               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              else
118              printf("(20,<)\\n");
119              break;
120 
121       case >:
122              if(b===)
123              {
124              printf("(24,>=)\\n");
125              i++;
126              }
127              else
128              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 实验一 词法分析的主要内容,如果未能解决你的问题,请参考以下文章

编译原理 实验一 java语言实现对C语言词法分析

实验一 词法分析器+编译原理

201506110135陈若倩词法分析实验报告

实验一

实验词法分析实验

实验一 词法分析实验报告