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