📄 aa.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int i,j,k,sign,number,flag;/*把类号内码等定义成全局变量*/
char ch;/*定义程序可以处理的关键字*/
char words[10]={" "};/*定义一个符号表*/
char program[500]; //用于保存源程序的字符数组
int scan(char program[]) /*扫描器*/
{
char*keywords[]={"auto","break","case","char","const","continue","default","do","double",
"else", "enum","extern","float","for","goto", "if","int","long","register","return",
"short","signed","sizeof","static","struct","switch","typedef","union","unsigned","void", "volatile","while"};
number=0;
flag=0;
j=0;
ch=program[i++];
/*处理空格与制表符回车*/
while((ch==' ')||(ch=='\n')||(ch=='\t')||(ch=='\r')) ch=program[i++];
/*处理字母*/
if((ch>='a')&&(ch<='z')||(ch>='A')&&(ch<='Z'))
{
while((ch>='a')&&(ch<='z')||(ch>='A')&&(ch<='Z'))
{
words[j++]=ch;
ch=program[i++];
}
words[j++]='\0';
for(k=0;k<32;k++)
if(strcmp(words,keywords[k])==0)
switch(k) //处理相应的字母并生成相应的类号或内码并加到符号表中
{
case 0:
sign=1;flag=1;break; //设置类号与内码的值在下面的程序中用
case 1:
sign=2;flag=1;break;
case 2:
sign=3;flag=1;break;
case 3:
sign=4;flag=1;break;
case 4:
sign=5;flag=1;break;
case 5:
sign=6;flag=1;break;
case 6:
sign=7;flag=1;break;
case 7:
sign=8;flag=1;break;
case 8:
sign=9;flag=1;break;
case 9:
sign=10;flag=1;break;
case 10:
sign=11;flag=1;break;
case 11:
sign=12;flag=1;break;
case 12:
sign=13;flag=1;break;
case 13:
sign=14;flag=1;break;
case 14:
sign=15;flag=1;break;
case 15:
sign=16;flag=1;break;
case 16:
sign=17;flag=1;break;
case 17:
sign=18;flag=1;break;
case 18:
sign=19;flag=1;break;
case 19:
sign=20;flag=1;break;
case 20:
sign=21;flag=1;break;
case 21:
sign=22;flag=1;break;
case 22:
sign=23;flag=1;break;
case 23:
sign=24;flag=1;break;
case 24:
sign=25;flag=1;break;
case 25:
sign=26;flag=1;break;
case 26:
sign=27;flag=1;break;
case 28:
sign=29;flag=1;break;
case 29:
sign=30;flag=1;break;
case 30:
sign=31;flag=1;break;
case 31:
sign=32;flag=1;break;
}
if (flag==0)
{
i--;sign=100;
}
}
/*处理常数*/
else if((ch>='0')&&(ch<='9'))
{
number=0;
while((ch>='0')&&(ch<='9')||ch=='.')
{
number=number*10+(ch-'0');
ch=program[i++]; //把识别出的常数并加到符号表中
}
sign=200;i--; //数字的类号设置为200
}
/*处理运算符号*/
else switch(ch)
{
case'=':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=401;
}
else
{
i--;
sign=402;
}
break;
case'>':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=403;
}
else
{
i--;
sign=404;
}
break;
case'<':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=405;
}
else
{
i--;
sign=406;
}
break;
case'!':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=407;
}
else
{
i--;
sign=408;
}
break;
case'+':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=409;
}
if(ch=='+')
{
words[j++]=ch;
sign=410;
}
else
{
i--;
sign=411;
}
break;
case'-':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=412;
}
else if(ch=='-')
{
words[j++]=ch;
sign=413;
}
else
{
i--;
sign=414;
}
break;
case'*':
words[j++]=ch;
sign=415;
break;
case'/':
words[j++]=ch;
sign=415;
break;
case';':
words[j++]=ch;
sign=501;
break;
case'(':
words[j++]=ch;
sign=502;
break;
case')':
words[j++]=ch;
sign=503;
break;
case'[':
words[j++]=ch;
sign=504;
break;
case']':
words[j++]=ch;
sign=505;
break;
case'{':
words[j++]=ch;
sign=506;
break;
case'}':
words[j++]=ch;
sign=507;
break;
case':':
words[j++]=ch;
sign=508;
break;
case'"':
words[j++]=ch;
sign=509;
break;
case'%':
words[j++]=ch;
sign=510;
break;
case',':
words[j++]=ch;
sign=511;
break;
case'#':
words[j++]=ch;
sign=512;
break;
case'@':
words[j++]=ch;
sign=0;
break;
case'.':
words[j++]=ch;
sign=513;
break;
case'\'':
words[j++]=ch;
sign=514;
break;
case'\\':
words[j++]=ch;
ch=program[i++];
if(ch=='0')
{
words[j++]=ch;
sign=515;
}
else if(ch=='n')
{
words[j++]=ch;
sign=516;
}
else if(ch=='r')
{
words[j++]=ch;
sign=517;
}
while(ch>='1'&&ch<='7')
{
words[j++]=ch;
ch=program[i++];
sign=518;
}
if(ch=='x'||ch=='X')
{ words[j++]=ch;
ch=program[i++];
while(ch>='1'&&ch<='9'||ch>='a'&&ch<='f'||ch>='A'&&ch<='F')
{
words[j++]=ch;
ch=program[i++];
sign=519;
}}break;
default:
sign=-1;
}
words[j]='\0';
return sign;
return number;
}
void main() /*主函数*/
{
//源程序输入
FILE *fp;
printf("★★★★★★★★★★★★★\n");
if((fp=fopen("kkk.txt","r"))==NULL)
{
printf("cannot open\n");
exit(0);
}
i=0;
do
{
ch=fgetc(fp); program[i++]=ch;
}while(ch!='@');
fclose(fp);
i=0;
do
{
sign=scan(program); //对源程序进行扫描
if(sign==200)
{
printf("(%2d,%4d)\n",sign,number);
}
else if(sign==-1) //出错处理
{
printf("(%d,error)\n",sign);
}
else
{
printf("(%2d,%4s)\n",sign,words); //输出符号表
}
} while(sign!=0);
printf("★★★★★★★★★★★★★\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -