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

📄 typecheck.h

📁 一个Pascal子集语言的编译器
💻 H
📖 第 1 页 / 共 2 页
字号:
            if((strcmp(NowWord,"ids")==0)&&(strcmp(NextWord,"(")==0))
                                                //说明此时为输入一个函数或过程 
                state=1;
            else
            {
                fout<<" "<<NextWord;            //将正常的字符全部输出 
                if ((strcmp(NextWord,"ids")==0)||(strcmp(NextWord,"number")==0))
                    fout<<" "<<TempValue;
                    
                if(strcmp(NextWord,";")==0) fout<<endl;
                strcpy(NowWord,NextWord);
            }   
        }
        else                                    //如果是状态为1则除了输入")"以外,继续记录 
        {
            if(strcmp(NextWord,")")==0)
                    state=0;                    //恢复到写状态 
        }
    }
    
    fin2.open("sentence.txt");              //再次打开输入文件 
    state=0;
    while(fin2>>CurrentLine>>Parament)
    {
        while(fin2>>NextWord)
        {
        if((strcmp(NextWord,"ids")==0)||(strcmp(NextWord,"number")==0))
            fin2>>TempValue;
    
        if(state==0)
        {
            if((strcmp(NowWord,"ids")==0)&&(strcmp(NextWord,"(")==0))
                                                //说明此时为输入一个函数或过程 
            {
            state=1;
            fout<<CurrentLine<<" "<<Parament<<" "<<NowWord<<" "<<TempValue<<" (";
            }
        }
        else
        {
            if(strcmp(NextWord,")")==0)         //表明一个函数或过程的结束 
            {
                state=0;
                fout<<" ) ;"<<endl;             //将整个输出 
            }
            else
            {
                fout<<" "<<NextWord;
                if((strcmp(NextWord,"ids")==0)||(strcmp(NextWord,"number")==0))
                    fout<<" "<<TempValue;
    
            }
        }    
        strcpy(NowWord,NextWord); 
        if(strcmp(NextWord,";")==0) break;  
        }
    }
    

}



int typeCheck::Compile(char* filename)
{
    Initialize();                           //首先将各个参数进行初始化 
    TestVariant();                          //判断变量是否有重复定义 
    
    while(fin>>CurrentLine>>Parament)       //读取每一行的头信息 
    {
        Index=0;
        while(fin>>Word[++Index])
        {
            if((strcmp(Word[Index],"ids")==0)||(strcmp(Word[Index],"number")==0)||(strcmp(Word[Index],"op")==0))
              fin>>Value[Index];
            
            if(strcmp(Word[Index],";")==0)  //除非遇到";",一直读完整行代码 
                {
                Count=Index-1;
                break;
                }
        
        }
        
        int temp;
        
        if(Check()==0)                      //每读完一行代码后就将其处理 
                                            //如果返回值为0,表示此行代码正确
        {
        }
        else
        {
        /*
            显示错误信息 
        */
        }
    
    
    }
    if(Error_Count==0)
        return 0;
    else
        return -1;
}    

int typeCheck::Check()
{
    if(strcmp(Word[1],"simple")==0)             //按照推导式 simple relop simple 进行推导 
    {
            int temp=2;
            while(strcmp(Word[temp],"relop")!=0)
            {
                strcpy(SimpleWord[temp-2],Word[temp]);
                SimpleValue[temp-2]=Value[temp];
                temp++;
            }
            SimpleCount=temp-3;
            
            LeftType=simpleCheck();             //获取等式左边的类型 
            
            temp+=2;
            while(strcmp(Word[temp],";")!=0)
            {
                strcpy(SimpleWord[temp-5-SimpleCount],Word[temp]);
                SimpleValue[temp-5-SimpleCount]=Value[temp];
                temp++;
            }
            SimpleCount=temp-6-SimpleCount;
            RightType=simpleCheck();             //获取等式右边的类型 
            
            if(LeftType!=RightType)
            {
                    CatchError(3);              //如果类型不相等则出现错误信息 
                    return -1;
            }    
            
        
    }
    else if(strcmp(Word[1],"ids")==0)             //按照推导式 
                                                  //      ids 
                                                  //      ids ( ids_list )
                                                  //      ids assignop simple
                                                  // 进行推导
    
    {
        if(Count==1)                              // " ids;"
        {
            //这种情况只有可能是ids为一个procedure name,其他情况均报错
            if(VariantKind[int(Value[1])]==800)
            {
                //句型正确 
            }
            else
            {
                /*
                    句型错误,报出错误信息 
                */
                Index=1;
                CatchError(0);
                return -1;
            }
        }
        else if(strcmp(Word[2],"assignop")==0)    // " ids := simple ;"
        {
            LeftType=VariantType[int(Value[1])];
            
            int temp=3;
            while(strcmp(Word[temp],";")!=0)
            {
                strcpy(SimpleWord[temp-3],Word[temp]);
                SimpleValue[temp-3]=Value[temp];
                temp++;
            }
            SimpleCount=temp-4;
            RightType=simpleCheck();
            LeftType=LeftType%100+100;
            
            if(LeftType!=RightType)
            {
                if((LeftType==103)||(LeftType==100))  //左边是boolean型 
                {
                    CatchError(2);
                    return -1;
                }
                else if(LeftType==102)
                {
                }
                else                                  //其他情况都直接警告即可 
                {
                    CatchError(10);
                    return -1;
                }
            }
        }
        else                                          // " ids ( simple_list ); "
        {
            if((VariantKind[int(Value[1])]/100==8)||(VariantKind[int(Value[1])]/100==7))
            {
                    //这个时候只有当ids为函数或过程名称时才成立 
                    //现在只是判断参数的个数是否正确
                    
                    //计算参数的个数
                    int temp=2; 
                    int count=0;
                    if(strcmp(Word[temp],"(")==0) 
                        {
                        
                        while(strcmp(Word[temp],")")!=0) 
                        {
                            while((strcmp(Word[temp],")")!=0)&&(strcmp(Word[temp],",")!=0)) 
                                temp++;
                            if(strcmp(Word[temp],",")==0)
                                {temp++;count++;}
                        }
                        count++;
                    
                    }
                     
                    //将所得到的参数个数与函数定义中的参数个数相比较
                    if(count!=VariantHave[int(Value[1])])
                        {
                        //输出错误信息
                        CatchError(1); 
                        }
                    
            }
            else
            {
                    //而如果是其他类型则报错
                     
                /*
                    句型错误,报出错误信息 
                */
                Index=1;
                CatchError(0);
                return -1;
            }
            
            
        }
    
    }
    
    
    
    return 0;

}
#endif

⌨️ 快捷键说明

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