char prog[80],token[8]; char ch;int syn,p,m=0,n,row,sum=0;
char *rwtab[6]={\"begin\
void scaner() {
for(n=0;n<8;n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') { }
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) {
m=0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { }
token[m++]='\\0'; p--; syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0) {
token[m++]=ch; ch=prog[p++]; ch=prog[p]; p++;
}
}
syn=n+1; break;
else if((ch>='0'&&ch<='9')) { }
else switch(ch) {
{ } p--; syn=11; if(sum>32767)
syn=-1; sum=0;
while((ch>='0'&&ch<='9')) { }
sum=sum*10+ch-'0'; ch=prog[p++];
case'<':m=0;token[m++]=ch;
ch=prog[p++]; if(ch=='>') { }
else if(ch=='=') { } else
syn=22; token[m++]=ch; syn=21; token[m++]=ch;
{ } break;
syn=23; p--;
case'>':m=0;token[m++]=ch;
ch=prog[p++]; if(ch=='=') { } else { } break;
syn=20; p--; syn=24; token[m++]=ch;
case':':m=0;token[m++]=ch;
ch=prog[p++]; if(ch=='=') { } else { } break;
syn=17; p--; syn=18; token[m++]=ch;
case'*':syn=13;token[0]=ch;break; case'/':syn=14;token[0]=ch;break; case'+':syn=15;token[0]=ch;break;
case'-':syn=16;token[0]=ch;break; case'=':syn=25;token[0]=ch;break; case';':syn=26;token[0]=ch;break; case'(':syn=27;token[0]=ch;break; case')':syn=28;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; case'\\n':syn=-2;break; default: syn=-1;break; }
void main() {
p=0; row=1;
cout<<\"Please input string:\"<while(ch!='#'); p=0; do {scaner(); switch(syn) {
case 11: cout<<\"(\"<case -1: cout<<\"Error in row \"<case -2: row=row++;break;default: cout<<\"(\"<}}
}
while (syn!=0);
七、实验小结
词法分析的基本任务是从字符串表示的源程序中识别出具有意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解,让我了解到如何设计、编制并调试词法分析程序;熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言(例如C++语言)直接编写此法分析程序。另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。比如:main()函数中,用cin>>ch;语句得到ch值的话,给定源程序的结果第一行得到的是(10,beginx),因为得到的字符串中省略了空格,改用cin.get(ch);问题便解决了。