📄 1.cpp
字号:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int i,j,k,flag,number,status,end=0,pro=0;
char ch;
char words[10] = {" "};
char program[500];
int Scan(char program[])
{
char *keywords[5] = {"if","then","else","while","do"};
int m=0;
end=0;
number = 0;
status = 0; /* zhongbie */
j = 0;
ch = program[i++];
/*id*/
if(ch==' ') /*将空格去掉*/
{
while(ch==' ')
ch=program[i++];
}
if ((ch >= 'a') && (ch <= 'z' ))
{
for(m=0;m<=9;m++)
words[m]=NULL;
while ((ch >= 'a') && (ch <= 'z' ))
{
words[j++]=ch;
ch=program[i++];
}
if(ch=='@')
{ /*纯字母的单词,且已结束*/
end=1;
i--;
}
else while((ch!=' ')&&(ch!='+')&&(ch!='-')&&(ch!='*')&&(ch!='/')&&(ch!='(')&&(ch!=')')&&(ch!='=')&&(ch!='<')&&(ch!='>'))/*还有其他字符,放到words,直到这个字符串结束*/
{
words[j++]=ch;
ch=program[i++];
if(ch=='@')
{
end=1;
i--;
break;
}
}
i--;
words[j] = '\0';
for (k = 0; k < 4; k++)
if (strcmp (words,keywords[k]) == 0) /*判断是否是关键字*/
switch(k)
{
case 0:{
flag = 1;
status = 1;
pro=1;
break;
}
case 1:{
flag = 2;
status = 1;
pro=1;
break;
}
case 2:{
flag = 3;
status = 1;
pro=1;
break;
}
case 3:{
flag = 4;
status = 1;
pro=1;
break;
}
case 4:{
flag = 5;
status = 1;
pro=1;
break;
}
}
if (status == 0) /* 是标识符 */
{
flag = 100; /* 其他标识符的种别 */
pro=2;
}
words[j] = '\0';
}
/* digits*/
else if(ch=='0')
{
for(m=0;m<=9;m++)
words[m]=NULL;
words[j++]=ch;
ch=program[i++];
if((ch=='=')||(ch==' ')||(ch=='+')||(ch=='-')||(ch=='*')||(ch=='/')||(ch=='(')||(ch==')')||(ch=='<')||(ch=='>'))
{
flag=200;
number=0;
}
else if(ch=='@')
{
flag=200;
number=0;
end=1;
i--;
}
else if((ch>='1')&&(ch<='7'))/*判断8进制数*/
{
words[j++]=ch;
ch=program[i++];
while((ch>='0' ) && (ch<= '7' ))
{
words[j++]=ch;
ch = program[i++];
}
if((ch=='=')||(ch==' ')||(ch=='+')||(ch=='-')||(ch=='*')||(ch=='/')||(ch=='(')||(ch==')')||(ch=='<')||(ch=='>'))
flag = 800;
else if(ch=='@')
{
i--;
flag=800;
end=1;
}
else{
while((ch!='=')&&(ch!=' ')&&(ch!='+')&&(ch!='-')&&(ch!='*')&&(ch!='/')&&(ch!='(')&&(ch!=')')&&(ch!='<')&&(ch!='>'))
{
ch=program[i++];
if(ch=='@')
{
i--;
end=1;
break;
}
}
i--;
flag=-1;
}
words[j] = '\0';
}
/*else{
while(ch!=' ')
{
ch=program[i++];
if(ch=='@')
{
i--;
end=1;
break;
}
}
flag=-1;
}
*/
else if(ch=='x')/*判断16进制数*/
{
words[j++]=ch;
ch=program[i++];
if(((ch>='0' ) && (ch<= '9' ))||((ch>= 'a')&&(ch<= 'f')))/*0x后是正确字符*/
{
words[j++]=ch;
ch=program[i++];
while(((ch>='0' ) && (ch<= '9' ))||((ch>= 'a')&&(ch<= 'f')))/*进一步判断是否是16进制数*/
{
words[j++]=ch;
ch = program[i++];
}
if((ch=='=')||(ch==' ')||(ch=='+')||(ch=='-')||(ch=='*')||(ch=='/')||(ch=='(')||(ch==')')||(ch=='<')||(ch=='>'))
{
flag = 1600;
i--;
}
else if(ch=='@')
{
i--;
flag=1600;
end=1;
}
else{
while((ch!='=')&&(ch!=' ')&&(ch!='+')&&(ch!='-')&&(ch!='*')&&(ch!='/')&&(ch!='(')&&(ch!=')')&&(ch!='<')&&(ch!='>'))
{
ch=program[i++];
if(ch=='@')
{
i--;
end=1;
break;
}
}
i--;
flag=-1;
}
}
else/*0x后是其他字符则错误*/
{
while((ch!='=')&&(ch!=' ')&&(ch!='+')&&(ch!='-')&&(ch!='*')&&(ch!='/')&&(ch!='(')&&(ch!=')')&&(ch!='<')&&(ch!='>'))
{
ch=program[i++];
if(ch=='@')
{
i--;
end=1;
break;
}
}
i--;
flag=-1;
}
}
else{
while((ch!='=')&&(ch!=' ')&&(ch!='+')&&(ch!='-')&&(ch!='*')&&(ch!='/')&&(ch!='(')&&(ch!=')')&&(ch!='<')&&(ch!='>'))
{
ch=program[i++];
if(ch=='@')
{
i--;
end=1;
break;
}
}
i--;
flag=-1;
}
words[j] = '\0';
}
else if ((ch > '0') && (ch <= '9'))/*判断10进制数*/
{
for(m=0;m<=9;m++)
words[m]=NULL;
number = 0;
while ((ch >= '0' ) && (ch <= '9' ))
{
words[j++]=ch;
number = number*10+(ch-'0');
ch = program[i++];
}
i--;
if((ch=='=')||(ch==' ')||(ch=='+')||(ch=='-')||(ch=='*')||(ch=='/')||(ch=='(')||(ch==')')||(ch=='<')||(ch=='>'))
flag = 200;
else if(ch=='@')
{
flag=200;
end=1;
}
else{
while((ch!='=')&&(ch!=' ')&&(ch!='+')&&(ch!='-')&&(ch!='*')&&(ch!='/')&&(ch!='(')&&(ch!=')')&&(ch!='<')&&(ch!='>'))
{
words[j++]=ch;
ch=program[i++];
if(ch=='@')
{
end=1;
i--;/*此时的program[i]=='@'*/
break;
}
}
i--;
flag=-1;
}
words[j] = '\0';
}
/*opereation*/
else
{
for(m=0;m<=9;m++)
words[m]=NULL;
switch(ch){
case'+':{
if (ch == '+')
words[j++] = ch;
words[j] = '\0';
flag = 411;
pro=3;
break;
}
case'-':{
if (ch == '-')
words[j++] = ch;
words[j] = '\0';
flag = 414;
pro=3;
break;
}
case'*':{
if (ch == '*')
words[j++] = ch;
words[j] = '\0';
flag = 416;
pro=3;
break;
}
case'/':{
if (ch == '/')
words[j++] = ch;
words[j] = '\0';
flag = 418;
pro=3;
break;
}
case'>':{
if (ch == '>')
words[j++] = ch;
words[j] = '\0';
flag = 404;
pro=3;
break;
}
case'<':{
if (ch == '<')
words[j++] = ch;
words[j] = '\0';
flag = 405;
pro=3;
break;
}
case'=':{
if (ch == '=')
words[j++] = ch;
words[j] = '\0';
flag = 402;
pro=3;
break;
}
case'(':{
if (ch == '(')
words[j++] = ch;
words[j] = '\0';
flag = 502;
pro=3;
break;
}
case')':{
if (ch == ')')
words[j++] = ch;
words[j] = '\0';
flag = 503;
pro=3;
break;
}
case';':{
if (ch == ';')
words[j++] = ch;
words[j] = '\0';
flag = 501;
pro=3;
break;
}
case'@':{
words[j++] = '#';
words[j] = '\0';
flag = 0;
end = 1;
pro=3;
break;
}
default:{
flag = -1;
break;
}
}
}
return flag;
}
main()
{
i=0;
printf("please input a program");
do
{
ch = getchar();
program[i++] = ch;
}while(ch != '@');
i = 0;
do{
flag = Scan(program);
if (flag == 200)
{
printf("(INT10,%2d,%d)",flag,number);
}
else if (flag == -1)
{
printf("(%d,error)",flag);
}
else if(flag==800)
{
printf("(INT8,%2d,%4s)",flag,words);
}
else if(flag==1600)
{
printf("(INT16,%2d,%4s)",flag,words);
}
else
{
if(pro==1)
printf("(ORDER,%2d,%4s)",flag,words);
else if(pro==2)
printf("(ID,%2d,%4s)",flag,words);
else if(pro==3)
printf("(OPREATION,%2d,%4s)",flag,words);
else printf("(others,%2d,%4s)",flag,words);
pro=0;
}
}while (end != 1);
system("pause");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -