⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 createcode.h

📁 一个Pascal子集语言的编译器
💻 H
字号:
//CreateCode.h

//inputfile:  words.txt
//outputfile: TempCode.txt

#ifndef CREATECODE_H_
#define CREATECODE_H_

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include "RunTime.h"
using namespace std;

/*****************************************************************************************
    生成中间代码 
     
    
    
******************************************************************************************/




void runTime::CreatCode(char* filename)
{
    ofstream fout1("TempCode.txt");
    
    
    for(int i=0;i<=SegmentCount;i++)
    {
        
        //对模块编号做一个预处理,将Segment进行反查
        for(int j=1;j<=VariantCount;j++)
            if(Segment[j]==i)
                Segment2[i]=j;
            
                                                //还需要将得到的代码过一遍,除掉冗余的信息 
        while(strcmp(Word[i][0],"var")==0)
        {
            int j=1;
            while(strcmp(Word[i][j],";")!=0) j++;   //将头部的定义变量信息去掉 
                                                //将后面所有词向前移动j+1个位置    
            for(int k=j+1;k<=WordCount[i];k++)
            {
                strcpy(Word[i][k-j-1],Word[i][k]);
                Value[i][k-j-1]=Value[i][k];
            }
            WordCount[i]-=j+1;
        }
        
        fout1<<"Segment "<<i<<" :"<<endl;
    
        for(int j=0;j<=WordCount[i];j++)
        {
            ChangeWords(i,j);
            fout1<<Word[i][j]<<" ";
            if(
            (strcmp(Word[i][j],"then")==0)
            ||
            (strcmp(Word[i][j],"else")==0)
            ||
            (strcmp(Word[i][j],";")==0)
            )
            fout1<<endl;
        
        }
        fout1<<endl;
        fout1<<endl;
    }
    
    cout<<"temp-code born successful."<<endl;
    
    //此时调用函数信息及函数参数信息已经全部被记录  
    //下面就利用这些中间代码写出最后的生成代码
    
    fout.open("Code.cpp");
    
    fout<<"#include <stdlib.h>"<<endl;
    fout<<"#include <iostream>"<<endl;
    fout<<"using namespace std;"<<endl<<endl;
    
    //在主函数之前,将所有函数先写入文件
    for(int i=1;i<=SegmentCount;i++)
    {
                                                          //写入函数类型
        if(VariantKind[Segment2[i]]/100==8)              
            fout<<"void ";
        else
        {
            switch(VariantType[Segment2[1]]%100)
            {
            case 1:fout<<"int ";break;
            case 2:fout<<"real ";break;
            case 3:fout<<"bool ";break;
            default:break;
            }
        }                                             
        fout<<VariantName[Segment2[i]];                   //写入函数名称 
        fout<<"(";                                        //写入参数信息  
        for(int j=1;j<=VariantHave[Segment2[i]];j++)
        {
            fout<<"int ";
            fout<<VariantName[Segment2[i]+j];             //写入参数名称  
            if(j<VariantHave[Segment2[i]])   
                fout<<" ,";
        }
        fout<<" )"<<endl;
        fout<<"{"<<endl;
        
        Write(i);
        
        fout<<"}"<<endl;
        fout<<"}"<<endl;
        
    }
    
    
    fout<<"int main(int argc,char** argv[])"<<endl;
    fout<<"{"<<endl;
                                                          //首先把所有变量声明信息写进去 
    
    for(int i=1;i<=VariantCount;i++)
            if(VariantKind[i]/100==9)                     //首先要判断是否为程序头信息
            {                                           
                 fout<<"char* "<<VariantName[i]<<" ;"<<endl;  
                                                          //如果是,则将其定义为char* 类型      
            }
            else if((VariantBelong[i]/100==0)&&(VariantKind[i]/100==1)) 
                                                          //是全局变量
            {
                switch(VariantType[i]%100)
                {
                    case 0:fout<<"void "; break;
                    case 1:fout<<"int ";  break;
                    case 2:fout<<"real ";  break;
                    case 3:fout<<"bool ";  break;
                    default:break;
                }
                fout<<VariantName[i]<<" ;"<<endl;   
                
                
            }
      
     Write(0); 
     
     fout<<"system(\"PAUSE\");"<<endl<<"return 0; "<<endl<<"} "<<endl; //文件的尾部
     
     cout<<"total code born successful."<<endl;             //结束此过程,写入文件完毕 
     
      
        
}

void runTime::Write(int num)
{
    
int state=0;

int i=-1;

    while(i<WordCount[num])
    {
        if(state==0) state=1;
        i++;
        if(strcmp(Word[num][i],"begin")==0)         //程序块的头
        {
              fout<<"{"<<endl;
              state+=50;
        }
        else if(strcmp(Word[num][i],"end")==0)      //程序块的尾
        {
             if(state==10) fout<<"; }"<<endl;
             state-=50;
        }    
        else if(strcmp(Word[num][i],"while")==0)    //while
        {
             fout<<"while("<<endl;   
        }
        else if(strcmp(Word[num][i],"do")==0)       //do
        {
             fout<<") {"<<endl; 
        }
        else if(strcmp(Word[num][i],".")==0)        //程序结束 
        {
        
            fout<<" "<<endl;
        }
        else if(strcmp(Word[num][i],";")==0)        //遇到分号,按照状态处理 
        {
             if(state==10) fout<<"; }"<<endl;
             else fout<<";"<<endl;
             state=0;
        }
        else if(strcmp(Word[num][i],"read")==0)     //"读"命令 
        {
            fout<<"cin>>";
            state=11;                                //将状态该为读状态    
            i++;                                    //跳过后面的括号 
        }
        else if(strcmp(Word[num][i],"write")==0)    //"写"命令 
        {
            fout<<"cout<<";
            state=12;                                //将状态该为写状态 
            i++;   
        }
        else if(strcmp(Word[num][i],")")==0)        //只可能是"读"或"写"命令的 
        {
            state=1;
            fout<<";"<<endl;
            i++;
        }
        else if(strcmp(Word[num][i],",")==0)
        {
            if(state==11)
                fout<<">>";
            else if(state==12)
                fout<<"<<";
        }
        else if(strcmp(Word[num][i],"if")==0)
        {
            fout<<"if ( ";
        }
        else if(strcmp(Word[num][i],"then")==0)
        {
            fout<<" ){"<<endl;
        }
        else if(strcmp(Word[num][i],"else")==0)
        {
            fout<<"; }"<<endl<<"else{"<<endl;
            state=10;
        }
        else if(strcmp(Word[num][i],"while")==0)
        {
            fout<<Word[num][i];
        }
        else if((Word[num][i][0]>96)&&(Word[num][i][0]<124))
        {
            //遇到变量时,需要判断此是否为函数调用,如果是, 则将其后的括号中的内容全部写入 
            if(Word[num][i+1][0]=='(')
            {
                while(strcmp(Word[num][i+1],")")!=0)
                {
                    fout<<Word[num][i];
                    i++;
                }
                fout<<Word[num][i];
                fout<<")";
                i+=2;
            }
            else if(strcmp(Word[num][i],VariantName[Segment2[num]])==0)         
                                                    //如果是变量的返回值,则需要将其写成return形式
            {
                fout<<" return ";
                i++; 
            } 
            else                                    //如果是一般变量则直接输出 
            {
                fout<<Word[num][i];
            }
        }
        else                                        //遇到其他的字符,则直接将其输出 
        {
            fout<<Word[num][i];
        }
    }
    if(state!=0) fout<<";"<<endl;
}



void runTime::ChangeWords(int num,int i)
{
    
        if(strcmp(Word[num][i],"number")==0)              //将除了变量以外的所有信息转回原形 
            {
            _itoa(int(Value[num][i]),Word[num][i],10);
            }
        else if(strcmp(Word[num][i],"ids")==0)
            {
             strcpy(Word[num][i],VariantName[int(Value[num][i])]);
            }
        else if(strcmp(Word[num][i],"op")==0)
            {
            switch(int(Value[num][i]))
                {   
                case 1:strcpy(Word[num][i],"+");break;
                case 2:strcpy(Word[num][i],"-");break;
                case 3:strcpy(Word[num][i],"*");break;
                case 4:strcpy(Word[num][i],"/");break;
                case 5:strcpy(Word[num][i],"/");break;
                case 6:strcpy(Word[num][i],"%");break;
                default:break;
                }
            }
        else if(strcmp(Word[num][i],"def")==0)
            {
                switch(int(Value[num][i]))
                {
                    case 1:strcpy(Word[num][i],"int");break;
                    case 2:strcpy(Word[num][i],"double");break;
                    case 3:strcpy(Word[num][i],"bool");break;
                    default:break;
                }   
                    
            }
        else if(strcmp(Word[num][i],"relop")==0)
            {
                switch(int(Value[num][i]))
                {
                    case 0:strcpy(Word[num][i],"==");break;
                    case 1:strcpy(Word[num][i],">");break;
                    case 2:strcpy(Word[num][i],"<");break;
                    case 3:strcpy(Word[num][i],"<=");break;
                    case 4:strcpy(Word[num][i],">=");break;
                    case 5:strcpy(Word[num][i],"<>");break;
                    default:break;
                }  
            }
        else if(strcmp(Word[num][i],"assignop")==0)
        {
            strcpy(Word[num][i],"=");
        }
        else if((VariantKind[int(Value[num][i])]==800)||(VariantKind[int(Value[num][i])]==700))
            {
                if(strcmp(Word[num][i+1],"(")==0)             //如果它的下个字符是"("则作为函数
                      {
                      }
                else
                      { 
                                                              //就把它当作一个返回值  
                      strcpy(Word[num][i],VariantName[int(Value[num][i])]);
                      strcat(Word[num][i],"[RunLayer]");  
                      }
            }
        
    

    
}





#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -