?? 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 + -