C++语言LR文法的实现,词法,语法,自动生成action,goto表

该博客详细介绍了C++语言中LR文法的实现过程,包括词法分析的头文件和实现,以及语法部分的定义和实现。重点讲解了如何求first集合、生成闭包以及自动生成ACTION和GOTO表的关键步骤。
摘要由CSDN通过智能技术生成

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什么都会点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值