C++语言LR文法的实现,词法,语法,自动生成action,goto表
代码为主要算法部分,剩余部分可以联系作者
先是词法的头文件部分
using namespace std;
struct data //建立结构体,从文件中读取,存放所有状态及其编码
{
char content[2]; //符号
int statusnumber; //状态数
char name[20]; //保留字的名字,
} ;
extern struct data baoliuzi[100];
extern struct data yunsuanfu_and_others[100];
extern struct data printdata[100];
extern int CNT1;
extern int token_num;
extern char token[100]; //存放当下识别的词
extern char simpleword[100];
extern int line ;
extern int flag ;
extern char ch;
extern int flag1;
extern FILE* fin;
extern FILE * fout;
void scanfcode(struct data baoliuzi[],struct data yunsuanfu_and_others[]); //把保留字文件,运算符合其他界符从文件中读到结构体数组中
void distinguish(struct data printdata[],struct data baoliuzi[]); //对读取的文件内进行检索,判断正误,输出正确项
void word_to_txt(struct data printdata[]);//把识别的词写入TXT文件中
void initializat();
int judge(struct data baoliuzi[]);
void printtxt( char *&txt_name);
void simple(struct data printdata[]);
下面是词法的实现
void scanfcode(struct data baoliuzi[],struct data yunsuanfu_and_others[]) //把保留字文件,运算符合其他界符从文件中读到结构体数组中
{
// 保留字从文件中读入进结构体数组中
int k = 0;
char d[20];
FILE *fp;
if(!(fp=fopen("keepwords.txt","r")))
{
printf("文件地址有误");
exit(0);
}
while(k<12)
{
//
fscanf(fp,"%s\n",d);
strcpy(baoliuzi[k].name, d);
printf("%s\n",baoliuzi[k].name);
k++;
}
printf("一共有%d个保留字\n",k);
// fclose(fp); //关闭文件,释放指向文件的指针
//各种符号由文件中读入结构体数组中
// FILE *fp;
int K = 0;
int a;
char b[10];
char c[10];
if(!(fp=fopen("fuhao.txt","r")))
{
printf("文件地址有误");
exit(0);
}
while(K<=25)
{
fscanf(fp,"%s %d %s\n",c,&a,b);
yunsuanfu_and_others[K].statusnumber = a;
strcpy(yunsuanfu_and_others[K].name, b);
strcpy(yunsuanfu_and_others[K].content,c);
// printf("%d",yunsuanfu_and_others[K].statusnumber);
// printf(" %s",yunsuanfu_and_others[K].name);//
// printf(" %s \n",yunsuanfu_and_others[K].content);
K++;
}
// printf("一共有%d个符号\n",--K);
fclose(fp); //关闭文件,释放指向文件的指针
}
void word_to_txt(struct data printdata[]) //把存放在数组里的识别的单词依次输入文件当中
{
// int i = 0;
int k = 0;
FILE *out;
if(!(out=fopen("simple.txt","w")))
{
printf("文件地址有误");
exit(0);
}
// fprintf(out,"r54548545");
while(k<CNT1) //有多少识别的词,循环几次
{
if(printdata[k].statusnumber>=5&&printdata[k].statusnumber<=30) //运算符,字符
{
if(printdata[k].statusnumber==11||printdata[k].statusnumber==12||printdata[k].statusnumber==13||printdata[k].statusnumber==14||printdata[k].statusnumber==16||printdata[k].statusnumber==18)
fprintf(out,"r");
else if(printdata[k].statusnumber == 29)
fprintf(out,"|");
else if(printdata[k].statusnumber == 30)
fprintf(out,"&");
else if(printdata[k].statusnumber == 6)
fprintf(out,"a");
else if(printdata[k].statusnumber == 8)
fprintf(out,"s");
else
fprintf(out,"%s",printdata[k].name);
}
else if(printdata[k].statusnumber == 1) //保留字
{
if(strcmp(printdata[k].name,"void")==0)
fprintf(out,"v");
if(strcmp(printdata[k].name,"else")==0)
fprintf(out,"e");
if(strcmp(printdata[k].name,"if")==0)
fprintf(out,"f");
if(strcmp(printdata[k].name,"while")==0)
fprintf(out,"w");
if(strcmp(printdata[k].name,"main")==0)
fprintf(out,"m");
if(strcmp(printdata[k].name,"int")==0)
fprintf(out,"o");
if(strcmp(printdata[k].name,"double")==0)
fprintf(out,"o");
if(strcmp(printdata[k].name,"float")==0)
fprintf(out,"o");
if(strcmp(printdata[k].name,"char")==0)
fprintf(out,"o");
if(strcmp(printdata[k].name,"long")==0)
fprintf(out,"o");
}
else if(printdata[k].statusnumber == 2) //自定义名称
{
fprintf(out,"i");
}
else if(printdata[k].statusnumber == 3||printdata[k].statusnumber == 4) //自定义名称
{
fprintf(out,"n");
}
else
fprintf