一、 实验目的
掌握词法分析的设计方法。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、界符五大类。
二、 实验内容和要求
读取键盘输入的字符,读取后进行词法分析判断输入的字符是关键字、标识符、常数、运算符、界符中的哪一类。
三、 实验方法、步骤及结果测试
- 1. 源程序名:词法分析.c
可执行程序名:词法分析.exe
- 2. 原理分析及流程图
将关键字、标识符、常数、运算符、界符保存在二维数组当中,在输入字符之后,进行分析,先判断是否为常数,当输入的字符不为常数时,再进一步进行分析,判断是否是保存在二维数组中的字符,如果也不是保存在二维数组中的字符时,即为标识符,如果是二维数组中的字符时,则返回word[i][1]中的i值到主函数,进行判断是关键字、常数、运算符、界符中的哪一类。
1. 主要程序段及其解释:
1 #include<stdio.h> 2 3 #include<string.h> 4 5 #define Max 100 6 7 int number(char str[],int i,int N);//判断输入的字符是不是常数// 8 9 int Ana(char str[]);//判断输入的字符是不是保存的关键字、标识符、常数、运算符、界符// 10 11 char *word[Max][1]={"#","begin","if","then","do","end","while","l(l|d)*","dd*","+","-","*","/",":",":=","<","<=",">",">=","=",";","(",")","[","]","{","}"}; 12 13 //用二维数组保存关键字、标识符、常数、运算符、界符// 14 15 char str[Max]; 16 17 main() 18 19 { 20 21 int j,i=0,x; 22 23 printf("输入要进行分析的词(输入#时结束)"); 24 25 do 26 27 { 28 29 scanf("%s",str); 30 31 if(strcmp(str,"#")==0)//当输入的字符为#时,结束程序// 32 33 break; 34 35 j=number(str,i,strlen(str));//调用number函数,判断输入的字符是不是常数// 36 37 if(j==1) 38 39 printf("%s 是数字 ",str); 40 41 else if(j==0) 42 43 { 44 45 x=Ana(str);//调用Ana函数,判断输入的字符是不是保存的关键字、标识符、常数、运算符、界符// 46 47 if(x>=1&&x<=7)//当Ana函数返回的值为1~7时,输入的字符为关键字// 48 49 { 50 51 printf("%s 是关键字 ",str); 52 53 } 54 55 else if(x>7&&x<=18)//当Ana函数返回的值为8~18时,输入的字符为运算符// 56 57 { 58 59 printf("%s 是运算符 ",str); 60 61 } 62 63 else if(x>18&&x<=26)//当Ana函数返回的值为19~26时,输入的字符为界符// 64 65 { 66 67 printf("%s 是界符 ",str); 68 69 } 70 71 else//当Ana函数返回的值不是1~26的任意一个数字时,输入的字符为标识符// 72 73 { 74 75 printf("%s 是标识符 ",str); 76 77 } 78 79 } 80 81 getchar(); 82 83 }while(strcmp(str,"#")!=0); 84 85 printf("程序结束! "); 86 87 } 88 89 int number(char str[],int i,int N) 90 91 { 92 93 if(i==N) 94 95 return 1;//当i与字符的长度相等时返回1// 96 97 if(str[i]>47&&str[i]<58) 98 99 { 100 101 number(str,i+1,N);//当str[i]为0~9的数字时,进行递归// 102 103 } 104 105 else 106 107 return 0;//当str[i]不再为0~9的数字时,返回0// 108 109 } 110 111 int Ana(char str[]) 112 113 { 114 115 int i; 116 117 for(i=1;i<26;i++) 118 119 { 120 121 if(strcmp(str,word[i][1])==0) 122 123 return i;//当str与二维数组保存的字符相同时,返回i的值// 124 125 } 126 127 return 0;//如果str与二维数组保存的字符没有相同的字符时,返回0// 128 129 }
2. 运行结果及分析
四、 实验总结
在本次实验中,我对编译原理有了进一步的了解,实验过程中对于字符的输入和对输入的字符的分析欠缺了考虑,在同学的帮助下进行了修正,在多次调试和改进后,最终完善了程序,在修改的过程中,学习过的知识得到了巩固和补充。