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

📄 sentencecompile.h

📁 一个Pascal子集语言的编译器
💻 H
📖 第 1 页 / 共 4 页
字号:
   if(strcmp(NextWord,"assignop")==0) Next=136;
   
}

int sentenceCompile::Compile(char* filename)
{
   Initialize();                //对编译器的初始化 
   
   while(fin>>NextWord)
   {
        
        if(strcmp(NextWord,"@")!=0)       //记录回车信息 
        {
        
        Coding();                           //找出相应符号的编码 
            switch(Next)
            {
                case 104:
                case 122:
                case 124:
                case 125:
                case 126:fin>>Value;
                default:break;
            }
        Check(Next);                        //根据编码进行语法检查 
        
        if(Copying)                      //如果处于复制代码状态则将当前字符写入 
            {
            fout<<" "<<NextWord;
            switch(Next)
                {
                case 104:
                case 122:
                case 124:
                case 125:
                case 126:fout<<" "<<Value;
                default:break;
                }
            
            }
        
        }
        else
        {
            CurrentLine++;
        }
        
        
   }
   for(int i=1;i<=VariantCount;i++)                        //将符号表写入文件 
        fouttable<<i<<" "<<VariantKind[i]<<" "<<VariantType[i]<<" "<<VariantName[i]<<" "<<VariantHave[i]<<" "<<VariantBelong[i]<<endl;
   
   
   
   if((State[StateIndex]==9999)&&(Error_Count==0))
   {
        return 0;
   }
   else
   {
   /* 
      输出错误信息:unexpected end of file 
   */
        cout<<State<<endl;
        cout<<"unexpected end of file"<<endl;
        return -1;
   }
    
}

int sentenceCompile::Check(int next)
{
    switch(State[StateIndex])
    {
        //program
        case 1000:if(next==101) {State[StateIndex]=1001; break;}
                  strcpy(ExpectedWord,"'program' ");CatchErrors(1);break;
                    
        case 1001:if(next==123) {State[StateIndex]=1002; VariantIndex++;Parament=0;VariantType[VariantIndex]=900;break;}    
                  strcpy(ExpectedWord,"identifier ");CatchErrors(1);break;
                  
        case 1002:if(next==129) {State[StateIndex]=1003; break;}
                  strcpy(ExpectedWord,"'(' ");CatchErrors(1);break;
                  
        case 1003:if(next==123) {State[++StateIndex]= 8000;Check(next); break;}
                  if(next==8)   {State[StateIndex]=1004;break;}
                  strcpy(ExpectedWord,"identifier ");CatchErrors(1);break;
                    
        case 1004:if(next==130) {State[StateIndex]=1005; break;}
                  strcpy(ExpectedWord,"')' ");CatchErrors(1);break;
                    
        case 1005:if(next==128)  {State[StateIndex]=1006;Parament=0;HaveCount=0; break;}
                  strcpy(ExpectedWord,"';' ");CatchErrors(1);break;
                  
        case 1006:if(next==135)  {State[++StateIndex]= 2000;Check(next); break;}
                  if(next==105)  {State[++StateIndex]= 4000;Check(next); break;}
                  if(next==106)  {State[++StateIndex]= 5000;Check(next); break;}
                  if(next==102)  {State[++StateIndex]= 6000;Parament=0;HaveCount=0;Check(next);break;}
                  if(next==2) {State[StateIndex]=1006; break; }
                  if(next==4) {State[StateIndex]=1006; break;}
                  if(next==5) {State[StateIndex]=1006; break; }
                  if(next==6) {State[StateIndex]=1007; break;}
                  strcpy(ExpectedWord,"'begin' ");CatchErrors(1);break;
                    
        case 1007:if(next==133)  {State[StateIndex]=9999; break;}
                  strcpy(ExpectedWord,"'.' ");CatchErrors(1);break;
                    
        case 9999:State[StateIndex]=9900; break;
        case 9900:break;                        //错误状态,始终保持 
                            
        //declaration          
        case 2000:if(next==135)  {State[StateIndex]=2001; break;}
                  strcpy(ExpectedWord,"'var' ");CatchErrors(1);break;
                    
        case 2001:if(next==123)  {State[++StateIndex]= 8000;Check(next); break;}
                  if(next==8)    {State[StateIndex]=2002; break;}
                  strcpy(ExpectedWord,"identifier ");CatchErrors(1);break;
                  
        case 2002:if(next==127)  {State[StateIndex]=2003; break;}
                  strcpy(ExpectedWord,"':' ");CatchErrors(1);break;
                    
        case 2003://cout<<"here"<<endl;
                  //cout<<next<<endl;
                  if(next==104)  {State[++StateIndex]= 3000;TypeNeed=100;Check(next); break;}
                  if(next==114)  {State[++StateIndex]= 3000;TypeNeed=100;Check(next); break;}
                  if(next==115)  {State[++StateIndex]= 3000;TypeNeed=100;Check(next); break;}
                  if(next==3)    {State[StateIndex]=2004; break;}
                  strcpy(ExpectedWord,"'type' ");CatchErrors(1);break;
                  
        case 2004:if(next==128) {State[StateIndex]=2005; break;}
                  strcpy(ExpectedWord,"';' ");CatchErrors(1);break;
                    
        case 2005:StateIndex--; Check(2);Check(next);break;
        
        //type
        case 3000:
                  if(next==104) 
                    {State[StateIndex]=3001;
                                    //将Type=100+temp信息回填到VariantType==TypeNeed的VariantType中 
                    for(int i=1;i<=VariantIndex;i++)
                        if(VariantType[i]==TypeNeed)
                            VariantType[i]=int(TypeNeed+Value);
                            
                     break;}
                  if(next==114) {State[StateIndex]=3002; break;}
                  strcpy(ExpectedWord,"defination ");CatchErrors(1);break;
                  
        case 3001:StateIndex--; Check(3);Check(next);break;
        
        case 3002:if(next==131) {State[StateIndex]=3003; break;}
                  strcpy(ExpectedWord,"'[' ");CatchErrors(1);break;
                    
        case 3003:if(next==122) {State[StateIndex]=3004; break;}
                  strcpy(ExpectedWord,"number ");CatchErrors(1);break;
                  
        case 3004:if(next==133) {State[StateIndex]=3005; break;}
                  strcpy(ExpectedWord,"'.' ");CatchErrors(1);break;
                  
        case 3005:if(next==133) {State[StateIndex]=3006; break;}
                  strcpy(ExpectedWord,"'.' ");CatchErrors(1);break;
                  
        case 3006:if(next==122) {State[StateIndex]=3007; break;}
                  
                  strcpy(ExpectedWord,"number ");CatchErrors(1);break;
                  
        case 3007:if(next==132) {State[StateIndex]=3008; break;}
                  strcpy(ExpectedWord,"']' ");CatchErrors(1);break;
                  
        case 3008:if(next==116) {State[StateIndex]=3009; break;}
                  strcpy(ExpectedWord,"'of' ");CatchErrors(1);break;
                  
        case 3009:if(next==104) 
                    {State[StateIndex]=3010;
                                     //将Type=200+temp信息回填到VariantType==TypeNeed的VariantType中 
                     for(int i=1;i<=VariantIndex;i++)
                        if(VariantType[i]==TypeNeed)
                            VariantType[i]=int(200+Value);
                            
                     break;}
                  strcpy(ExpectedWord,"defination ");CatchErrors(1);break;
                  
        case 3010:StateIndex--; Check(3);Check(next);break;
        
        case 3011:if(next==135)  {State[++StateIndex]= 2000;Check(next); break;}
                  if(next==2)    {State[StateIndex]=3012; break;}
                  strcpy(ExpectedWord,"declaration ");CatchErrors(1);break;
                  
        case 3012:if(next==103)  {State[StateIndex]=3013; break;}
                  strcpy(ExpectedWord,"'end' ");CatchErrors(1);break;
                     
        case 3013:StateIndex--; Check(3);Check(next);break;
        
        //functions
        case 4000:if(next==105)  {State[StateIndex]=4001; break;}
                    
        case 4001:if(next==123)  
                    {State[StateIndex]=4002;
                    
                    VariantIndex++;SubCount++;
                    Temp=VariantIndex;
                    VariantBelong[VariantIndex]=0;
                    Parament=VariantIndex;
                    VariantType[VariantIndex]=700;//等待输入类型 
                    break;}
                  strcpy(ExpectedWord,"identifier ");CatchErrors(1);break;
                  
        case 4002:if(next==129)  {State[StateIndex]=4004; break;}
                  strcpy(ExpectedWord,"'(' ");CatchErrors(1);break;
                    
        case 4004:if(next==123)  {State[++StateIndex]=8000;HaveCount=0;Check(next); break;}
                  if(next==8)    {State[StateIndex]=4005; break;}
                  if(next==130)  {State[StateIndex]=4009; break;}
                  strcpy(ExpectedWord,"identifier ");CatchErrors(1);break;
                  
        case 4005:if(next==127)  {State[StateIndex]=4006; break;}
                  strcpy(ExpectedWord,"':' ");CatchErrors(1);break;
                    
        case 4006:if(next==104)  {State[++StateIndex]= 3000;TypeNeed=100;Check(next); break;}
                  if(next==114)  {State[++StateIndex]= 3000;TypeNeed=100;Check(next); break;}
                  if(next==115)  {State[++StateIndex]= 3000;TypeNeed=100;Check(next); break;}
                  if(next==3)    {State[StateIndex]=4007; break;}
                  strcpy(ExpectedWord,"type ");CatchErrors(1);break;
                  
                  
        case 4007:if(next==130)  {State[StateIndex]=4009; break;}   
                  strcpy(ExpectedWord,"')' ");CatchErrors(1);break;
                    
        case 4009:if(next==127)  {State[StateIndex]=4010;VariantHave[Temp]=HaveCount; break;}
                  strcpy(ExpectedWord,"':' ");CatchErrors(1);break;
                    
        case 4010:if(next==104)  {State[++StateIndex]= 3000;TypeNeed=700;Check(next); break;}
                  if(next==114)  {State[++StateIndex]= 3000;TypeNeed=700;Check(next); break;}
                  if(next==115)  {State[++StateIndex]= 3000;TypeNeed=700;Check(next); break;}
                  if(next==3)    {State[StateIndex]=4011; break;}
                  strcpy(ExpectedWord,"type' ");CatchErrors(1);break;
                  
        case 4011:if(next==128)  {State[StateIndex]=4012; break;}
                  strcpy(ExpectedWord,"';' ");CatchErrors(1);break;
                    
        case 4012:if(next==135)  {State[++StateIndex]= 2000;Check(next); break;}
                  if(next==2)    {State[StateIndex]=4012; break;}
                  if(next==102)  {State[++StateIndex]= 6000;Check(next); break;}
                  if(next==6)    {State[StateIndex]=4013; break;}
                  strcpy(ExpectedWord,"'begin' ");CatchErrors(1);break;
                  
        case 4013:if(next==128)  {State[StateIndex]=4014; break;}
                  strcpy(ExpectedWord,"';' ");CatchErrors(1);break;
                    
        case 4014:StateIndex--; Check(4);Check(next);break;
        
        //procedures
        case 5000:if(next==106)  {State[StateIndex]=5001; break;}
                    
        case 5001:if(next==123)  
                    {State[StateIndex]=5002;
                    VariantIndex++;SubCount++;
                    Temp=VariantIndex;
                    VariantBelong[VariantIndex]=0;
                    Parament=VariantIndex;
                    VariantType[VariantIndex]=800;
                    break;}
                  strcpy(ExpectedWord,"identifier ");CatchErrors(1);break;
                    
        case 5002:if(next==129)  {State[StateIndex]=5003; break;}
                  strcpy(ExpectedWord,"'(' ");CatchErrors(1);break;
                    
        case 5003:if(next==123)  {State[++StateIndex]= 8000;HaveCount=0;Check(next); break;}
                  if(next==8)    {State[StateIndex]=5004; break;}
                  if(next==130)  {State[StateIndex]=5007; break;}
                  strcpy(ExpectedWord,"identifier ");CatchErrors(1);break;
                  
        case 5004:if(next==127)  {State[StateIndex]=5005; break;}
                  strcpy(ExpectedWord,"':' ");CatchErrors(1);break;
                    
        case 5005:if(next==104)  {State[++StateIndex]= 3000;TypeNeed=100;Check(next); break;}
                  if(next==114)  {State[++StateIndex]= 3000;TypeNeed=100;Check(next); break;}
                  if(next==115)  {State[++StateIndex]= 3000;TypeNeed=100;Check(next); break;}
                  if(next==3)    {State[StateIndex]=5006; break;}
                  strcpy(ExpectedWord,"type ");CatchErrors(1);break;
                  
        case 5006:if(next==130)  {State[StateIndex]=5007; break;}
                  strcpy(ExpectedWord,"')' ");CatchErrors(1);break;
                    
        case 5007:if(next==128)  {State[StateIndex]=5008;VariantHave[Temp]=HaveCount; break;}
                  strcpy(ExpectedWord,"';' ");CatchErrors(1);break;
                    
        case 5008:if(next==135)  {State[++StateIndex]= 2000;Check(next); break;}
                  if(next==2)    {State[StateIndex]=5008; break;}
                  if(next==102)  {State[++StateIndex]= 6000;Check(next); break;}
                  if(next==6)    {State[StateIndex]=5009; break;}
                  strcpy(ExpectedWord,"'begin' ");CatchErrors(1);break;
                  
        case 5009:if(next==128)  {State[StateIndex]=5010; break;}
                  strcpy(ExpectedWord,"';' ");CatchErrors(1);break;
                    
        case 5010:StateIndex--; Check(5);Check(next);break;
        
        // body
        case 6000:if(next==102)  {State[StateIndex]=6001;break;}
                  if(next==124)  {State[++StateIndex]= 7000;Check(next); break;}
                  if(next==107)  {State[++StateIndex]= 7000;Check(next); break;}
                  if(next==110)  {State[++StateIndex]= 7000;Check(next); break;}
                  if(next==112)  {State[++StateIndex]= 7000;Check(next); break;}
                  if(next==113)  {State[++StateIndex]= 7000;Check(next); break;}
                  if(next==7)    {State[StateIndex]=6005; break;}
                  
        case 6001:if(next==124)  {State[++StateIndex]= 7000;Check(next); break;}
                  if(next==107)  {State[++StateIndex]= 7000;Check(next); break;}
                  if(next==110)  {State[++StateIndex]= 7000;Check(next); break;}
                  if(next==112)  {State[++StateIndex]= 7000;Check(next); break;}
                  if(next==113)  {State[++StateIndex]= 7000;Check(next); break;}
                  if(next==7)    {State[StateIndex]=6002; break;}

⌨️ 快捷键说明

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