char prog[81],token[8],ch,tmp; int syn,p,m,n,sum,rows;
char *rwtab[6]={\"begin\void scaner(); void main() {
FILE *out; FILE *in;
rows=1;
if((out=fopen(\"d:\\\\output.txt\{printf(\"\\non error buiding d:\\\\output.txt\\n\"); getch(); exit(1); }
if((in=fopen(\"d:\\\\input.txt\{printf(\"\\nConn't found d:\\\\input.txt\\n\"); getch(); exit(1);
}/* printf(\"\\n please input a string(end with '#'):\\n\");*/ rewind(in); rewind(out);
fprintf(out,\"%-5s%-10s%-5s%5s\\n\do{ p=0; do
{ /*scanf(\"%c\ if(p==80)
{printf(\"\\non error colunm's length more than 80!\\n\"); getch(); exit(1); }
ch=fgetc(in); prog[p++]=ch;
}while(ch!=EOF&&ch!='\\n'); prog[p]='#'; tmp=ch; p=0; do{
scaner(); switch(syn)
{case 11:fprintf(out,\"%-5d%-10d%-5d%5d\\n\ break;
case -1:printf(\"you have input a wrong string,rows cols=(%d,%d)\\n\ getch(); exit(0);
default:if(syn!=0) fprintf(out,\"%-5d%-10s%-5d%5d\\n\ break; }
}while(syn!=0);
if(tmp=='\\n') rows++; }while(ch!=EOF); fclose(in); fclose(out);
}
void scaner() { sum=0;
for(m=0;m<8;m++)token[m++]=NULL; ch=prog[p++]; m=0;
while((ch==' ')||(ch=='\\n'))ch=prog[p++];
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{ while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) { token[m++]=ch; ch=prog[p++]; } p--; syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } }
else if((ch>='0')&&(ch<='9')) { while((ch>='0')&&(ch<='9')) { sum=sum*10+ch-'0'; ch=prog[p++]; } p--; syn=11; }
else switch(ch)
{ case '<':token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=22;
token[m++]=ch; } else
{ syn=20; p--; } break;
case '>':token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24;
token[m++]=ch; } else
{ syn=23; p--; } break;
case '+': token[m++]=ch; ch=prog[p++]; if(ch=='+') { syn=17;
token[m++]=ch; } else
{ syn=13;
p--; } break;
case '-':token[m++]=ch; ch=prog[p++]; if(ch=='-') { syn=29;
token[m++]=ch; } else
{ syn=14; p--; } break;
case '!':ch=prog[p++]; if(ch=='=') { syn=21;
token[m++]=ch; } else
{ syn=31; p--; } break;
case '=':token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=25;
token[m++]=ch; } else
{ syn=18; p--; } break;
case '*': syn=15; token[m++]=ch; break;
case '/': syn=16; token[m++]=ch; break;
case '(': syn=27; token[m++]=ch; break;
case ')': syn=28; token[m++]=ch; break;
case '{': syn=5; token[m++]=ch; break;
case '}': syn=6; token[m++]=ch; break;
case ';': syn=26; token[m++]=ch; break;
case '\\\"': syn=30;
token[m++]=ch; break;
case EOF:syn=0;break; case '#': syn=0; break; case ':':syn=17; token[m++]=ch; break;
default: syn=-1; break; }
token[m++]='\\0';
} 五、结果分析:
运行程序,加载input.txt文档(begin x:=9: if x>9 then x:=2*x+1/3; end # )后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2)…… 如图5-1所示:
图5-1
六、总结:
词法分析的基本任务是从字符串表示的源程序中识别出具有意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。