📄 typecheck.h
字号:
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 + -