⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 table.c

📁 简介:PL0语言是pascal语言的一个子集。编译VC工程之前
💻 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 + -