📄 1926126.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int i,j,k,flag,number,state;
/*status 用于标识是否为关键字,1表示是关键字,0表示否!*/
char ch;
char line[10] = {" "}; //缓冲区,用来存放输入的字母
char program[500]; //program是一个字符型的数组,包括字母,空格,界符,常数,运算符,
int Scan(char program[])
{
char *keywords[14] = {"void","main","if","else","then","break","int",
"char","float","include","for","while","printf", "scanf"}; //C语言中的关键字
number = 0;
state = 0;
j = 0;
ch = program[i++];
/* To handle the lettle space and stab*/
/*处理字母*/
if ((ch >= 'a') && (ch <= 'z' ))
{
while ((ch >= 'a') && (ch <= 'z' ))
{
line[j++]=ch; //将第一个字母存入缓冲区
ch=program[i++]; //program是输入的程序,现在是在对program进行扫描
}
i--;
line[j++] = '\0';
for (k = 0; k < 14; k++)
if (strcmp (line,keywords[k]) == 0) //判断第一个字符串是否是关键字
switch(k)
{
case 0:
{
flag = 1;
state = 1;
break;
}
case 1:
{
flag = 2;
state = 1;
break;
}
case 2:
{
flag = 3;
state = 1;
break;
}
case 3:
{
flag = 4;
state = 1;
break;
}
case 4:
{
flag = 5;
state= 1;
break;
}
case 5:
{
flag = 6;
state= 1;
break;
}
case 6:
{
flag = 7;
state = 1;
break;
}
case 7:
{
flag = 8;
state = 1;
break;
}
case 8:
{
flag = 9;
state= 1;
break;
}
case 9:
{
flag = 10;
state = 1;
break;
}
case 10:
{
flag = 11;
state = 1;
break;
}
case 11:
{
flag = 12;
state = 1;
break;
}
case 12:
{
flag = 13;
state = 1;
break;
}
case 13:
{
flag=14;
state=1;
break;
}//flag 从1~14为关键字的范围
}
if (state == 0)
{
flag = 100; //flag 为100说明不是关键字
}
} //到此对关键字处理完成
/*处理数值*/
else if ((ch >= '0') && (ch <= '9'))
{
number = 0;
while ((ch >= '0' ) && (ch <= '9' ))
{
number = number*10+(ch-'0');
ch = program[i++];
}
flag = 200;
i--;
} //对数字处理完,flag为200表明是数字
/*运算符和界符的处理*/
else switch (ch)
{
case '=': //对=,==的判断
{
if (ch == '=')
line[j++] = ch;
line[j] = '\0';
ch = program[i++];
if (ch == '=')
{
line[j++] = ch;
line[j] = '\0';
flag = 401; //对program中的字符的标志为???
} //对“==”的处理
else
{
i--;
flag = 402;
}
break;
}
case'>': //对>,>=的处理
{
if (ch == '>')
line[j++] = ch;
line[j] = '\0'; //在字符串的末尾加0为了字符串的输出
ch = program[i++];
if (ch == '=')
{
line[j++] = ch;
line[j] = '\0';
flag = 403;
}
else
{
i--;
flag = 404;
}
break;
}
/*判断<,<=*/
case'<':
{
if (ch == '<')
line[j++] = ch;
line[j] = '\0';
ch = program[i++];
if (ch == '=')
{
line[j++] = ch;
line[j] = '\0';
flag = 405;
}
else
{
i--;
flag = 406;
}
break;
}
case'!':
{
if (ch == '!')
line[j++] = ch;
line[j] = '\0';
ch = program[i++];
if (ch == '=')
{
line[j++] = ch;
line[j] = '\0';
flag = 407;
}
else
{
i--;
flag = 408;
}
break;
}
case'+':
{
if (ch == '+')
line[j++] = ch;
line[j] = '\0';
ch = program[i++];
if (ch == '=')
{
line[j++] = ch;
line[j] = '\0';
flag = 409;
}
else if (ch == '+')
{
line[j++] = ch;
line[j] = '\0';
flag = 410;
}
else
{
i--;
flag = 411;
}
break;
}
case'-':
{
if (ch == '-')
line[j++] = ch;
line[j] = '\0';
ch = program[i++];
if (ch == '=')
{
line[j++] = ch;
line[j] = '\0';
flag = 412;
}
else if( ch == '-')
{
line[j++] = ch;
line[j] = '\0';
flag = 413;
}
else
{
i--;
flag = 414;
}
break;
}
case'*':
{
if (ch == '*')
line[j++] = ch;
line[j] = '\0';
ch = program[i++];
if (ch == '=')
{
line[j++] = ch;
line[j] = '\0';
flag = 415;
}
else
{
i--;
flag = 416;
}
break;
}
case'/':
{
if (ch == '/')
line[j++] = ch;
line[j] = '\0';
ch = program[i++];
if (ch == '=')
{
line[j++] = ch;
line[j] = '\0';
flag = 417;
}
else
{
i--;
flag = 418;
}
break;
} //flag从401到418为运算符的范围
//对界符进行处理,flag从501到513为界符的范围
case';':
{
line[j] = ch;
line[j+1] = '\0';
flag = 501;
break;
}
case'(':
{
line[j] = ch;
line[j+1] = '\0';
flag = 502;
break;
}
case')':
{
line[j] = ch;
line[j+1] = '\0';
flag = 503;
break;
}
case'[':
{
line[j] = ch;
line[j+1] = '\0';
flag = 504;
break;
}
case']':
{
line[j] = ch;
line[j+1] = '\0';
flag = 505;
break;
}
case'{':
{
line[j] = ch;
line[j+1] = '\0';
flag = 506;
break;
}
case'}':
{
line[j] = ch;
line[j+1] = '\0';
flag = 507;
break;
}
case':':
{
line[j] = ch;
line[j+1] = '\0';
flag = 508;
break;
}
case'"':
{
line[j] = ch;
line[j+1] = '\0';
flag = 509;
break;
}
case'%':
{
if (ch == '%')
line[j++] = ch;
line[j] = '\0';
ch = program[i++];
if (ch == '=')
{
line[j++] = ch;
line[j] = '\0';
flag = 510;
}
else
{
i--;
flag = 511;
}
break;
}
case',':
{
line[j] = ch;
line[j+1] = '\0';
flag = 512;
break;
}
case'.':
{
line[j]=ch;
line[j+1]='\0';
flag=513;
break;
}
case'#':
{
line[j] = ch;
line[j+1] = '\0';
flag = 513;
break;
}
case'$':
{
line[j] = '#';
flag = 0;
break;
} //程序输入结束
//虑空格,回车,TAB
case' ':
{
line[j]=ch;
line[j+1]='\0';
flag=555;
break;
}
case'\n':
{
line[j]=ch;
line[j+1]='\0';
flag=556;
break;
}
case 9:
{
line[j]=ch;
flag=557;
break;
}
default:
{
flag = -1;
break;
}
}
return flag;
}
void main()
{
i=0;
printf("请输入程序并以$做为结束输入完成的标志:\n");
do
{
ch = getchar();
program[i++] = ch;
}while(ch != '$');
i = 0;
do{
flag = Scan(program);
if (flag == 200)
{
printf("(%d,%d)\n",flag,number);
}
else if (flag == -1)
{
printf("(%d,error)\n",flag);
}
else
{
printf("(%d,%s)",flag,line);
}
}while (flag != 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -