一、 实验目的
通过词法分析器,进一步了解词法之间的关系。
二、 实验内容和要求
将输入的字符串通过词法分析器一一识别出来,同时将该字符串或者字符并且和种别码一起输出来。
三、 实验方法、步骤及结果测试
- 源程序名:z.c
可执行程序名:z.exe
- 原理分析及流程图
采用数组存放数据,通过字符串的比较实现关键字的种别码输出
- 主要程序段及其解释:
int m=0;
sum=0;
char *r[7]={"begin","if","then","for","while","do","end"};//数组存放关键字
for(n=0;n<9;n++)
token[n]=' ';
ch=prog[p++];
while(ch==' ')
ch=prog[p++];
if(isalpha(ch)) /*ch为字母字符*/
{
while(isalpha(ch)||isdigit(ch)) /*ch 为字母字符或者数字字符*/
{
token[m++]=ch;
ch=prog[p++];}
token[m++]=' ';
ch=prog[p--];
syn=10;
for(n=0;n<7;n++)
if(strcmp(token,r[n])==0) /*字符串的比较*/
{
syn=n+1;
break;}}
else
if(isdigit(ch)) /*ch是数字字符*/
{
while(isdigit(ch)) /*ch是数字字符*/
{
sum=sum*10+ch-'0';
ch=prog[p++];}
ch=prog[p--];
syn=11;}
else
switch(ch){
case'<':m=0;token[m++]=ch;ch=prog[p++];
if(ch=='>'){
syn=21;
token[m++]=ch;}
else if(ch=='='){
syn=22;
token[m++]=ch;}
else{
syn=20;
ch=prog[p--];}
break;
case'>':m=0;token[m++]=ch;ch=prog[p++];
if(ch=='='){
syn=24;
token[m++]=ch;}
else{
syn=23;
ch=prog[p--];}
break;
case':':m=0;token[m++]=ch;ch=prog[p++];
if(ch=='='){
syn=18;
token[m++]=ch;}
else{
syn=17;
ch=prog[p--];}
break;
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=29;token[0]=ch;break;
case'#':syn=0;token[0]=ch;break;
default:syn=-1;}
我采用prog数组存放键盘输入的字符,用r数组存放关键字的数组。通过判断空格键来用token数组存放前面的字符,如果前面的字符既出现字母又出现数字,那么就是标识符。反而就是关键字。然后通过token数组的字符串与前面定义r数组的字符串一一比较,输出所对应的种别码。
- 运行结果及分析
四、 实验总结
在这次的实验中了解词法分析的过程,解决一些问题。在完成我的词法分析器的时候考虑到关键字固定的字符串,这就有利于字符串的比较,从而识别出对应的种别码。对于数字的采用sum=sum*10+ch-'0'一个字符’1’转换为数字需要减’0’才能得到对应的数字,因为数字有个十百千万的规则,因为读取数字字符的时候是从其他位开始读的,最后才读个位。比如123,先读1,然后1*10+2=12,然后12*10+3=123。