词法分析:
编制一个词法分析程序
对字符串表示的源程序,从左到右进行扫描和分解,根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用 发现词法错误,则返回出错信息。
各种单词符号对应的种别码。
#include#include char str[100];char take[8];//存放单词符号的字符串int sum;//存放整数型单词char ch;int zbm;//存放单词字符的种别码int i,p,m=0;//p是缓冲区str的指针,m是take的指针char *keyword[8]={"begin","if","then","while","do","end","l(l|d)*","dd*"};void scanner()//词法扫描程序{ /* for(i=0;i<8;i++) { take[i]=NULL; } ch=str[p++];*/ m=0; while(ch==' ') { ch=str[p++]; } if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//可能是标识符或者是变量名 { m=0; while(ch>='0'&&ch<='9'||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { take[m++]=ch; ch=str[p++]; } take[m++]='\0'; p--; zbm=10; for(i=0;i<6;i++)//将识别出的字符和已定义的标符进行比较 if(strcmp(keyword[i],take==0)) { zbm=i+1; break; } } else if(ch>='0'&&ch<='9') { sum=0; while(ch>='0'&&ch<='9') { sum=sum*10+ch-'0'; ch=str[p++]; } p--; zbm=11; } else { switch(ch) { case '+': zbm=13; take[0]=ch; ch=str[p++]; break; case '-': zbm=14; take[0]=ch; ch=str[p++]; break; case '*': zbm=15; take[0]=ch; ch=str[p++]; break; case '/': zbm=16; take[0]=ch; ch=str[p++]; break; case '<': m=0; take[m++]=ch; ch=str[p++]; if(ch=='>') { zbm=21; take[m++]=ch; } else if(ch=='=') { zbm=22; take[m]=ch; } else zbm=20; break; case '>': take[0]=ch; ch=str[p++]; if(ch=='=') { zbm=24; take[0]=ch; } else zbm=23; break; case ':': take[0]=ch; ch=str[p++]; if(ch=='=') { zbm=18; take[m++]=ch; ch=str[p++]; } else zbm=17; break; case '=': zbm=25; take[0]=ch; ch=str[p++]; break; case ';': zbm=26; take[0]=ch; ch=str[p++]; break; case '(': zbm=27; take[0]=ch; ch=str[p++]; break; case ')': zbm=28; take[0]=ch; ch=str[p++]; break; case '#': zbm=0; take[0]=ch; ch=str[p++]; break; default: zbm=-1; } }}main(){ int n,i; printf("----------------------------------------\n"); printf("\t编制一个词法分析程序\n\n"); printf("\t要求:\n"); printf("\t输入:源程序字符串\n"); printf("\t输出:二元组(种别,单词本身)\n"); printf("----------------------------------------\n\n"); printf("请输入您要输入的字符:\n"); do//输入一段字符串 { ch=getchar(); str[p++]=ch; }while(ch!='#'); p=0; ch=str[0]; if(ch>='0'&&ch<='9') printf("错误!\n"); else { do { scanner(); switch(zbm) { case 11: printf("(%d,%d)\n",11,sum); break; case -1: printf("错误!\n"); break; default: printf("(%d,%s)\n",zbm,take); } }while(zbm!=0); }}