📄 jf.cpp
字号:
#include "stdio.h"
#include "string.h"
#define KEY_No 1
#define ID_No 2
#define Number_No 3
#define Sign_No 4
#define Other_No 5
#define M 1000
#define KEYNumber 4
#define MaxTLenth 100
char A[M]; //字符缓冲区
int pA=0; //字符缓冲区指针
char* KEY[KEYNumber]={"if","for","continue","break"};
//char* Sign[SignNumber]={"+","-","*","/","=","<","<=",">=","==","!="};
char C; //用于存放取到的一个字符
char T[MaxTLenth]; //用于存放取到的一个单词
int pT=0;
bool Scan();
void GetRestSign();
void PrintSigleSign();
void GetRestNumber();
void GetRestID();
void CutBlank();
char GetFirstChar();
bool IsBlank();
bool IsKey();
bool IsSign();
char GetChar();
bool IsStr(char * s);
void Print(int Type);
void main()
{
int i=0;
while(1)
{
scanf("%c",A+i);
if(A[i]=='#')
{
break;
}
i++;
}
Scan();
}
bool Scan()
{
C=GetFirstChar(); //获取下一个单词的第一个字母
while(C>=0) //通过判断 C 的类型,读入分析下一个单词的类型
{
if(C>='a' && C<'z' || C>='A' && C<='Z') //关键词或标识符
{
GetRestID();
if(IsKey())
Print(KEY_No);
else
Print(ID_No);
continue;
}
else if(C>='0' && C<='9') //整数
{
GetRestNumber();
Print(Number_No);
continue;
}
//下面是判断是否是运算符
else if(C=='+' || C=='-' || C=='*' || C=='/')
{
PrintSigleSign();
continue;
}
else if(C=='=' || C=='!' || C=='<' || C=='>')
{
GetRestSign();
Print(Sign_No);
continue;
}
else
{
T[0]=C;
pT=1;
Print(Other_No);
C=' ';
CutBlank();
continue;
}
}
return true;
}
void GetRestSign() //依据第一个数字C读入后面的"="组成两个字符的运算符放到全局变量T中
{
T[0]=C;
pT=1;
while (1)
{
if((C=GetChar())<0) return;
if(C=='=')
T[pT++]=C;
else
{
CutBlank();
return ;
}
}
}
void PrintSigleSign()
{
T[0]=C;
pT=1;
Print(Sign_No);
C=' ';
CutBlank();
}
void GetRestNumber() //依据第一个数字C读入后面所有的数字组成整数放到全局变量T中
{
T[0]=C;
pT=1;
while (1)
{
if((C=GetChar())<0) return;
if(C>='0' && C<='9')
T[pT++]=C;
else
{
CutBlank();
return ;
}
}
}
void GetRestID() //依据第一个字母C读入后面所有的字母数字组成单词放到全局变量T中
{
T[0]=C;
pT=1;
while (1)
{
if((C=GetChar())<0) return;
if(C>='a' && C<='z' || C>='A' && C<='Z' || C>='0' && C<='9')
T[pT++]=C;
else
{
CutBlank();
return ;
}
}
}
void CutBlank() //如果C是空格忽略掉所有的空格,直到非空格
{
while(IsBlank())
{
C=GetChar();
}
}
char GetFirstChar() //获取下一个单词的第一个字母
{
do{C=GetChar();}while(IsBlank());
return C;
}
bool IsBlank() //判断读到的字符是否为空格
{
if(C<0)return false;
if(C<=32)return true;
return false;
}
bool IsKey() //判断T中的单词是否为关键字
{
int i;
for(i=0;i<KEYNumber;i++)
{
if(IsStr(KEY[i]))return true;
}
return false;
}
char GetChar() //从缓冲区获取一个字符
{
if(A[pA]!='#')
return A[pA++];
else
return -1;
}
bool IsStr(char * s) //将T和s比较是否相等
{
int i;
for(i=0;i<pT;i++)
{
if(s[i]==0 || s[i]!=T[i]) return false;
}
if(s[i]!=0)
return false;
else
return true;
}
void Print(int Type)
{
T[pT]='\0';
printf("(%d,\"%s\")\n",Type,T);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -