📄 scpascal.cpp
字号:
newerrorptr->next = errorptr;
errorptr = nullptr;
return errorptr;
}
break;
case rw_real:
case rw_integer:
case rw_boolean:
{
if ((errorptr->label_type == rw_function)||(errorptr->label_type == rw_procedure)||(errorptr->label_type == rw_begin))
if ((topoferror(1) == rw_of)||(topoferror(1) == colon)){
cout<<": expect ';' there!"<<endl;
struct label_stream *newerrorptr = new struct label_stream;
struct label_stream *nullptr = new struct label_stream;
nullptr->next=newerrorptr;
newerrorptr->label_type = sem;
newerrorptr->next = errorptr;
errorptr = nullptr;
return errorptr;
}
}
break;
case id:
{
if ((errorptr->label_type == rw_real)||(errorptr->label_type == rw_integer)||(errorptr->label_type == rw_boolean)){
cout<<": expect ':'there "<<endl;
struct label_stream *newerrorptr = new struct label_stream;
struct label_stream *nullptr = new struct label_stream;
nullptr->next=newerrorptr;
newerrorptr->label_type = colon;
newerrorptr->next = errorptr;
errorptr = nullptr;
return errorptr;
}
}
default:
{
struct label_stream *nullptr = new struct label_stream;
nullptr = errorptr;
errorptr = errorptr->next;
while(topoferror(0) != program_head){
pop(1);
poperrorelement(1);
}
while((errorptr->label_type != rw_begin)&&(errorptr->label_type != rw_function)||(errorptr->label_type != rw_procedure)){
errorptr=errorptr->next;
nullptr = nullptr->next;
}
return nullptr;
}
}
}
break;
case 3:{//接受function或procedure,进入子程序的申明状态
cout<<"subproc decalration parameter error!"<<endl;
int i=0;
while((topoferror(i)!=rw_function)&&(topoferror(i)!=rw_procedure)){
i=i+1;
cout<<topoferror(i)<<endl;
}
switch(topoferror(i)){
case rw_function:{
cout<<"auto recovery this function parameter!"<<endl;
while(topoferror(0) != rw_function){
pop(1);
poperrorelement(1);
}
while((errorptr->label_type!=rw_var)&&(errorptr->label_type != rw_begin)){
errorptr=errorptr->next;
}
struct label_stream *newerrorptr1 = new struct label_stream;
struct label_stream *newerrorptr2 = new struct label_stream;
struct label_stream *newerrorptr3 = new struct label_stream;
struct label_stream *newerrorptr4 = new struct label_stream;
struct label_stream *nullptr = new struct label_stream;
newerrorptr1->label_type = id;
newerrorptr2->label_type = colon;
newerrorptr3->label_type = rw_integer;
newerrorptr4->label_type = sem;
newerrorptr4->next=errorptr;
newerrorptr3->next=newerrorptr4;
newerrorptr2->next=newerrorptr3;
newerrorptr1->next=newerrorptr2;
nullptr->next=newerrorptr1;
errorptr = nullptr;
return errorptr;
}
break;
case rw_procedure:{
cout<<"auto recovery this procedure parameter!"<<endl;
while(topoferror(0) != rw_procedure){
pop(1);
poperrorelement(1);
}
while((errorptr->label_type!=rw_var)&&(errorptr->label_type != rw_begin)){
errorptr=errorptr->next;
}
struct label_stream *newerrorptr1 = new struct label_stream;
struct label_stream *newerrorptr2 = new struct label_stream;
struct label_stream *nullptr = new struct label_stream;
newerrorptr1->label_type = id;
newerrorptr2->label_type = sem;
newerrorptr2->next=errorptr;
newerrorptr1->next=newerrorptr2;
nullptr->next=newerrorptr1;
errorptr = nullptr;
return errorptr;
}
break;
default:{
cout<<"auto funorpro recovery!!"<<endl;
while((topoferror(0) != subproc_declarations)&&(topoferror(0) != declarations)){
pop(1);
poperrorelement(1);
}
while((errorptr->label_type!=rw_var)&&(errorptr->label_type != rw_begin)){
errorptr=errorptr->next;
}
struct label_stream *newerrorptr1 = new struct label_stream;
struct label_stream *newerrorptr2 = new struct label_stream;
struct label_stream *newerrorptr3 = new struct label_stream;
struct label_stream *nullptr = new struct label_stream;
newerrorptr1->label_type = rw_procedure;
newerrorptr2->label_type = id;
newerrorptr3->label_type = sem;
newerrorptr3->next=errorptr;
newerrorptr2->next=newerrorptr3;
newerrorptr1->next=newerrorptr2;
nullptr->next=newerrorptr1;
errorptr = nullptr;
return errorptr;
}
break;
}
}
break;
case 4:{//子程序接受var后的状态,申明状态
cout<<"subproc declaration error!"<<endl;
switch (topoferror(0)){//栈顶的符号
case rw_end:
{
cout<<": expect ';' there! "<<endl;
struct label_stream *newerrorptr = new struct label_stream;
struct label_stream *nullptr = new struct label_stream;
nullptr->next=newerrorptr;
newerrorptr->label_type = sem;
newerrorptr->next = errorptr;
errorptr = nullptr;
return errorptr;
}
break;
case rw_real:
case rw_integer:
case rw_boolean:
{
if ((errorptr->label_type == rw_function)||(errorptr->label_type == rw_procedure)||(errorptr->label_type == rw_begin))
if ((topoferror(1) == rw_of)||(topoferror(1) == colon)){
cout<<": expect ';' there!"<<endl;
struct label_stream *newerrorptr = new struct label_stream;
struct label_stream *nullptr = new struct label_stream;
nullptr->next=newerrorptr;
newerrorptr->label_type = sem;
newerrorptr->next = errorptr;
errorptr = nullptr;
return errorptr;
}
}
break;
case id:
{
if ((errorptr->label_type == rw_real)||(errorptr->label_type == rw_integer)||(errorptr->label_type == rw_boolean)){
cout<<": expect ':'there "<<endl;
struct label_stream *newerrorptr = new struct label_stream;
struct label_stream *nullptr = new struct label_stream;
nullptr->next=newerrorptr;
newerrorptr->label_type = colon;
newerrorptr->next = errorptr;
errorptr = nullptr;
return errorptr;
}
}
default:
{
struct label_stream *nullptr = new struct label_stream;
nullptr = errorptr;
errorptr = errorptr->next;
while(topoferror(0) != subproc_head){
pop(1);
poperrorelement(1);
}
while(errorptr->label_type != rw_begin){
errorptr=errorptr->next;
nullptr = nullptr->next;
}
return nullptr;
}
}
}
break;
case 5:{//子程序开始进入begin状态
cout<<"subproc have a ERROR!"<<endl;
if ((topoferror(0)==sem)&&(errorptr->label_type==rw_end)){//程序end前语句有分号
pop(1);
poperrorelement(1);
struct label_stream *nullptr = new struct label_stream;
nullptr->next=errorptr;
errorptr=nullptr;
cout<<"before end have error ';'"<<endl;
return errorptr;
}
while((topoferror(0) != sem)&&(topoferror(0)!= rw_begin)){
pop(1);
poperrorelement(1);
}
while((errorptr->label_type != sem)&&(errorptr->label_type != rw_end)){
errorptr=errorptr->next;
}
struct label_stream *nullptr = new struct label_stream;
nullptr->next=errorptr;
errorptr=nullptr;
cout<<"auto recovery statement error"<<endl;
return errorptr;
}
break;
case 6:{//子程序已经接受end,等待接受';'状态
cout<<": expect ';' there!"<<endl;
struct label_stream *newerrorptr = new struct label_stream;
struct label_stream *nullptr = new struct label_stream;
nullptr->next=newerrorptr;
newerrorptr->label_type = sem;
newerrorptr->next = errorptr;
errorptr = nullptr;
return errorptr;
}
break;
case 7:{//子程序已经完成,但未规约完成
while(topoferror(0)!=rw_program){
pop(1);
poperrorelement(1);
}
while(errorptr->label_type!=DOLLAR){
errorptr=errorptr->next;
}
struct label_stream *newerrorptr1 = new struct label_stream;
struct label_stream *newerrorptr2 = new struct label_stream;
struct label_stream *newerrorptr3 = new struct label_stream;
struct label_stream *newerrorptr4 = new struct label_stream;
struct label_stream *nullptr = new struct label_stream;
newerrorptr1->label_type = id;
newerrorptr2->label_type = sem;
newerrorptr3->label_type = rw_begin;
newerrorptr4->label_type = rw_end;
newerrorptr4->next=errorptr;
newerrorptr3->next=newerrorptr4;
newerrorptr2->next=newerrorptr3;
newerrorptr1->next=newerrorptr2;
nullptr->next=newerrorptr1;
errorptr = nullptr;
return errorptr;
}
break;
case 8:{//主程序接受begin,正在主程序中
cout<<"main program have a ERROR!"<<endl;
if ((topoferror(0)==sem)&&(errorptr->label_type==rw_end)){//程序end前语句有分号
pop(1);
poperrorelement(1);
struct label_stream *nullptr = new struct label_stream;
nullptr->next=errorptr;
errorptr=nullptr;
cout<<"before end have error ';'"<<endl;
return errorptr;
}
while((topoferror(0) != sem)&&(topoferror(0)!= rw_begin)){
pop(1);
poperrorelement(1);
}
while((errorptr->label_type != sem)&&(errorptr->label_type != rw_end)){
errorptr=errorptr->next;
}
if(errorptr->label_type == sem) errorptr=errorptr->next;
struct label_stream *nullptr = new struct label_stream;
nullptr->next=errorptr;
errorptr=nullptr;
cout<<"auto recovery error statement!"<<endl;
return errorptr;
}
break;
case 9:{//得到end没有得到'.'
if(errorptr->label_type==DOLLAR){
cout<<"end without '.'"<<endl;
struct label_stream *nullptr = new struct label_stream;
struct label_stream *newerrorptr = new struct label_stream;
newerrorptr->next = errorptr;
newerrorptr->label_type = node;
nullptr->next=newerrorptr;
errorptr=nullptr;
}else{
while(errorptr->label_type!=DOLLAR){
errorptr=errorptr->next;
}
cout<<":'.' expect after end!"<<endl;
struct label_stream *nullptr = new struct label_stream;
nullptr->next=errorptr;
errorptr=nullptr;
}
return errorptr;
}
break;
case 10:{//得到.程序完成
while(topoferror(0)!=subproc_declarations){
pop(1);
poperrorelement(1);
}
while(errorptr->label_type==DOLLAR){
errorptr=errorptr->next;
}
struct label_stream *newerrorptr1 = new struct label_stream;
struct label_stream *newerrorptr2 = new struct label_stream;
struct label_stream *newerrorptr3 = new struct label_stream;
struct label_stream *newerrorptr4 = new struct label_stream;
struct label_stream *nullptr = new struct label_stream;
newerrorptr1->label_type = rw_begin;
newerrorptr2->label_type = id;
newerrorptr3->label_type = rw_end;
newerrorptr4->label_type = node;
newerrorptr4->next=errorptr;
newerrorptr3->next=newerrorptr4;
newerrorptr2->next=newerrorptr3;
newerrorptr1->next=newerrorptr2;
nullptr->next=newerrorptr1;
errorptr = nullptr;
return errorptr;
}
break;
default:{
cout<<"ERROR of your input!"<<endl;
while(topoferror(0)!=rw_program){
pop(1);
poperrorelement(1);
}
while(errorptr->label_type!=DOLLAR){
errorptr=errorptr->next;
}
struct label_stream *newerrorptr1 = new struct label_stream;
struct label_stream *newerrorptr2 = new struct label_stream;
struct label_stream *newerrorptr3 = new struct label_stream;
struct label_stream *newerrorptr4 = new struct label_stream;
struct label_stream *nullptr = new struct label_stream;
newerrorptr1->label_type = id;
newerrorptr2->label_type = sem;
newerrorptr3->label_type = rw_begin;
newerrorptr4->label_type = rw_end;
newerrorptr4->next=errorptr;
newerrorptr3->next=newerrorptr4;
newerrorptr2->next=newerrorptr3;
newerrorptr1->next=newerrorptr2;
nullptr->next=newerrorptr1;
errorptr = nullptr;
return errorptr;
}
break;
}
}
void InitErrRecovery(){
InitErrorstack(); //初始化错误栈;
}
//语法分析器的构造
void main(){
InitLex(); //初始化词法分析
InitTable(); //初始化LR1分析表
InitErrRecovery(); //初始化错误恢复表
//testTable();
//记号流的获得
currentPtr = Lhead; //记录记号流头指针
property = NULL;
//
InitTranslate(); //初始化翻译状态
parse(); //语法分析
closeTranslate(); //结束翻译
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -