📄 sentence.cpp
字号:
{
tag=5;
// cout<<name<<' '<<number<<endl;getch();
value=Blockanalyse();//getch();
if(value==1)
{
if(GetWord()==1)
{
if(number==29)
{
value=procanalyse();
}
else
{
BackWord();
}
}
}
}
}
}
if(value==0)
{
cout<<"procudure error"<<endl;
}
else
{
cout<<"procudure finish"<<endl;
}
depth--;
dspnum--;
varnum-=dpstack[dspnum].varend-dpstack[dspnum].varstart;
constnum-=dpstack[dspnum].constend-dpstack[dspnum].conststart;
// cout<<dpstack[dspnum].varend-dpstack[dspnum].varstart<<endl;
// cout<<dpstack[dspnum].constend-dpstack[dspnum].conststart<<endl;
// cout<<varnum<<' '<<constnum<<endl;
// cout<<name<<' '<<number<<endl;//////////////////
// getch();
return value;
}
void sentence::ProcError(int tag)//新过程分析错误处理
{
errornum++;
switch(tag)
{
case ID:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":标识符 "<<name<<" 不能作为过程的名称!"<<endl;
break;
case 27:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":标识符 "<<name<<" 位置非法,该位置应为字符'(' !"<<endl;
break;
case ID+1:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":标识符 "<<name<<" 不能作为过程的参数!"<<endl;
break;
case 28:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":标识符 "<<name<<" 前缺少符号')' !"<<endl;
break;
case 29:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":标识符 "<<name<<" 前缺少符号';' !"<<endl;
break;
}
}
int sentence::bodyanalyse()//过程主体分析
{
stateanalyse();
if(number==29)
{
return bodyanalyse();
}
else if(number==35)
return 0;
else
{
if(number==END)
{
GetWord();
if(number!=29)// 符号;
BackWord();
return 1;
}
else if(number>=PROGRAM&&number<=ODD)
{
return 1;
}
else
{
BodyError(0);////////////////
;//error
}
}
return 0;
}
void sentence::BodyError(int tag)//过程主体分析错误处理
{
cout<<"bodyanalyse error"<<endl;
}
int sentence::stateanalyse()//语句分析
{
int type;
type=GetWord();
if(type==0)
return 1;
switch(number)
{
case ID:return idanalyse();
case IF:return itlanalyse();
case WHILE:return whileanalyse();
case CALL:return callanalyse();
case BEGIN:return bodyanalyse();
case READ:return readanalyse();
case WRITE:return writeanalyse();
default:if(number>=PROGRAM&&number<=ODD)
break;
else
{
GetWord();
return 0;
cout<<"error"<<endl;
}
}
return 1;
}
void StateError(int tag)//语句分析错误处理
{
}
int sentence::idanalyse()//赋值语句分析
{
int type,value=0;
char id[10];
strcpy(id,name);
if(IsVar(name)==-1)
{
IdError(0);//error
Error();
errornum--;
return 0;
}
type=GetWord();
if(type==0)
{
;//error
return 0;
}
if(number==26)
{
value=expanalyse();
if(value==1)
{
IsVar(id);
CodeFile<<"code"<<++codenum<<": STO "<<depth-var_con_info.level<<','<<var_con_info.address<<endl;
}
else
{
IdError(1);
}
}
cout<<"id finish "<<value<<endl;
return value;
}
void sentence::IdError(int tag)//赋值语句分析错误分析
{
errornum++;
switch(tag)
{
case 0:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":标识符 "<<name<<" 不能被赋值!"<<endl;
break;
case 1:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":赋值语句不完整!"<<endl;
break;
}
}
int sentence::itlanalyse()//if_then_else语句分析
{
int type,value,num=0,index1,start1,end1,index2,start2,end2;
char data[9];
if(lexpanalyse()==1)
{
type=GetWord();
if(type==0)
{
cout<<"if_then_else 语句中缺少 then"<<endl;
;//error
}
if(number==THEN)
{
CodeFile<<"code"<<++codenum<<": JPC 0,"<<codenum+3<<endl;//跳转到 then 部分
CodeFile<<"code"<<++codenum<<": JMP 0, "<<endl;
index1=update_data.sum++;
start1=codenum;//第一个转移指令,跳到 else 部分
strcpy(data,": JMP 0,");
if(stateanalyse()==1)
{
CodeFile<<"code"<<++codenum<<": JMP 0, "<<endl;
end1=codenum+1;
index2=update_data.sum++;
start2=codenum;//第二个转移指令,从 then 部分跳出 if_then_else 语句
cout<<"then "<<name<<endl;/////////////////////////
if(number==29)
num=29;
if(number!=ELSE)
{
if(number!=29||number>=PROGRAM&&number<=ODD)// 符号 ;
BackWord();
/// GetWord();
if(number==29)
number=num;
value=1;
}
else
{
value=stateanalyse();
}
end2=codenum+1;
}
else if(number==29)
{
value=1;
}
else
{
cout<<name<<' '<<number<<endl;
cout<<" then state error"<<endl;//////////////////
value=0;
}
}
}
else
{
cout<<"if_then_else lexp error"<<endl;/////////////////////
value=0;
;//
}
Insert(index1,start1,end1,data);
Insert(index2,start2,end2,data);
cout<<"if_then_else finish "<<value<<endl;
return value;
}
void sentence::Itlanalyse(int tag)//if_then_else语句分析错误处理
{
}
int sentence::whileanalyse()//while_do语句分析
{
int type,value,start_position,start,end,index;
char data[9];
start_position=codenum+1;
if(lexpanalyse()==1)
{
CodeFile<<"code"<<++codenum<<": JPC 0, "<<endl;//跳出循环
start=codenum;
index=update_data.sum++;
type=GetWord();
if(type==0)
{
;//error
value=0;
}
if(number==DO)
value=stateanalyse();
}
else
{
;//error
value=0;
}
cout<<"while_do finish "<<value<<endl;
CodeFile<<"code"<<++codenum<<": JMP 0,"<<start_position<<endl;//跳回程序条件判断部分
end=codenum+1;
Insert(index,start,end,": JPC 0,");
return value;
}
void sentence::WhileError(int tag)//while_do语句分析错误处理
{
}
int sentence::callanalyse()//call语句分析
{
int type,value;
type=GetWord();
if(type==0)
{
;//error
return 0;
}
if(number==ID)
{
type=GetWord();
if(type==0)
value=1;
if(number==27)// 符号 (
{
while(1)
{
if(expanalyse()==1)
{
if(number==30)// 符号 ,
continue;
else if(number==28)// 符号 )
{
value=1;
GetWord();
if(number!=29)//没有后继语句
BackWord();
// cout<<name<<' '<<number<<endl;getch();
break;
}
}
else
{
;//error
value=0;
break;
}
}
}
}
cout<<"call finish "<<value<<endl;
return value;
}
void sentence::CallError(int tag)//call语句分析错误处理
{
}
int sentence::readanalyse()//输入函数分析
{
int type=1,tag=0;
while(type)
{
type=GetWord();
switch(number)
{
case 27:if(tag==0)
tag=1;
else
{
;//error
}
break;
case ID:if(tag==0)
{
;//error
}
else if(tag==1)
{
if(IsVar(name)==-1)
{
ReadError(1);
;//error
}
else
{
CodeFile<<"code"<<++codenum<<": RED "<<depth-var_con_info.level<<", "<<var_con_info.address<<endl;
}
tag=2;
}
else
{
;//error
}
break;
case 30:if(tag==0)
{
;//error
}
else if(tag==1)
{
;//error
}
else if(tag==2)
{
tag=1;
}
else
{
;//error
}
break;
case 28:if(tag==0)
{
;//error
}
else if(tag==1)
{
;//error
}
else if(tag==2)
{
GetWord();
cout<<endl<<"read finish"<<endl;//////////////////
return 1;
}
break;
}
}
return 1;
}
void sentence::ReadError(int tag)//输入函数分析错误处理
{
errornum++;
switch(tag)
{
case 1:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":"<<"标识符 "<<name<<" 不能用作输入变量!"<<endl;
break;
}
}
int sentence::writeanalyse()//输出函数分析
{
int type=1,tag=0,varright,constright;
while(type)
{
type=GetWord();
switch(number)
{
case 27:if(tag==0)
tag=1;
else
{
;//error
}
break;
case ID:if(tag==0)
{
;//error
}
else if(tag==1)
{
constright=IsConst(name);
varright=IsVar(name);
if(varright==-1&&constright==-1)
{
cout<<name<<endl;getch();
cout<<"WRITE ERROR"<<endl;/////////////
;//error
}
else
{
if(varright!=-1)
CodeFile<<"code"<<++codenum<<" :LOD "<<depth-var_con_info.level<<','<<var_con_info.address<<endl;
else
CodeFile<<"code"<<++codenum<<": LIT 0,"<<constptr[var_con_info.address].value<<endl;
CodeFile<<"code"<<++codenum<<": WRT 0,0"<<endl;
}
tag=2;
}
else
{
;//error
}
break;
case 30:if(tag==0)
{
;//error
}
else if(tag==1)
{
;//error
}
else if(tag==2)
{
tag=1;
}
else
{
;//error
}
break;
case 28:if(tag==0)
{
;//error
}
else if(tag==1)
{
;//error
}
else if(tag==2)
{
;//read 代码生成
GetWord();
cout<<endl<<"write finish"<<endl;//////////////////
return 1;
}
break;
}
}
return 1;
}
void sentence::WriteError(int tag)//输出函数分析错误处理
{
}
int sentence::factoranalyse()//元素factor分析
{
int type,var_right,const_right;
BackWord();
GetWord();//////////////////////////
type=GetWord();
if(type==0)
return 0;
// cout<<name<<endl;
switch(number)
{
case ID://cout<<"id "<<name<<endl;
var_right=IsVar(name);
const_right=IsConst(name);
if(var_right==-1&&const_right==-1)
{
FactorError(0);
// cout<<name<<endl;getch();
}
else
{
if(var_right!=-1)
{
CodeFile<<"code"<<++codenum<<": LOD "<<depth-var_con_info.level<<','<<var_con_info.address<<endl;
}
else
{
CodeFile<<"code"<<++codenum<<": LIT 0,"<<constptr[var_con_info.address].value<<endl;
}
}
break;
case NUMBER://cout<<"number "<<name<<endl;
CodeFile<<"code"<<++codenum<<": LIT 0,"<<name<<endl;
break;
case 27:expanalyse();
if(number!=28)
{
cout<<"factor exp error"<<endl;///////////////////////////////////
}
break;
default:return 0;
}
// cout<<"factor finish"<<endl;///////////////
return 1;
}
void sentence::FactorError(int tag)//factor分析错误处理
{
errornum++;
switch(tag)
{
case 0:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<": 标识符 "<<name<<" 未定义!"<<endl;
break;
}
}
int sentence::termanalyse()//term分析
{
int type,oldnum=-1,value=1;
while(1)
{
if(factoranalyse()==1)
{
type=GetWord();
if(type==0||!(number==24||number==25))
{
//BackWord();
value=1;
break;
}
if(oldnum!=-1)
{
if(oldnum==24)
CodeFile<<"code"<<++codenum<<": OPR 0,*"<<endl;
else if(oldnum==25)
{
CodeFile<<"code"<<++codenum<<": OPR 0,/"<<endl;
}
oldnum=-1;
}
else
{
if(number==24||number==25)
{
oldnum=number;
// cout<<oldnum<<endl;getch();getch();
}
else
{
value=1;
BackWord();
break;
}
}
}
else
{
;//error
value=0;
break;
}
}
if(oldnum!=-1)
{
if(oldnum==24)
CodeFile<<"code"<<++codenum<<": OPR 0,*"<<endl;
else
{
CodeFile<<"code"<<++codenum<<": OPR 0,/"<<endl;
}
}
if(value==0)
{
cout<<"term error"<<endl;
}
else
{
cout<<"trem finish"<<endl;
}
return value;
}
void sentence::TermError(int tag)//term分析错误处理
{
}
int sentence::expanalyse()//exp分析
{
int type,tag=0,time,num=-1,oldnum=-1,value;
type=GetWord();
if(type==0)
return 0;
if(!(number==22||number==23))
{
BackWord();
}
else
{
num=number;
}
while(1)
{
switch(tag)
{
case 0:value=termanalyse();
tag=1;
if(oldnum==22)
CodeFile<<"code"<<++codenum<<": OPR 0,+"<<endl;
else if(oldnum==23)
CodeFile<<"code"<<++codenum<<": OPR 0,-"<<endl;
oldnum=-1;
break;
case 1:if(number==22||number==23)
{
tag=0;
oldnum=number;
}
else
{
if(number>=PROGRAM&&number<=ODD)
BackWord();
if(num==22)
CodeFile<<"code"<<++codenum<<": OPR 0,$+"<<endl;
else if(num==23)
CodeFile<<"code"<<++codenum<<": OPR 0,$-"<<endl;
cout<<"exp finish"<<endl;
return 1;
}
break;
}
}
if(num==22)
CodeFile<<"code"<<++codenum<<": OPR 0,$+"<<endl;
else if(num==23)
CodeFile<<"code"<<++codenum<<": OPR 0,$-"<<endl;
if(value==0)
cout<<" exp error"<<endl;
else
cout<<" exp finish"<<endl;
return value;
}
void sentence::ExpError(int tag)//exp分析错误处理
{
}
int sentence::lexpanalyse()//lexp分析
{
int type,value;
char opr[3];
type=GetWord();
if(type==0)
return 0;
if(number==ODD)
{
value=expanalyse();
CodeFile<<"code"<<++codenum<<": OPR 0,odd"<<endl;
}
else
{
BackWord();//回朔文件指针
if(expanalyse()==1)
{
if(number>15&&number<22)//= ,<>,<,<=,>,>=
{
strcpy(opr,name);
value=expanalyse();
if(value==1)
{
CodeFile<<"code"<<++codenum<<": OPR 0,"<<opr<<endl;
}
}
else
{
;//error
// cout<<"lexp error"<<endl;getch();
}
}
else
value=0;
}
if(value==0)
{
cout<<"lexp error"<<endl;
}
else
cout<<"lexp finish"<<endl;
return value;
}
void sentence::LexpError(int tag)//lexp分析错误处理
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -