词法分析:
编制一个词法分析程序
对字符串表示的源程序,从左到右进行扫描和分解,根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用 发现词法错误,则返回出错信息。
各种单词符号对应的种别码。
#include<stdio.h> #include<string.h> 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++]=' '; 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("---------------------------------------- "); printf(" 编制一个词法分析程序 "); printf(" 要求: "); printf(" 输入:源程序字符串 "); printf(" 输出:二元组(种别,单词本身) "); printf("---------------------------------------- "); printf("请输入您要输入的字符: "); do//输入一段字符串 { ch=getchar(); str[p++]=ch; }while(ch!='#'); p=0; ch=str[0]; if(ch>='0'&&ch<='9') printf("错误! "); else { do { scanner(); switch(zbm) { case 11: printf("(%d,%d) ",11,sum); break; case -1: printf("错误! "); break; default: printf("(%d,%s) ",zbm,take); } }while(zbm!=0); } }