📄 yuyi.cpp
字号:
}
void B()
{
char idname[4];
int B1_falselist, B1_truelist;
switch(currword)
{
case 17:
fscanf(p, "%d %d", &currword, &entry);
B();
//执行语义动作
//{B1.truelist = B.falselist;
// B1.falselist = B.truelist;}
//*********************************
B1_falselist = B_truelist;
B1_truelist = B_falselist;
//*********************************
B1(B1_truelist, B1_falselist);
//执行语义动作
//{B.truelist = B1.tlist;
// B.falselist = B1.flist;
//*****************************
B_truelist = B1_tlist;
B_falselist = B1_flist;
//*****************************
break;
case 28:
fscanf(p, "%d %d", &currword, &entry);
B();
if(currword == 29)
{
//执行语义动作
//{B1.truelist = B.falselist;
// B1.falselist = B.truelist;}
//*********************************
B1_falselist = B_truelist;
B1_truelist = B_falselist;
//*********************************
fscanf(p, "%d %d", &currword, &entry);
B1(B1_truelist, B1_falselist);
//执行语义动作
//{B.truelist = B1.tlist;
// B.falselist = B1.flist;
//*****************************
B_truelist = B1_tlist;
B_falselist = B1_flist;
//*****************************
}
else
{
printf("Error! “)” lost\n");
}
break;
case 7:
//执行语义动作
//{B.truelist = makelist(nextquad);
// emit(j, , , );
//**********************
B_truelist = sencount;
write("j"," "," "," ");
//**********************
B1_falselist = B_falselist;
B1_truelist = B_truelist;
fscanf(p, "%d %d", &currword, &entry);
B1(B1_truelist, B1_falselist);
//执行语义动作
//{B.truelist = B1.tlist;
// B.falselist = B1.flist;
//*****************************
B_truelist = B1_tlist;
B_falselist = B1_flist;
//*****************************
break;
case 8:
//执行语义动作
//{B.falselist = makelist(nextquad);
// emit(j, , , );
//**********************
B_falselist = sencount;
write("j"," "," "," ");
//**********************
B1_falselist = B_falselist;
B1_truelist = B_truelist;
fscanf(p, "%d %d", &currword, &entry);
B1(B1_truelist, B1_falselist);
//执行语义动作
//{B.truelist = B1.tlist;
// B.falselist = B1.flist;
//*****************************
B_truelist = B1_tlist;
B_falselist = B1_flist;
//*****************************
break;
case 11:
strcpy(idname, ST.SB[entry].idname);
fscanf(p, "%d %d", &currword, &entry);
relop(idname);
E(entry);
//执行语义动作
//{B.truelist = makelist(nextquad);
// B.falselist = makelist(nextquad + 1);
// emit(relop.op, relop.id, E.place, )
// emit(j, , , ,)}
//**************************************
B_truelist = sencount;
B_falselist = sencount + 1;
write(relop_op, relop_id, E_place, " ");
write("j", " ", " ", " ");
//**************************************
B1_falselist = B_falselist;
B1_truelist = B_truelist;
B1(B1_truelist, B1_falselist);
//执行语义
//{B.truelist = B1.tlist;
// B.falselist = B1.flist;
//*****************************
B_truelist = B1_tlist;
B_falselist = B1_flist;
//*****************************
break;
default:
printf("Error!\n");
break;
}
}
void B1(int B1_truelist, int B1_falselist)
{
int N_quad, P_quad, B11_truelist, B11_falselist;
if(currword == 18)
{
fscanf(p, "%d %d", &currword, &entry);
N_quad = N();
B();
//执行语义动作
//{backpatch(B1.truelist, N.quad);
// B11.truelist = B.truelist;
// B11.falselist = merge(B1.falselist, B.falselist);}
//*****************************
backpatch(B1_truelist, N_quad);
B11_truelist = B_truelist;
B11_falselist = merge(B1_falselist, B_falselist);
//*****************************
B1(B11_truelist, B11_falselist);
}
else if(currword == 19)
{
fscanf(p, "%d %d", &currword, &entry);
P_quad = P();
B();
//执行语义动作
//{backpatch(B1.truelist, N.quad);
// B11.truelist = B.truelist;
// B11.falselist = merge(B1.falselist, B.falselist);}
//*****************************
backpatch(B1_falselist, P_quad);
B11_falselist = B_falselist;
B11_truelist = merge(B1_truelist, B_truelist);
//*****************************
B1(B11_truelist, B11_falselist);
}
else if(currword != 29 && currword != 5 && currword != 3 && currword != 6 && currword != 26 && currword != 27 && currword != 12) //这里需要求follow(B),follow(E)
{
printf("Error! Maybe something lost: )? then? do? else? +? *? &? }? |?\n");
}
else
{
//执行语义动作
//{B1.tlist = B1.truelist;
// B1.flist = B1.falselist;
//***************************
B1_tlist = B1_truelist;
B1_flist = B1_falselist;
//****************************
}
}
void relop(char* idname)
{
switch(currword)
{
case 20:
//执行语义动作
//{ relop_op = "j<";
// relop_id = idname;
//****************************
strcpy(relop_op, "j<");
strcpy(relop_id, idname);
//****************************
fscanf(p, "%d %d", &currword, &entry);
break;
case 22:
//执行语义动作
//{ relop_op = "j<=";
// relop_id = idname;
//****************************
strcpy(relop_op, "j<=");
strcpy(relop_id, idname);
//****************************
fscanf(p, "%d %d", &currword, &entry);
break;
case 23:
//执行语义动作
//{ relop_op = "j>=";
// relop_id = idname;
//****************************
strcpy(relop_op, "j>=");
strcpy(relop_id, idname);
//****************************
fscanf(p, "%d %d", &currword, &entry);
break;
case 24:
//执行语义动作
//{ relop_op = "j<>";
// relop_id = idname;
//****************************
strcpy(relop_op, "j<>");
strcpy(relop_id, idname);
//****************************
fscanf(p, "%d %d", &currword, &entry);
break;
default:
printf("Error! Some relation signal lost\n");
break;
}
}
int N()
{
int N_quad;
//执行语义动作
//{N.quad = nextquad;}
//*********************
N_quad = sencount;
//*********************
return N_quad;
}
int P()
{
int P_quad;
//执行语义动作
//{P.quad = nextquad;}
//*********************
P_quad = sencount;
//*********************
return P_quad;
}
void E(int entrance)
{
char E1_place[4];
switch(currword)
{
case 28:
fscanf(p, "%d %d", &currword, &entry);
E(entry);
if(currword == 29)
{
//执行语义E1.place = E.place
//***************************
strcpy(E1_place, E_place);
//***************************
fscanf(p, "%d %d", &currword, &entry);
E1(E1_place);
//执行语义动作E.place = E1.p
//*************
strcpy(E_place, E1_p);
//*************
}
else
printf("Error! “)” lost\n");
break;
case 11:
//执行语义动作E1.place = id.place
//***************************************
strcpy(E1_place, ST.SB[entrance].idname);
//***************************************
fscanf(p, "%d %d", &currword, &entry);
E1(E1_place);
//执行语义动作E.place = E1.p
//*************
strcpy(E_place, E1_p);
//*************
break;
case 10:
//执行语义动作E1.place = const.val
//***************************************
strcpy(E1_place, DT.digitlist[entrance]);
//***************************************
fscanf(p, "%d %d", &currword, &entry);
E1(E1_place);
//执行语义动作E.place = E1.p
//*************
strcpy(E_place, E1_p);
//*************
break;
default:
printf("Error!\n");
break;
}
}
void E1(char* E1_place)
{
char E1_place1[4];
if(currword == 26)
{
fscanf(p, "%d %d", &currword, &entry);
E(entry);
//执行语义动作
//**************************
strcpy(E1_place1, newtemp[varicount++]);
write("+", E_place, E1_place, E1_place1);
//**************************
E1(E1_place1);
}
else if(currword == 27)
{
fscanf(p, "%d %d", &currword, &entry);
E(entry);
//执行语义动作
//**************************
strcpy(E1_place1, newtemp[varicount++]); //这个地方有待考虑
write("*", E_place, E1_place, E1_place1);
//**************************
E1(E1_place1);
}
else if(currword != 6 && currword != 29 && currword != 14 && currword != 3 && currword != 13 && currword != 5 && currword != 18 && currword != 19)
printf("Error! Maybe something lost: +? *? )? else? }? do? then? |? &?\n");
else
{
//执行语义动作E1.p = R1.place
//***********************
strcpy(E1_p, E1_place);
//***********************
}
}
void InitStack()
{
DS.top = 0;
}
void Pop()
{
--DS.top;
}
void Push(int entry)
{
DS.entry[DS.top] = entry;
++DS.top;
}
void ReaddigTable()
{
int seqnum;
int i = 1;
fscanf(r, "%d %s", &seqnum, DT.digitlist[0]);
while(seqnum != END)
{
fscanf(r, "%d %s", &seqnum, DT.digitlist[i]);
++i;
}
DT.quantity = i - 1;
}
void ReadidTable()
{
int seqnum;
int i = 1;
fscanf(q, "%d %s", &seqnum, ST.SB[0].idname);
strcpy(ST.SB[0].type, "$");
while(seqnum != END)
{
fscanf(q, "%d %s", &seqnum, ST.SB[i].idname);
strcpy(ST.SB[0].type, "$"); //将所有类型初始化为$
++i;
}
ST.quantity = i - 1;
}
//函数功能:将属性填入符号表中
void FillTable(char* type, int i)
{
strcpy(ST.SB[DS.entry[i]].type, type);
}
void write(char* op, char* argu1, char* argu2, char* result)
{
strcpy(sen[sencount].op, op);
strcpy(sen[sencount].argu1, argu1);
strcpy(sen[sencount].argu2, argu2);
strcpy(sen[sencount].result, result);
if(sen[sencount].op[0] == 'j') //jmp指令要特殊处理
{
sen[sencount].jmpforth = 0; //相当于jmp四元式的第四个域
sen[sencount].flag = 1;
}
else
sen[sencount].flag = 0;
++sencount;
}
void backpatch(int head, int quad)
{
int q = head, temp,m;
while(q) //未到链表末尾
{
temp = sen[q].jmpforth;
sen[q].jmpforth = quad;
m=sencount;
q = temp;
}
}
int merge(int list1, int list2)
{
int p, head;
if(list2 == 0)
head = list1;
else
{
p = list2;
while(sen[p].jmpforth)
p = sen[p].jmpforth;
sen[p].jmpforth = list1;
head = list2;
}
return head;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -