📄 bianyidekeshe.cpp
字号:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<search.h>
#include<iostream.h>
extern int reserve(char*);
extern void output(int,char*);
char token[20];
int impt[20];
int num[10];
char zf[2];
char ch;
int i,c,re=100,h,z;
int n=0;
int l;
int syjag();
void S() ;
char relop();
void scanner(FILE *fp)
{
ch=fgetc(fp); //fgetc()是用来从文件中读取内容的。它可不管读到的内容是什么东西
if(isalpha(ch)) //isalpha()如果是字母,返回真
{
token[0]=ch;
i=1;
ch=fgetc(fp);
while(isalpha(ch)||isalnum(ch)) //isalnum()函数当参数是数字或者字母的时候返回非0值,其它是0
{
token[i]=ch;
i++;
ch=fgetc(fp);
}
fseek(fp,-1,1); //移动
token[i]='\0';
c=reserve(token);
if(c!=-1)
output(c,token);
else
output(10,token);
}
else if(isdigit(ch)) //isdigit() 如果参数是0,1,...,9中的一个字符,返回真,否则返回假,就是判断字符是否数字
{
token[0]=ch;
ch=fgetc(fp); //fgetc()是用来从文件中读取内容的。它可不管读到的内容是什么东西。
i=1;
while(isdigit(ch))
{
token[i]=ch;
i++;
ch=fgetc(fp);
}
token[i]='\0';
fseek(fp,-1,1);
output(1,token);
}
else
switch(ch)
{
case'=':ch=fgetc(fp);
if(ch=='=')
output(39,"==");
else
{
fseek(fp,-1,1);
output(21,"=");
}
break;
case'+':output(22,"+");break;
case'-':output(23,"-");break;
case'*':output(24,"*");break;
case'/':output(25,"/");break;
case'(':output(26,"(");break;
case')':output(27,")");break;
case'[':output(28,"[");break;
case']':output(29,"]");break;
case'{':output(30,"{");break;
case'}':output(31,"}");break;
case',':output(32,",");break;
case':':output(33,":");break;
case';':output(34,";");break;
case'>':ch=fgetc(fp);
if(ch=='=')
output(37,">=");
else
{
fseek(fp,-1,1);
output(35,">");
}
break;
case'<':ch=fgetc(fp);
if(ch=='=')
output(38,"<=");
else
{
fseek(fp,-1,1);
output(36,"<");
}
break;
case'!':ch=fgetc(fp);
if(ch=='=')
output(40,"!=");
else
{
fseek(fp,-1,1);
output(-1,"ERROR!");
}
break;
}
}
void main()
{ FILE *fp;
char wenjian[30];
//cout<<"词法分析的结果是:"<<endl;
//cout<<"1表示数字和关键字的main;2表示int;3表示char;4表示if;5表示else;6表示for;"<<endl;
// cout<<"7表示while;8表示case;9表示break10表示ID;20表示NUM;-1表示ERROR;22表示+;"<<endl;
//cout<<"23表示-;24表示*;25表示/;26表示(;27表示);28表示[;29表示];30表示{;31表示};"<<endl;
//cout<<"32表示,;33表示:;34表示;;35表示>;36表示<;37表示>=;38表示<=;39表示==;40!=;"<<endl;
printf("Please input the file you want to transform:");
scanf("%s",&wenjian);
fp=fopen(wenjian,"r"); //打开一个文件
while(!feof(fp))
{
scanner(fp);
}
int m;
m=syjag();
cout<<m<<endl;
if(m==1)
{
cout<<"该文法是for循环语句"<<endl;
cout<<"翻译的结果为:"<<endl;
S();
}
else
cout<<"该文法不是for循环语句"<<endl;
}
/**************************search.h*********************************/
extern struct table
{
int id;
char code[10];
};
struct table key[31] = {{1,"main"},{2,"int"},{3,"char"},{4,"if"},{5,"else"},{6,"for"},{7,"while"},{8,"case"},{9,"break"},{10,"ID"},{20,"NUM"},{-1,"ERROR"}};
int reserve(char* p)
{ int i=0;
for(i=0;i<9;i++)
{
if(strcmp(p,key[i].code)==0) //strcmp(s1,s2) 对字符串s1和s2进行比较,返回比较结果--相等返回0,s1>s2时返回正数,s1<s2时返回负数
return(key[i].id);
}
return(-1);
}
void output(int t,char *s)
{
impt[n]=t;
n++;
if(t==1){
num[h]=*s;
h++;
}
if(t==10){
zf[z]=*s;
z++;
}
printf("[ %-2d , %-6s ]\n",t,s);
}
int syjag()
{
/*int sum;
for(int m=0;m<14;m++)
{
int a=impt[m];
}
return sum=impt[13];
if(impt[0]==6)
if(impt[1]==26)
if(impt[2]==10)
if(impt[3]==21)
if(impt[4]==1)
if(impt[5]==34)
if(impt[6]==10)
if(impt[7]==35&&impt[7]==36&&impt[7]==37&&impt[7]==38&&impt[7]==39&&impt[7]==40)
if(impt[8]==1)
if(impt[9]==34)
if(impt[10]==10)
if(impt[11]==22)
if(impt[12]==22)
if(impt[13]==27)*/
if(impt[0]==6)//||impt[1]==26||impt[2]==10||impt[3]==21||impt[4]==1||impt[5]==34||impt[6]==10||(impt[7]==35&&impt[7]==36&&impt[7]==37&&impt[7]==38&&impt[7]==39&&impt[7]==40)||impt[8]==1||impt[9]==34||impt[10]==10||impt[11]==22||impt[12]==22||impt[13]==27)
{
return 1;
}
else
return 0;
}
void S()
{
l=syjag();
if(l==1)//
{
cout<<re<<" "<<zf[0]<<":="<<num[0]-48<<endl;
re++;
cout<<re<<" "<<"goto"<<re+2<<endl;
re++;
cout<<re<<" "<<zf[0]<<":="<<zf[2]<<"+1"<<endl;
re++;
cout<<re<<" "<<"if"<<zf[1]<< relop()<<num[1]-48<<"goto"<<re+2<<endl;
re++;
cout<<re<<" "<<"goto"<<"结束"<<endl;
re++;
cout<<re<<" "<<"T:="<<"M+"<<zf[0]<<endl;
re++;
cout<<re<<" "<<"M:=T"<<endl;
re++;
cout<<re<<" goto"<<re-5<<endl;
re++;
cout<<re<<" 结束"<<endl;
}
}
char relop()
{
c=impt[7];
if(c==36)
{
return '<';
}
else
if(c==39)
{
return '=';
}
else
if(c==35)
{
return '>';
}
else
if(c==37)
{
return '>=';
}
else
if(c==38)
{
return '<=';
}
else
if(c==40)
{
return '!=';
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -