?? scpascal.cpp
字號:
head=head->next;
}
head->nodes->id_type=temp_element1->type_num;
head->nodes->id_type_type=temp_element1->type_type;
head->nodes->function_type=0;
type_pop();
break;
case 25:
temp_element1=type_pop();
para_head=new struct para_list;
para_head->nodes=head;
para_head->next=NULL;
while (!(head->next==NULL))
{
head->nodes->id_type=temp_element1->type_num;
head->nodes->id_type_type=temp_element1->type_type;
head->nodes->function_type=0;
head=head->next;
}
head->nodes->id_type=temp_element1->type_num;
head->nodes->id_type_type=temp_element1->type_type;
head->nodes->function_type=0;
type_pop();
break;
////////////////////////////////////////////////////////////////////////////////////////////////
case 31:
temp_element1=type_pop();
temp_element2=type_pop();
if ((temp_element1->type_num==1)&&(temp_element2->type_num==2))
{
temp_element2->type_nodes->enter->id_type=2;
}else if (temp_element1->type_num!=temp_element2->type_num)
{
printf("The type of expression has fault in line %d\n",temp_element2->type_nodes->lnum);
}
break;
case 34:
temp_element1=type_pop();
if (temp_element1->type_num!=3)
{
printf("The type of expression has fault in line %d\n",temp_element1->type_nodes->lnum);
}
break;
case 35:
temp_element1=type_pop();
if (temp_element1->type_num!=3)
{
printf("The type of expression has fault in line %d\n",temp_element1->type_nodes->lnum);
}
break;
case 36:
type_pop();
break;
case 37:
type_pop();
break;
///////////////////////////////////////////////////////////////////////////////////////
case 39:
temp_element1=type_pop();
temp_element2=type_pop();
if (temp_element1->type_num!=1)
{
printf("The type of expression has fault in line %d\n",temp_element2->type_nodes->lnum);
}
type_push(temp_element2);
break;
case 40:
type_pop();
break;
case 41:
type_pop();
temp_element1=type_pop();
if (temp_element1->type_nodes->enter->function_para!=expr_list)
{
printf("The type of expression has fault in line %d\n",temp_element1->type_nodes->lnum);
}
break;
case 42:
temp_element1=type_pop();
expr_num++;
j=temp_element1->type_num;
for (i=0;i<expr_num;i++)
{
j=j*10;
}
expr_list=expr_list+j;
break;
case 43:
expr_num=0;
temp_element1=type_pop();
expr_list=temp_element1->type_num;
type_push(temp_element1);
break;
case 44:
temp_element1=type_pop();
temp_element2=type_pop();
if (((temp_element1->type_num==1) && (temp_element2->type_num==2))
|| ((temp_element1->type_num==2) && (temp_element2->type_num==1))
|| (temp_element1->type_num==temp_element2->type_num))
{
temp_element1->type_num=3;
temp_element1->type_type=0;
type_push(temp_element1);
}
else {
if (temp_element2->type_nodes->enter!=NULL)
{
printf("The type of expression has fault in line %d\n",temp_element2->type_nodes->lnum);
}else if (temp_element2->type_nodes->enter!=NULL)
{
printf("The type of expression has fault in line %d\n",temp_element1->type_nodes->lnum);
}
temp_element1->type_num=3;
temp_element1->type_type=0;
type_push(temp_element1);
}
break;
case 48:
temp_element1=type_pop();
temp_element2=type_pop();
if ((temp_element1->type_num==1) && (temp_element2->type_num==2))
{
type_push(temp_element2);
}
else if ((temp_element1->type_num==2) && (temp_element2->type_num==1))
{
type_push(temp_element1);
}
else if ((temp_element1->type_num==1) && (temp_element2->type_num==1))
{
type_push(temp_element1);
}
else if ((temp_element1->type_num==2) && (temp_element2->type_num==2))
{
type_push(temp_element1);
}
else {
if (temp_element2->type_nodes->enter!=NULL)
{
printf("The type of expression has fault in line %d\n",temp_element2->type_nodes->lnum);
}else if (temp_element2->type_nodes->enter!=NULL)
{
printf("The type of expression has fault in line %d\n",temp_element1->type_nodes->lnum);
}
temp_element1->type_num=1;
type_push(temp_element1);
}
break;
case 49:
temp_element1=type_pop();
temp_element2=type_pop();
if ((temp_element1->type_num==1) && (temp_element2->type_num==2))
{
type_push(temp_element2);
}
else if ((temp_element1->type_num==2) && (temp_element2->type_num==1))
{
type_push(temp_element1);
}
else if ((temp_element1->type_num==1) && (temp_element2->type_num==1))
{
type_push(temp_element1);
}
else if ((temp_element1->type_num==2) && (temp_element2->type_num==2))
{
type_push(temp_element1);
}
else {
if (temp_element2->type_nodes->enter!=NULL)
{
printf("The type of expression has fault in line %d\n",temp_element2->type_nodes->lnum);
}else if (temp_element2->type_nodes->enter!=NULL)
{
printf("The type of expression has fault in line %d\n",temp_element1->type_nodes->lnum);
}
temp_element1->type_num=1;
type_push(temp_element1);
}
break;
case 52:
temp_element1=type_pop();
temp_element2=type_pop();
if (temp_element1->type_num!=1)
{
printf("The type of expression has fault in line %d\n",temp_element2->type_nodes->lnum);
}
type_push(temp_element2);
break;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/////weilei////////////////////////////////////////////////////////////////////////////////////////////////
void pusherrorelement(int); //壓入元素錯誤棧
int poperrorelement(int); //錯誤棧彈出
struct label_stream* errorRecover(struct label_stream *); //錯誤恢復函數
void shifthandle(L_ListNodePtr x); //移進時將val_stack進棧
void translate(int); //目標代碼生成函數
int parse(){ //語法分析函數
int parse_a,parse_A,parse_S;
struct actionItem aItem;
struct gotoItem gItem;
union action_types Action_Type;
parseState = ok;
push(0);
parse_a = getLabel();
while(1){
parse_S = stateStack[top(1)];
aItem = actionTable[parse_S][parse_a];
printf("%d %d\n",parse_S,parse_a);
if (aItem.typ == shift){
pusherrorelement(parse_a);
push(aItem.ai.state);
if (parseState == ok){
shifthandle(currentPtr);
Action_Type.shift_type=currentPtr;
type_check(0,Action_Type);
}
parse_a = getLabel();
printf("shift\n");
}else if (aItem.typ == reduce){
pop(aItem.ai.ri.length);
poperrorelement(aItem.ai.ri.length);
parse_S = stateStack[top(1)];
parse_A = aItem.ai.ri.leftsym;
gItem = gotoTable[parse_S][parse_A];
if (gItem.typ == ok){
pusherrorelement(parse_A);
push(gItem.gi.state);
}else{
(*gItem.gi.p)();
break;
}
if (parseState == ok){
translate(aItem.ai.ri.formula);
Action_Type.production_num=aItem.ai.ri.formula;
type_check(1,Action_Type);
}
printf("reduce by %d\n",aItem.ai.ri.formula);
}else if (aItem.typ == acc){
printf("acc\n");
return 1;
}else if (aItem.typ == error){
parseState = error;
currentPtr = errorRecover(currentPtr);
parse_S = stateStack[top(1)];
parse_a = getLabel();
}
}
return 0;
}
//------------------------
void InitTranslate(){
//---------------------------------------------------------------------------------------------------/
//初始化
//新建并打開C語言的文件
char name[]="c.c"; //name為文件名
fp=fopen(name,"w"); //主程序中打開文件
//-------------------------------------------------------------------------------------------------/
}
void closeTranslate(){
//關閉C語言的文件
fclose(fp); //主程序中關閉文件
//------------------------------------------------------------------------------------------------
}
//錯誤處理
int * errorstack;
int errortop;
void InitErrorstack(){ //初始化錯誤棧
errorstack = new int[ERRORSTACKNUMBER];
errortop = -1;
}
void pusherrorelement(int pushx){
switch(NowState){
case 0:if (pushx == rw_program) NowState=1;
break;
case 1:if((pushx == rw_var)||(pushx == declarations)) NowState=2;
break;
case 2:if((pushx == rw_function)||(pushx == rw_procedure)) NowState=3;
else if(pushx == rw_begin) NowState=8;
break;
case 3:if((pushx == rw_var)||(pushx == declarations)) NowState=4;
break;
case 4:if(pushx == rw_begin) NowState=5;
break;
case 5:if(pushx == rw_end) NowState=6;
break;
case 6:if(pushx == sem) NowState=2;
else if (pushx == rw_begin)NowState=5;
break;
case 7:if(pushx == subproc_declarations)NowState=2;
break;
case 8:if(pushx == rw_end)NowState=9;
break;
case 9:if(pushx == node)NowState=10;
else if (pushx == rw_begin)NowState=8;
break;
case 10:
break;
default:cout<<"In ERROR STATE!!"<<endl;
break;
}
errorstack[++errortop] = pushx;
}
int poperrorelement(int popnum){
if (errortop-popnum>-1)
errortop=errortop-popnum;
return errorstack[errortop];
}
int topoferror(int topnum){ //查看從棧頂起第topnum個元素
return errorstack[errortop-topnum];
}
struct label_stream * errorRecover(struct label_stream * errorptr){ //錯誤恢復函數
cout<<errorptr->lnum<<" Line have a Error"<<endl;
switch (NowState){
case 0:{//開始狀態,沒接受到programe
cout<<": expect 'program' there!"<<endl;
struct label_stream *newerrorptr = new struct label_stream;
struct label_stream *nullptr = new struct label_stream;
nullptr->next=newerrorptr;
newerrorptr->label_type = rw_program;
newerrorptr->next = errorptr;
errorptr = nullptr;
return errorptr;
}
break;
case 1:{//主程序申明狀態
cout<<"main program declaration parameter ERROR!"<<endl;
switch(topoferror(0)){
case rpare:{
if ((topoferror(1) == identifier_list)&&((errorptr->label_type == rw_var)||(errorptr->label_type == rw_begin)||(errorptr->label_type == rw_function)||(errorptr->label_type == rw_procedure))){
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;
default:
{
cout<<"main declaration auto recovery!"<<endl;
while(topoferror(0) != rw_program){
pop(1);
poperrorelement(1);
}
while((errorptr->label_type != rw_var)&&(errorptr->label_type != rw_begin)&&(errorptr->label_type != rw_function)&&(errorptr->label_type != rw_procedure)){
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 *newerrorptr5 = new struct label_stream;
struct label_stream *nullptr = new struct label_stream;
newerrorptr1->label_type = id;
newerrorptr2->label_type = lpare;
newerrorptr3->label_type = id;
newerrorptr4->label_type = rpare;
newerrorptr5->label_type = sem;
newerrorptr5->next = errorptr;
newerrorptr4->next = newerrorptr5;
newerrorptr3->next = newerrorptr4;
newerrorptr2->next = newerrorptr3;
newerrorptr1->next = newerrorptr2;
nullptr->next=newerrorptr1;
errorptr=nullptr;
return errorptr;
}
break;
}
}
}
break;
case 2:{//var狀態,即是申明狀態
cout<<"main 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;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -