实验一:词法分析
实验一、词法分析实验
专业:计算机科学与技术 姓名:罗德广 学号:201506110204
一、实验目的
用C语言实现简单的词法分析程序;设计一个词法分析程序,加深对词法分析原理的理解 。
二、实验内容和要求
编写一个词法分析程序,使其能够识别对应的单词符号,并以(单词符号 种别码)的形式输出。
三、实验方法、步骤及结果测试
1.源程序名:压缩包文件(rar或zip)中源程序名 词法分析.c
可执行程序名:词法分析.exe
2.原理分析及流程图
3.主要程序段及其解释:
实现主要功能的程序段,重要的是程序的注释解释。
#include <stdio.h> #include <string.h> char a[80],s[8],ch; int q,p,m,n,sum; char *l[6]={"begin","if","then","while","do","end"}; //定义数组l,用于存放关键字 void scaner(void); main() { p=0; printf("\n请输入一个字符串(以'#'结尾):\n"); do{ scanf("%c",&ch); a[p++]=ch; }while(ch!='#'); p=0; do{ scaner(); switch(q) { case 11: printf("( %-10d%5d )\n",sum,q); break; case -1: printf("输入错误!\n"); //getch(); return 0; break; default: printf("( %-10s%5d )\n",s,q); break; } }while(q!=0); //getch(); } void scaner(void)//利用循环进行字符串的识别和比较 { sum=0; for(m=0;m<8;m++) s[m++]= NULL; ch=a[p++]; m=0; while((ch==' ')||(ch=='\n')) ch=a[p++]; if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))) { while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) { s[m++]=ch; ch=a[p++]; } p--; q=10; for(n=0;n<6;n++) if(strcmp(s,l[n])==0) { q=n+1; break; } } else if((ch>='0')&&(ch<='9')) { while((ch>='0')&&(ch<='9')) { sum=sum*10+ch-'0'; ch=a[p++]; } p--; q=11; } else { switch(ch) { case '<': s[m++]=ch; ch=a[p++]; if(ch=='=') { q=22; s[m++]=ch; } else { q=20; p--; } break; case '>': s[m++]=ch; ch=a[p++]; if(ch=='=') { q=24; s[m++]=ch; } else { q=23; p--; } break; case '+': s[m++]=ch; ch=a[p++]; if(ch=='+') { q=17; s[m++]=ch; } else { q=13; p--; } break; case '-': s[m++]=ch; ch=a[p++]; if(ch=='-') { q=29; s[m++]=ch; } else { q=14; p--; } break; case '!': ch=a[p++]; if(ch=='=') { q=21; s[m++]=ch; } else { q=31; p--; } break; case '=': s[m++]=ch; ch=a[p++]; if(ch=='=') { q=25; s[m++]=ch; } else { q=18; p--; } break; case '*': q=15; s[m++]=ch; break; case '/': q=16; s[m++]=ch; break; case '(': q=27; s[m++]=ch; break; case ')': q=28; s[m++]=ch; break; case '{': q=5; s[m++]=ch; break; case '}': q=6; s[m++]=ch; break; case ';': q=26; s[m++]=ch; break; case '\"': q=30; s[m++]=ch; break; case '#': q=0; s[m++]=ch; break; case ':': q=17; s[m++]=ch; break; default: q=-1; break; } } s[m++]='\0'; }
4.运行结果及分析
四、实验总结
数组a存放键盘输入的字符,数组l存放关键字。通过判断空格键来用数组s存放前面的字符,若前面的字符既出现字母又出现数字,则是标识符。反之就是关键字。然后通过数组s的字符串与前面定义l数组的字符串一一比较,输出所对应的种别码。