首页 > 代码库 > 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 实验一 词法分析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。