📄 cifafenxi.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<cType.h>
#include<conio.h>
/*全局变量声明*/
char *prog,token[8];
char ch;/*当前读入的字符*/
int syn,sum;/*syn-单词种别码,token-单词,sum-整型常量*/
int p,m,n;/*p是缓冲区prog的指针,m是token的指针*/
char *rwtab[6]={"begin","if","then","while","do","end"};/*关键字*/
char *sytab[4]={":=","<>","<=",">="};/*双符号*/
int cType(char c)
{
if(isalpha(c)) return 1; /*字母*/
else if(c>='0'&&c<='9') return 2; /*数字*/
else if(c==32) return 32;/*空格*/
else return 3; /*符号*/
return 0;
}
/*清空token*/
void tokenCls()
{
int i;
for(i=0;i<8;i++)
token[i]=0;
m=0;
}
/*得到单词或符号的种别码*/
int getSyn(char *s,int type)
{
int i;
if(type==0)/*type=0表示计算单词*/
{
for(i=0;i<6;i++)
if(!strcmp(s,rwtab[i])) return(i+1);
return 10;
}
else if(type==1)/*type=1表示计算单符号*/
switch(s[0])
{
case'+':return 13;
case'-':return 14;
case'*':return 15;
case'/':return 16;
case':':return 17;
case'<':return 21;
case'>':return 23;
case'=':return 25;
case';':return 26;
case'(':return 27;
case')':return 28;
case'#':return 0;
default:return -1;/*代表输出为错误信息*/
}
else/*type=2表示计算双符号*/
{
if(!strcmp(s,sytab[0])) return 18; /*是":="*/
if(!strcmp(s,sytab[1])) return 21; /*是"<>"*/
if(!strcmp(s,sytab[2])) return 22; /*是"<="*/
if(!strcmp(s,sytab[3])) return 24; /*是">="*/
return -1; /*代表输出为错误信息*/
}
}
int wType()/*判断字符段类型*/
{
int i,t1=0,t2=0,t3=0;
for(i=0;i<m;i++)
if(cType(token[i])==1) t1++;
else if(cType(token[i])==2) t2++;
t3=m-t1-t2;
if(t2==m)
{
sum=strtol(token,NULL,10);/*将数字转换为整型*/
return 2; /*全数字字符段*/
}
if(t3==m)
if(m==1) return 3;/*单符号字符段*/
else return 4; /*多符号字符段*/
return 5; /*一般单词*/
}
void outPut(int type)/*单项输出结果*/
{
switch(type)
{
case 1:printf("\t (%d,\"%s\")\n",getSyn(token,0),token);break; /*输出单词*/
case 2:printf("\t (11,%d)\n",sum); break; /*输出数据*/
case 3:printf("\t (%d,%s)\n",getSyn(token,1),token); break; /*输出单符号*/
case 4:printf("\t (%d,%s)\n",getSyn(token,2),token); break; /*输出多符号*/
}
}
void scaner()/*扫描字符串*/
{
int bp;
while(32==*(prog+p))
p++;/*忽略开始的空格*/
bp=p;
do
{
ch=*(prog+p);
if(cType(ch)==1||cType(ch)==2)/*读入的是字母或是数字*/
{
if(cType(*(prog+p-1))==3&&p!=bp)
{
outPut(wType());/*输出符号*/
tokenCls();
}
token[m++]=ch;
}
else if(cType(ch)==3)/*读入的是符号*/
{
if(cType(*(prog+p-1))==1||cType(*(prog+p-1))==2)/*前一个读入的是字母,则输出单词*/
{
if(wType()==2)
outPut(2);
else if(wType()==5)
outPut(1);
tokenCls();
}
token[m++]=ch;
}
else if(ch==32)/*读入的是空格*/
{
switch(wType())
{
case 2:outPut(2);break; /*输出数字*/
case 3:outPut(3);break; /*输出单符号*/
case 4:outPut(4);break; /*输出多符号*/
case 5:outPut(1);break; /*输出单词*/
}
tokenCls();
}
p++;
}while(*(prog+p-1)!='#');
token[0]='#';
outPut(3);
}
void main()
{
m=n=0;
prog="begin x2:=9;if x<>0 then!<x:=2*x+1/3;end#";/*输入表达式*/
printf("Expression:\"%s\"\nResult:\n",prog);
scaner();
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -