📄 table.c
字号:
#include <stdio.h>
#include <string.h>
#include "define.h"
tableitem table[IDMAXCOUNT];
int kind, lev, num;
int position(ident_t id)
{
int i;
for( i=tx; i>=0; i--)
{
if(strcmp(table[i].name,id)==0)
{
return(i);
}
}
return(-1);
}
int enter(ident_t id)
{
int i,j,pl;
tx++;
strcpy(table[tx].name,id);
table[tx].kind = kind;
switch (kind)
{
case constant:
table[tx].val = num;
break;
case variable:
table[tx].level = lev;
table[tx].adr = dx[lev];
dx[lev]++;
break;
case var_array:
table[tx].level = lev;
table[tx].adr = dx[lev];
table[tx].beginindex = dx1;
table[tx].endindex = dx2;
dx[lev]+=dx1;
for (i=dx1;i<=dx2;i++)
{
table[tx+i].level = lev;
table[tx+i].adr = dx[lev];
dx[lev]++;
}
tx+=dx2;
break;
case procedure:
table[tx].level = lev;
table[tx].para = 0;
tx0[lev] = tx;
break;
case parameter:
j=tx;
while (table[j].kind!=procedure)
j--;
pl = table[j].level;
table[tx].level = pl;
table[tx].adr = dx[pl];
table[j].para++;
dx[pl]++;
break;
}
return 1;
}
void operate(int op)
{
switch(op)
{
case 'n':
gen(OPR,0,1);
break;
case 'p':
break;
case '+':
gen(OPR,0,2);
break;
case '-':
gen(OPR,0,3);
break;
case '*':
gen(OPR,0,4);
break;
case '/':
gen(OPR,0,5);
break;
default:
break;
}
}
void proc_dec()
{
code[table[tx0[lev-1]].adr].a = cx;
table[tx0[lev-1]].adr = cx;
table[tx0[lev]].size = dx[lev];
cx0[lev] = cx;
gen(INI, 0, dx[lev]);
}
void asgn_stmt(ident_t id)
{
int i = position(id);
switch(table[i].kind)
{
case variable:
gen(STO, lev-table[i].level, table[i].adr);
break;
case var_array:
gen(STOX, lev-table[i].level, 0);
break;
default:
break;
}
}
void array_access(ident_t id)
{
int i = position(id);
gen(LIT,0, table[i].adr);
gen(OPR,0,2);
}
int array_bound(ident_t id)
{
int i = position(id);
return table[i].val;
}
void call_stmt(ident_t id,int para_num)
{
int i,j;
i = position(id);
for (j=tx0[lev]+table[tx0[lev]].para; j>tx0[lev]; j--)
{
gen(STO,lev-table[j].level,table[j].adr);
}
gen(CAL,lev-table[i].level,table[i].adr);
}
void read_stmt(ident_t id)
{
int i=position(id);
switch(table[i].kind)
{
case variable:
gen(OPR,0,16);
gen(STO,lev-table[i].level,table[i].adr);
break;
case var_array:
break;
default:
break;
}
}
void factor_var(ident_t id)
{
int lev_interval;
int i=position(id);
lev_interval = lev-table[i].level;
switch (table[i].kind)
{
case constant:
gen(LIT, 0, table[i].val);
break;
case variable:
gen(LOD, lev_interval, table[i].adr);
break;
case var_array:
gen(LODX, lev_interval,0);
break;
case parameter:
gen(LOD, lev_interval, table[i].adr);
break;
case procedure:
break;
}
}
void exp_r_exp(enum relation r)
{
switch (r)
{
case eql:
gen(OPR, 0, 8);
break;
case neq:
gen(OPR, 0, 9);
break;
case lss:
gen(OPR, 0, 10);
break;
case geq:
gen(OPR, 0, 11);
break;
case gtr:
gen(OPR, 0, 12);
break;
case leq:
gen(OPR, 0, 13);
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -