Initial revision

This commit is contained in:
kaashoek
1987-11-20 11:12:07 +00:00
parent 9947059dcc
commit 75e0c5f7ed
36 changed files with 2660 additions and 0 deletions

View File

@@ -0,0 +1,436 @@
#include "decl.h"
t_C_info C_info[] = {
/* NO_ARGS */ { "()\n{\n",
{ 0, 0, 0, 0},
{ 0, 0, 0, 0},
{ 0, 0, 0, 0}},
/* C_ARG */ { "( c)\narith c;\n{\n",
{ ARITH, 0, 0, 0},
{ "c", 0, 0, 0},
{ "c", 0, 0, 0}},
/* D_ARG */ { "( d)\narith d;\n{\n",
{ ARITH, 0, 0, 0},
{ "d", 0, 0, 0},
{ "d", 0, 0, 0}},
/* F_ARG */ { "( f)\narith f;\n{\n",
{ ARITH, 0, 0, 0},
{ "f", 0, 0, 0},
{ "f", 0, 0, 0}},
/* L_ARG */ { "( l)\narith l;\n{\n",
{ ARITH, 0, 0, 0},
{ "l", 0, 0, 0},
{ "(l >= 0 ? l + EM_BSIZE : l)", 0, 0, 0}},
/* N_ARG */ { "( n)\narith n;\n{\n",
{ ARITH, 0, 0, 0},
{ "n", 0, 0, 0},
{ "n", 0, 0, 0}},
/* O_ARG */ { "( o)\narith o;\n{\n",
{ ARITH, 0, 0, 0},
{ "o", 0, 0, 0},
{ "o", 0, 0, 0}},
/* R_ARG */ { "( r)\narith r;\n{\n",
{ ARITH, 0, 0, 0},
{ "r", 0, 0, 0},
{ "r", 0, 0, 0}},
/* S_ARG */ { "( s)\narith s;\n{\n",
{ ARITH, 0, 0, 0},
{ "s", 0, 0, 0},
{ "s", 0, 0, 0}},
/* Z_ARG */ { "( z)\narith z;\n{\n",
{ ARITH, 0, 0, 0},
{ "z", 0, 0, 0},
{ "z", 0, 0, 0}},
/* W_ARG */ { "( w)\narith w;\n{\n",
{ ARITH, 0, 0, 0},
{ "w", 0, 0, 0},
{ "w", 0, 0, 0}},
/* EXTERNAL */ { "( g)\narith g;\n{\n",
{ STRING, ARITH, 0, 0},
{ "FAKE-ARGUMENT", "g", 0, 0},
{ "extnd_hol( holno)", "g", 0, 0}},
/* EXTERNAL_DNAM*/ { "( g, o)\nchar *g;\narith o;\n{\n",
{ STRING, ARITH, 0, 0},
{ "g", "o", 0, 0},
{ "extnd_dnam( g)", "o", 0, 0}},
/* EXTERNAL_DLB */ { "( g, o)\nchar *g;\narith o;\n{\n",
{ STRING, ARITH, 0, 0},
{ "g", "o", 0, 0},
{ "extnd_dlb( g)", "o", 0, 0}},
/* P_ARG */ { "( p)\nchar *p;\n{\n",
{ STRING, 0, 0, 0},
{ "p", 0, 0, 0},
{ "extnd_name( p)", 0, 0, 0}},
/* B_ARG */ { "( b)\nlabel b;\n{\n",
{ STRING, 0, 0, 0},
{ "b", 0, 0, 0},
{ "extnd_ilb( b)", 0, 0, 0}},
/* STRING+ARITH */ { "( val, sz)\nchar *val;\narith sz;\n{\n",
{ STRING, ARITH, 0, 0},
{ "val", "sz", 0, 0},
{ "val", "sz", 0, 0}},
/* BSS_EXT_DNAM */ { "( n, g, o, i)\nchar *g;\narith n, o;\nint i;\n{\n",
{ ARITH, STRING, ARITH, INT},
{ "n", "g", "o", "i"},
{ "n", "extnd_dnam( g)", "o", "i"}},
/* BSS_EXT_DLB */ { "( n, g, o, i)\nchar *g;\narith n, o;\nint i;\n{\n",
{ ARITH, STRING, ARITH, INT},
{ "n", "g", "o", "i"},
{ "n", "extnd_dlb( g)", "o", "i"}},
/* BSS_STR+AR */ { "( n, val, sz, i)\nchar *val;\narith n, sz;\nint i;\n{\n",
{ ARITH, STRING, ARITH, INT},
{ "n", "val", "sz", "i"},
{ "n", "val", "sz", "i"}},
/* BSS_W_ARG */ { "( n, w, i)\narith n, w;\nint i;\n{\n",
{ ARITH, ARITH, INT, 0},
{ "n", "w", "i", 0},
{ "n", "w", "i", 0}},
/* BSS_PNAM */ { "( n, p, i)\narith n;\nchar *p;int i;\n\n{\n",
{ ARITH, STRING, INT, 0},
{ "n", "p", "i", 0},
{ "n", "extnd_name( p)", "i", 0}},
/* BSS_ILB */ { "( n, b, i)\narith n;\nlabel b;int i;\n\n{\n",
{ ARITH, STRING, INT, 0},
{ "n", "b", "i", 0},
{ "n", "extnd_ilb( b)", "i", 0}},
/* ID+N_ARG */ { "( p, n)\nchar *p;\narith n;\n{\n",
{ STRING, ARITH, 0, 0},
{ "p", "n", 0, 0},
{ "extnd_name( p)", "n", 0, 0}},
/* ARITH+ARITH */ { "( n, w)\narith n, w;\n{\n",
{ ARITH, ARITH, 0, 0},
{ "n", "w", 0, 0},
{ "n", "w", 0, 0}},
/* EXT_DNAM */ { "( g)\nchar *g;\n{\n",
{ STRING, 0, 0, 0},
{ "g", 0, 0, 0},
{ "extnd_dnam( g)", 0, 0, 0}},
/* EXT_DLB */ { "( g)\nchar *g;\n{\n",
{ STRING, 0, 0, 0},
{ "g", 0, 0, 0},
{ "extnd_dlb( g)", 0, 0, 0}},
/* ONE_INT */ { "( i)\nint i;\n{\n",
{ INT, 0, 0, 0},
{ "i", 0, 0, 0},
{ "i", 0, 0, 0}},
/* _STRING */ { "( str)\nchar *str;\n{\n",
{ STRING, 0, 0, 0},
{ "str", 0, 0, 0},
{ "str", 0, 0, 0}}
}, *C_instr_info;
#define N_INSTR 269
struct { char *name; int class, segment;}
EM_instr[ N_INSTR ] = {
{ "C_aar", W_ARG, SEGTXT},
{ "C_aar_narg", NO_ARGS, SEGTXT},
{ "C_adf", W_ARG, SEGTXT},
{ "C_adf_narg", NO_ARGS, SEGTXT},
{ "C_adi", W_ARG, SEGTXT},
{ "C_adi_narg", NO_ARGS, SEGTXT},
{ "C_adp", F_ARG, SEGTXT},
{ "C_ads", W_ARG, SEGTXT},
{ "C_ads_narg", NO_ARGS, SEGTXT},
{ "C_adu", W_ARG, SEGTXT},
{ "C_adu_narg", NO_ARGS, SEGTXT},
{ "C_and", W_ARG, SEGTXT},
{ "C_and_narg", NO_ARGS, SEGTXT},
{ "C_asp", F_ARG, SEGTXT},
{ "C_ass", W_ARG, SEGTXT},
{ "C_ass_narg", NO_ARGS, SEGTXT},
{ "C_beq", B_ARG, SEGTXT},
{ "C_bge", B_ARG, SEGTXT},
{ "C_bgt", B_ARG, SEGTXT},
{ "C_ble", B_ARG, SEGTXT},
{ "C_blm", Z_ARG, SEGTXT},
{ "C_bls", W_ARG, SEGTXT},
{ "C_bls_narg", NO_ARGS, SEGTXT},
{ "C_blt", B_ARG, SEGTXT},
{ "C_bne", B_ARG, SEGTXT},
{ "C_bra", B_ARG, SEGTXT},
{ "C_bss_cst", BSS_W_ARG, SEGBSS},
{ "C_bss_dlb", BSS_EXT_DLB, SEGBSS},
{ "C_bss_dnam", BSS_EXT_DNAM, SEGBSS},
{ "C_bss_fcon", BSS_STR_AR, SEGBSS},
{ "C_bss_icon", BSS_STR_AR, SEGBSS},
{ "C_bss_ilb", BSS_ILB, SEGBSS},
{ "C_bss_pnam", BSS_PNAM, SEGBSS},
{ "C_bss_ucon", BSS_STR_AR, SEGBSS},
{ "C_cai", NO_ARGS, SEGTXT},
{ "C_cal", P_ARG, SEGTXT},
{ "C_cff", NO_ARGS, SEGTXT},
{ "C_cfi", NO_ARGS, SEGTXT},
{ "C_cfu", NO_ARGS, SEGTXT},
{ "C_cif", NO_ARGS, SEGTXT},
{ "C_cii", NO_ARGS, SEGTXT},
{ "C_ciu", NO_ARGS, SEGTXT},
{ "C_close", NO_ARGS, NOSEG},
{ "C_cmf", W_ARG, SEGTXT},
{ "C_cmf_narg", NO_ARGS, SEGTXT},
{ "C_cmi", W_ARG, SEGTXT},
{ "C_cmi_narg", NO_ARGS, SEGTXT},
{ "C_cmp", NO_ARGS, SEGTXT},
{ "C_cms", W_ARG, SEGTXT},
{ "C_cms_narg", NO_ARGS, SEGTXT},
{ "C_cmu", W_ARG, SEGTXT},
{ "C_cmu_narg", NO_ARGS, SEGTXT},
{ "C_com", W_ARG, SEGTXT},
{ "C_com_narg", NO_ARGS, SEGTXT},
{ "C_con_cst", C_ARG, SEGCON},
{ "C_con_dlb", EXTERNAL_DLB, SEGCON},
{ "C_con_dnam", EXTERNAL_DNAM, SEGCON},
{ "C_con_fcon", STRING_ARITH, SEGCON},
{ "C_con_icon", STRING_ARITH, SEGCON},
{ "C_con_ilb", B_ARG, SEGCON},
{ "C_con_pnam", P_ARG, SEGCON},
{ "C_con_scon", STRING_ARITH, SEGCON},
{ "C_con_ucon", STRING_ARITH, SEGCON},
{ "C_csa", W_ARG, SEGTXT},
{ "C_csa_narg", NO_ARGS, SEGTXT},
{ "C_csb", W_ARG, SEGTXT},
{ "C_csb_narg", NO_ARGS, SEGTXT},
{ "C_cst", C_ARG, NOSEG},
{ "C_cuf", NO_ARGS, SEGTXT},
{ "C_cui", NO_ARGS, SEGTXT},
{ "C_cuu", NO_ARGS, SEGTXT},
{ "C_dch", NO_ARGS, SEGTXT},
{ "C_dec", NO_ARGS, SEGTXT},
{ "C_dee", EXTERNAL, SEGTXT},
{ "C_dee_dlb", EXTERNAL_DLB, SEGTXT},
{ "C_dee_dnam", EXTERNAL_DNAM, SEGTXT},
{ "C_del", L_ARG, SEGTXT},
{ "C_df_dlb", EXT_DLB, NOSEG},
{ "C_df_dnam", EXT_DNAM, NOSEG},
{ "C_df_ilb", B_ARG, SEGTXT},
{ "C_dlb", STRING_ARITH, SEGTXT},
{ "C_dnam", STRING_ARITH, SEGTXT},
{ "C_dup", S_ARG, SEGTXT},
{ "C_dus", W_ARG, SEGTXT},
{ "C_dus_narg", NO_ARGS, SEGTXT},
{ "C_dvf", W_ARG, SEGTXT},
{ "C_dvf_narg", NO_ARGS, SEGTXT},
{ "C_dvi", W_ARG, SEGTXT},
{ "C_dvi_narg", NO_ARGS, SEGTXT},
{ "C_dvu", W_ARG, SEGTXT},
{ "C_dvu_narg", NO_ARGS, SEGTXT},
{ "C_end", Z_ARG, SEGTXT},
{ "C_end_narg", NO_ARGS, SEGTXT},
{ "C_exa_dlb", EXT_DLB, NOSEG},
{ "C_exa_dnam", EXT_DNAM, NOSEG},
{ "C_exc", ARITH_ARITH, NOSEG},
{ "C_exg", W_ARG, SEGTXT},
{ "C_exg_narg", NO_ARGS, SEGTXT},
{ "C_exp", P_ARG, SEGTXT},
{ "C_fcon", STRING_ARITH, SEGTXT},
{ "C_fef", W_ARG, SEGTXT},
{ "C_fef_narg", NO_ARGS, SEGTXT},
{ "C_fif", W_ARG, SEGTXT},
{ "C_fif_narg", NO_ARGS, SEGTXT},
{ "C_fil", EXTERNAL, SEGTXT},
{ "C_fil_dlb", EXTERNAL_DLB, SEGTXT},
{ "C_fil_dnam", EXTERNAL_DNAM, SEGTXT},
{ "C_gto", EXTERNAL, SEGTXT},
{ "C_gto_dlb", EXTERNAL_DLB, SEGTXT},
{ "C_gto_dnam", EXTERNAL_DNAM, SEGTXT},
{ "C_hol_cst", BSS_W_ARG, SEGHOL},
{ "C_hol_dlb", BSS_EXT_DLB, SEGHOL},
{ "C_hol_dnam", BSS_EXT_DNAM, SEGHOL},
{ "C_hol_fcon", BSS_STR_AR, SEGHOL},
{ "C_hol_icon", BSS_STR_AR, SEGHOL},
{ "C_hol_ilb", BSS_ILB, SEGHOL},
{ "C_hol_pnam", BSS_PNAM, SEGHOL},
{ "C_hol_ucon", BSS_STR_AR, SEGHOL},
{ "C_icon", STRING_ARITH, SEGTXT},
{ "C_ilb", B_ARG, SEGTXT},
{ "C_ina_dlb", EXT_DLB, SEGTXT},
{ "C_ina_dnam", EXT_DNAM, SEGTXT},
{ "C_inc", NO_ARGS, SEGTXT},
{ "C_ine", EXTERNAL, SEGTXT},
{ "C_ine_dlb", EXTERNAL_DLB, SEGTXT},
{ "C_ine_dnam", EXTERNAL_DNAM, SEGTXT},
{ "C_init", ARITH_ARITH, SEGTXT},
{ "C_inl", L_ARG, SEGTXT},
{ "C_inn", W_ARG, SEGTXT},
{ "C_inn_narg", NO_ARGS, SEGTXT},
{ "C_inp", P_ARG, NOSEG},
{ "C_ior", W_ARG, SEGTXT},
{ "C_ior_narg", NO_ARGS, SEGTXT},
{ "C_lae", EXTERNAL, SEGTXT},
{ "C_lae_dlb", EXTERNAL_DLB, SEGTXT},
{ "C_lae_dnam", EXTERNAL_DNAM, SEGTXT},
{ "C_lal", L_ARG, SEGTXT},
{ "C_lar", W_ARG, SEGTXT},
{ "C_lar_narg", NO_ARGS, SEGTXT},
{ "C_ldc", D_ARG, SEGTXT},
{ "C_lde", EXTERNAL, SEGTXT},
{ "C_lde_dlb", EXTERNAL_DLB, SEGTXT},
{ "C_lde_dnam", EXTERNAL_DNAM, SEGTXT},
{ "C_ldf", F_ARG, SEGTXT},
{ "C_ldl", L_ARG, SEGTXT},
{ "C_lfr", S_ARG, SEGTXT},
{ "C_lil", L_ARG, SEGTXT},
{ "C_lim", NO_ARGS, SEGTXT},
{ "C_lin", N_ARG, SEGTXT},
{ "C_lni", NO_ARGS, SEGTXT},
{ "C_loc", C_ARG, SEGTXT},
{ "C_loe", EXTERNAL, SEGTXT},
{ "C_loe_dlb", EXTERNAL_DLB, SEGTXT},
{ "C_loe_dnam", EXTERNAL_DNAM, SEGTXT},
{ "C_lof", F_ARG, SEGTXT},
{ "C_loi", O_ARG, SEGTXT},
{ "C_lol", L_ARG, SEGTXT},
{ "C_lor", R_ARG, SEGTXT},
{ "C_los", W_ARG, SEGTXT},
{ "C_los_narg", NO_ARGS, SEGTXT},
{ "C_lpb", NO_ARGS, SEGTXT},
{ "C_lpi", P_ARG, SEGTXT},
{ "C_lxa", N_ARG, SEGTXT},
{ "C_lxl", N_ARG, SEGTXT},
{ "C_magic", NO_ARGS, NOSEG},
{ "C_mes_begin", ONE_INT, NOSEG},
{ "C_mes_end", NO_ARGS, NOSEG},
{ "C_mlf", W_ARG, SEGTXT},
{ "C_mlf_narg", NO_ARGS, SEGTXT},
{ "C_mli", W_ARG, SEGTXT},
{ "C_mli_narg", NO_ARGS, SEGTXT},
{ "C_mlu", W_ARG, SEGTXT},
{ "C_mlu_narg", NO_ARGS, SEGTXT},
{ "C_mon", NO_ARGS, SEGTXT},
{ "C_ngf", W_ARG, SEGTXT},
{ "C_ngf_narg", NO_ARGS, SEGTXT},
{ "C_ngi", W_ARG, SEGTXT},
{ "C_ngi_narg", NO_ARGS, SEGTXT},
{ "C_nop", NO_ARGS, SEGTXT},
{ "C_open", _STRING, NOSEG},
{ "C_pnam", P_ARG, NOSEG},
{ "C_pro", P_ARG, SEGTXT},
{ "C_pro_narg", NO_ARGS, SEGTXT},
{ "C_rck", W_ARG, SEGTXT},
{ "C_rck_narg", NO_ARGS, SEGTXT},
{ "C_ret", Z_ARG, SEGTXT},
{ "C_rmi", W_ARG, SEGTXT},
{ "C_rmi_narg", NO_ARGS, SEGTXT},
{ "C_rmu", W_ARG, SEGTXT},
{ "C_rmu_narg", NO_ARGS, SEGTXT},
{ "C_rol", W_ARG, SEGTXT},
{ "C_rol_narg", NO_ARGS, SEGTXT},
{ "C_rom_cst", C_ARG, SEGROM},
{ "C_rom_dlb", EXTERNAL_DLB, SEGROM},
{ "C_rom_dnam", EXTERNAL_DNAM, SEGROM},
{ "C_rom_fcon", STRING_ARITH, SEGROM},
{ "C_rom_icon", STRING_ARITH, SEGROM},
{ "C_rom_ilb", B_ARG, SEGROM},
{ "C_rom_pnam", P_ARG, SEGROM},
{ "C_rom_scon", STRING_ARITH, SEGROM},
{ "C_rom_ucon", STRING_ARITH, SEGROM},
{ "C_ror", W_ARG, SEGTXT},
{ "C_ror_narg", NO_ARGS, SEGTXT},
{ "C_rtt", NO_ARGS, SEGTXT},
{ "C_sar", W_ARG, SEGTXT},
{ "C_sar_narg", NO_ARGS, SEGTXT},
{ "C_sbf", W_ARG, SEGTXT},
{ "C_sbf_narg", NO_ARGS, SEGTXT},
{ "C_sbi", W_ARG, SEGTXT},
{ "C_sbi_narg", NO_ARGS, SEGTXT},
{ "C_sbs", W_ARG, SEGTXT},
{ "C_sbs_narg", NO_ARGS, SEGTXT},
{ "C_sbu", W_ARG, SEGTXT},
{ "C_sbu_narg", NO_ARGS, SEGTXT},
{ "C_scon", STRING_ARITH, NOSEG},
{ "C_sde", EXTERNAL, SEGTXT},
{ "C_sde_dlb", EXTERNAL_DLB, SEGTXT},
{ "C_sde_dnam", EXTERNAL_DNAM, SEGTXT},
{ "C_sdf", F_ARG, SEGTXT},
{ "C_sdl", L_ARG, SEGTXT},
{ "C_set", W_ARG, SEGTXT},
{ "C_set_narg", NO_ARGS, SEGTXT},
{ "C_sig", NO_ARGS, SEGTXT},
{ "C_sil", L_ARG, SEGTXT},
{ "C_sim", NO_ARGS, SEGTXT},
{ "C_sli", W_ARG, SEGTXT},
{ "C_sli_narg", NO_ARGS, SEGTXT},
{ "C_slu", W_ARG, SEGTXT},
{ "C_slu_narg", NO_ARGS, SEGTXT},
{ "C_sri", W_ARG, SEGTXT},
{ "C_sri_narg", NO_ARGS, SEGTXT},
{ "C_sru", W_ARG, SEGTXT},
{ "C_sru_narg", NO_ARGS, SEGTXT},
{ "C_ste", EXTERNAL, SEGTXT},
{ "C_ste_dlb", EXTERNAL_DLB, SEGTXT},
{ "C_ste_dnam", EXTERNAL_DNAM, SEGTXT},
{ "C_stf", F_ARG, SEGTXT},
{ "C_sti", O_ARG, SEGTXT},
{ "C_stl", L_ARG, SEGTXT},
{ "C_str", R_ARG, SEGTXT},
{ "C_sts", W_ARG, SEGTXT},
{ "C_sts_narg", NO_ARGS, SEGTXT},
{ "C_teq", NO_ARGS, SEGTXT},
{ "C_tge", NO_ARGS, SEGTXT},
{ "C_tgt", NO_ARGS, SEGTXT},
{ "C_tle", NO_ARGS, SEGTXT},
{ "C_tlt", NO_ARGS, SEGTXT},
{ "C_tne", NO_ARGS, SEGTXT},
{ "C_trp", NO_ARGS, SEGTXT},
{ "C_ucon", STRING_ARITH, NOSEG},
{ "C_xor", W_ARG, SEGTXT},
{ "C_xor_narg", NO_ARGS, SEGTXT},
{ "C_zeq", B_ARG, SEGTXT},
{ "C_zer", W_ARG, SEGTXT},
{ "C_zer_narg", NO_ARGS, SEGTXT},
{ "C_zge", B_ARG, SEGTXT},
{ "C_zgt", B_ARG, SEGTXT},
{ "C_zle", B_ARG, SEGTXT},
{ "C_zlt", B_ARG, SEGTXT},
{ "C_zne", B_ARG, SEGTXT},
{ "C_zre", EXTERNAL, SEGTXT},
{ "C_zre_dlb", EXTERNAL_DLB, SEGTXT},
{ "C_zre_dnam", EXTERNAL_DNAM, SEGTXT},
{ "C_zrf", W_ARG, SEGTXT},
{ "C_zrf_narg", NO_ARGS, SEGTXT},
{ "C_zrl", L_ARG, SEGTXT},
{ "jump", _STRING, SEGTXT},
{ "locals", N_ARG, SEGTXT},
{ "prolog", NO_ARGS, SEGTXT}
};
set_C_instr_info( instr)
char *instr;
{
int low, high, mid, rel;
low = 0;
high = N_INSTR - 1;
while ( TRUE) {
mid = ( low + high) / 2;
rel = strcmp( instr, EM_instr[mid].name);
if ( rel == 0 )
break;
else if ( high == low) {
out( "ERROR : can't find >>%s<< !!\n", instr);
abort();
}
else if ( rel < 0)
high = mid;
else
/* pas op, mid is naar beneden afgerond !! */
low = ( mid == low ? low + 1: mid);
}
C_instr_info = &C_info[ EM_instr[mid].class];
segment = EM_instr[mid].segment;
}
int arg_type( arg)
char *arg;
/* return argument-type from $i */
{
int i;
i = *(arg+1) - '0' - 1;
return( C_instr_info->arg_type[i]);
}

View File

@@ -0,0 +1,25 @@
EM=/proj/em/Work
GFILES = pars.g
OFILES = pars.o Lpars.o scan.o mylex.o default.o C_instr2.o assem.o eval.o\
action.o
IFILES = -I$(EM)/h -I$(EM)/modules/h
CC = cc
.c.o :
$(CC) $(IFILES) -c $<
rm -f ../obj_EM_pars/$*.o
rm -f ../as_EM_pars/$*.o
ln $*.o ../obj_EM_pars/$*.o
ln $*.o ../as_EM_pars/$*.o
common : dummy $(OFILES)
touch ../*/em_parser
dummy : $(GFILES)
LLgen $(LLOPT) $(GFILES)
touch dummy
Lpars.o : Lpars.h decl.h
pars.o : Lpars.h decl.h
Lpars.o : Lpars.h decl.h

View File

@@ -0,0 +1,45 @@
#include "decl.h"
#include <alloc.h>
int quantum = 0, nr_instr, block_saved, first_action, last_action;
extern char *malloc(), *realloc(), *Salloc();
char **as_instructions;
init_as_block()
{
nr_instr = 0;
block_saved = TRUE;
if ( quantum == 0) {
quantum = 16;
as_instructions = (char **)malloc( quantum*sizeof( char *));
}
}
save_as( instr)
char *instr;
{
if ( nr_instr == quantum) {
quantum *= 2;
as_instructions = (char **) realloc( as_instructions,
quantum*sizeof( char *));
}
as_instructions[nr_instr++] = Salloc( instr, strlen( instr) + 1);
}
do_block_assemble()
{
int i;
if ( block_saved) {
block_assemble( as_instructions, nr_instr,
first_action, last_action);
for ( i=0; i<nr_instr; i++)
free( as_instructions[i]);
block_saved = FALSE;
}
}

View File

@@ -0,0 +1,3 @@
#define STRING 0
#define ARITH 1
#define INT 2

View File

@@ -0,0 +1,66 @@
#define SEGBSS 0
#define SEGHOL 1
#define SEGCON 2
#define SEGROM 3
#define SEGTXT 4
#define NOSEG 5
#define UNKNOWN (-1)
#define TRUE 1
#define FALSE 0
#define STRING 0
#define LABEL 1
#define ARITH 2
#define INT 3
#define MAX_ARGS 4
#define NO_ARGS 0
#define C_ARG 1
#define D_ARG 2
#define F_ARG 3
#define L_ARG 4
#define N_ARG 5
#define O_ARG 6
#define R_ARG 7
#define S_ARG 8
#define Z_ARG 9
#define W_ARG 10
#define EXTERNAL 11
#define EXTERNAL_DNAM 12
#define EXTERNAL_DLB 13
#define P_ARG 14
#define B_ARG 15
#define STRING_ARITH 16
#define BSS_EXT_DNAM 17
#define BSS_EXT_DLB 18
#define BSS_STR_AR 19
#define BSS_W_ARG 20
#define BSS_PNAM 21
#define BSS_ILB 22
#define ID_N_ARG 23
#define ARITH_ARITH 24
#define EXT_DNAM 25
#define EXT_DLB 26
#define ONE_INT 27
#define _STRING 28
typedef struct {
char *header;
int arg_type[MAX_ARGS]; /* Zoals ze eruit gaan!! */
char *arg_id[MAX_ARGS], *arg_conv[MAX_ARGS];
} t_C_info;
typedef struct {
char *lexeme;
int C_instr_type;
} t_token;
extern t_C_info C_info[], *C_instr_info;
extern int storage_default[4][3], segment;

View File

@@ -0,0 +1,224 @@
#include "decl.h"
#include <system.h>
File *save_file;
extern File *outfile;
extern char yytext[];
int def_start, def_end, save_lineno;
extern int yylineno;
init_defaults( instr)
char *instr;
{
save_file = outfile;
save_lineno = yylineno;
sys_open( ".default", OP_WRITE, &outfile);
set_def_params( instr);
}
#define _ICON 0
#define _UCON 4
#define _FCON 8
#define C_DEE 12
#define C_FIL 15
#define C_GTO 18
#define C_INE 21
#define C_LAE 24
#define C_LDE 27
#define C_LOE 30
#define C_SDE 33
#define C_STE 36
#define C_ZRE 39
struct { char *name; int segment, generated}
def_info[] = {
/* _ICON */ { "C_con_icon", SEGCON, 0},
{ "C_rom_icon", SEGROM, 0},
{ "C_hol_icon", NOSEG, 0},
{ "C_bss_icon", NOSEG, 0},
/* _UCON */ { "C_con_ucon", SEGCON, 0},
{ "C_rom_ucon", SEGROM, 0},
{ "C_hol_ucon", NOSEG, 0},
{ "C_bss_ucon", NOSEG, 0},
/* _FCON */ { "C_con_fcon", SEGCON, 0},
{ "C_rom_fcon", SEGROM, 0},
{ "C_hol_fcon", NOSEG, 0},
{ "C_bss_fcon", NOSEG, 0},
/* C_DEE */ { "C_dee", SEGTXT, 0},
{ "C_dee_dnam", SEGTXT, 0},
{ "C_dee_dlb", SEGTXT, 0},
/* C_FIL */ { "C_fil", SEGTXT, 0},
{ "C_fil_dnam", SEGTXT, 0},
{ "C_fil_dlb", SEGTXT, 0},
/* C_GTO */ { "C_gto", SEGTXT, 0},
{ "C_gto_dnam", SEGTXT, 0},
{ "C_gto_dlb", SEGTXT, 0},
/* C_INE */ { "C_ine", SEGTXT, 0},
{ "C_ine_dnam", SEGTXT, 0},
{ "C_ine_dlb", SEGTXT, 0},
/* C_LAE */ { "C_lae", SEGTXT, 0},
{ "C_lae_dnam", SEGTXT, 0},
{ "C_lae_dlb", SEGTXT, 0},
/* C_LDE */ { "C_lde", SEGTXT, 0},
{ "C_lde_dnam", SEGTXT, 0},
{ "C_lde_dlb", SEGTXT, 0},
/* C_LOE */ { "C_loe", SEGTXT, 0},
{ "C_loe_dnam", SEGTXT, 0},
{ "C_loe_dlb", SEGTXT, 0},
/* C_SDE */ { "C_sde", SEGTXT, 0},
{ "C_sde_dnam", SEGTXT, 0},
{ "C_sde_dlb", SEGTXT, 0},
/* C_STE */ { "C_ste", SEGTXT, 0},
{ "C_ste_dnam", SEGTXT, 0},
{ "C_ste_dlb", SEGTXT, 0},
/* C_ZRE */ { "C_zre", SEGTXT, 0},
{ "C_zre_dnam", SEGTXT, 0},
{ "C_zre_dlb", SEGTXT, 0}
};
int bss_or_hol_instr( index)
int index;
{
return ( index == _ICON + 2 || index == _ICON + 3 ||
index == _UCON + 2 || index == _UCON + 3 ||
index == _FCON + 2 || index == _FCON + 3);
}
set_def_params( instr)
char *instr;
/* geef def_start en def_end een waarde */
{
int low, high, mid, rel;
if ( *instr == '.') { /* ..icon | ..ucon | ..fcon */
switch ( *(instr+2)) {
case 'i' : def_start = _ICON;
break;
case 'u' : def_start = _UCON;
break;
case 'f' : def_start = _FCON;
break;
}
def_end = def_start + 3;
}
else {
low = C_DEE;
high = C_ZRE;
while ( TRUE) {
mid = ( low + high) / 6 * 3;
rel = strncmp( instr, def_info[mid].name, 5);
if ( rel == 0 )
break;
else if ( high == low)
abort();
else if ( rel < 0)
high = mid;
else
/* pas op, mid is naar beneden afgerond !! */
low = ( mid == low ? low + 3: mid);
}
def_start = mid;
def_end = def_start + 2;
}
}
#include <stdio.h>
#include "Lpars.h"
handle_defaults()
/* Zorgen dat de lexical-analyzer nu van de .default-file leest. */
{
FILE *old, *tmp, *switch_input();
int i, old_yylineno;
extern int CD_pos;
sys_close( outfile);
outfile = save_file;
tmp = fopen( ".default", "r");
old = switch_input( tmp);
old_yylineno = yylineno;
for ( i = def_start; i <= def_end; i++) {
yylineno = save_lineno;
if ( !def_info[i].generated) {
set_C_instr_info( def_info[i].name);
segment = def_info[i].segment;
set_outfile( def_info[i].name);
header( def_info[i].name);
CD_pos = TRUE; /* zet mylex() in juiste positie! */
if ( bss_or_hol_instr( i)) {
extnd_header();
/* Zorg voor de juiste $args */
set_C_instr_info( def_info[i-2].name);
def_row();
out( "}\n\n");
}
else
def_row();
rewind( tmp);
}
}
fclose( tmp);
switch_input( old);
yylineno = old_yylineno;
}
def_admn( instr)
char *instr;
{
/* Noteer dat deze instructie gegenereerd is */
int low, high, mid, rel;
low = _ICON;
high = C_ZRE + 2;
while ( TRUE) {
mid = ( low + high) / 2;
rel = strcmp( instr, def_info[mid].name);
if ( rel == 0 )
break;
else if ( high == low)
return;
else if ( rel < 0)
high = mid;
else
/* pas op, mid is naar beneden afgerond !! */
low = ( mid == low ? low + 1: mid);
}
def_info[mid].generated = 1;
}
extnd_header()
{
out( "if ( %s == 0 ) {\n", C_instr_info->arg_id[3]);
set_segment( SEGBSS);
out( "bss( %s);\n", C_instr_info->arg_id[0]);
out( "}\nelse {\n");
set_segment( SEGCON);
out( "for ( %s = 0; %s < %s/EM_WSIZE; %s++)\n",
C_instr_info->arg_id[3], C_instr_info->arg_id[3],
C_instr_info->arg_id[0], C_instr_info->arg_id[3]);
}

View File

@@ -0,0 +1,10 @@
#define SEGBSS 0
#define SEGHOL 1
#define SEGCON 2
#define SEGROM 3
#define SEGTXT 4
#define STRING 0
#define LABEL 1
#define ARITH 2
#define INT 3

View File

@@ -0,0 +1,20 @@
#include <ctype.h>
#include "decl.h"
eval( str)
char *str;
{
register char c;
int i;
for ( c = *str++; c != '\0'; c= *str++)
if ( c == '$' && isdigit( *str)) {
i = *str++ - '0' - 1;
out( "%s", C_instr_info->arg_conv[i]);
}
else
out( "%c", c);
}

View File

@@ -0,0 +1,272 @@
#include "Lpars.h"
#include <stdio.h>
#include <ctype.h>
#define YYTEXT 256
#define FALSE 0
#define TRUE 1
char yytext[YYTEXT], *next;
int CD_pos = FALSE; /* condition or default allowed ? */
int mylex()
{
char c, scanc(), skip_space();
static int special = FALSE; /* rule with conditions + default ? */
next = yytext;
c = *next++ = skip_space();
switch ( c) {
case EOF : next = yytext;
return( 0);
case '"' : read_string();
return( ASSEM_INSTR);
case '.' : c = scanc();
backc( c);
if ( c != '.') { /* geen ..icon o.i.d. */
if ( special)
CD_pos = TRUE;
return( '.');
}
break;
case ';' : return( ';');
case '=' : if ( arrow()) {
CD_pos = FALSE;
return( ARROW);
}
break;
case ':' : if ( equiv()) {
CD_pos = FALSE;
return( EQUIV);
}
break;
case 'd' : if ( CD_pos && _default()) {
CD_pos = FALSE;
special = FALSE;
return( DEFAULT);
}
break;
}
if ( CD_pos) {
read_condition();
CD_pos = FALSE;
special = TRUE;
return( CONDITION);
}
if ( isalpha( c)) {
read_ident();
c = skip_space();
if ( c == '(') {
*next++ = c;
read_call();
return( CALL);
}
else {
backc( c);
if ( is_DEF_C_INSTR( yytext)) {
CD_pos = TRUE;
return( DEF_C_INSTR);
}
if ( is_C_INSTR( yytext)) {
CD_pos = TRUE;
return( C_INSTR);
}
return( ERROR);
}
}
if ( c == '.') {
c = scanc();
if ( c == '.') {
*next++ = '.';
read_ident();
if ( is_DEF_C_INSTR( yytext)) {
CD_pos = TRUE;
return( DEF_C_INSTR);
}
return( ERROR);
}
else {
backc( c);
return( '.');
}
}
return( c);
}
int isletter( c)
char c;
{
return( isalpha( c) || isdigit( c) || c == '_');
}
static char skip_space()
{
char c;
while ( isspace( c = scanc()))
;
return( c);
}
/* first character has been read */
read_string()
/* de "'s eraf strippen!! */
{
next--;
while( ( *next = scanc()) != '"' || *(next-1) == '\\')
next++;
}
int arrow()
{
if ( ( *next++ = scanc()) == '=')
if ( ( *next++ = scanc()) == '>')
return( TRUE);
else
backc( *--next);
else
backc( *--next);
return( FALSE);
}
int equiv()
{
if ( ( *next++ = scanc()) == ':')
if ( ( *next++ = scanc()) == '=')
return( TRUE);
else
backc( *--next);
else
backc( *--next);
return( FALSE);
}
int _default()
{
char c;
if ( ( *next++ = scanc()) == 'e')
if ( ( *next++ = scanc()) == 'f')
if ( ( *next++ = scanc()) == 'a')
if ( ( *next++ = scanc()) == 'u')
if ( ( *next++ = scanc()) == 'l')
if ( ( *next++ = scanc()) == 't')
if ( !isletter( c = scanc())) {
backc( c);
return( TRUE);
}
else
backc( c);
else
backc( *--next);
else
backc( *--next);
else
backc( *--next);
else
backc( *--next);
else
backc( *--next);
else
backc( *--next);
return( FALSE);
}
read_ident()
{
char c;
while ( isletter( c = scanc()))
*next++ = c;
backc( c);
}
read_call()
{
int n = 1;
while ( TRUE)
switch( *next++ = scanc()) {
case EOF : return;
case '(' : n++;
break;
case ')' : n--;
if ( n == 0)
return;
break;
}
}
read_condition()
{
while ( TRUE) {
switch ( *next++ = scanc()) {
case EOF : return;
case '=' : if ( arrow()) {
backc( '>');
backc( '=');
backc( '=');
next -= 3;
return;
}
break;
case ':' : if ( equiv()) {
backc( '=');
backc( ':');
backc( ':');
next -= 3;
return;
}
break;
}
}
}
is_C_INSTR( str)
char *str;
{
if ( *str == 'C' && *(str+1) == '_')
return( TRUE);
else if ( strncmp( "locals", str, 6) == 0)
return( TRUE);
else if ( strncmp( "jump", str, 4) == 0)
return( TRUE);
else if ( strncmp( "prolog", str, 6) == 0)
return( TRUE);
else
return( FALSE);
}
is_DEF_C_INSTR( str)
char *str;
/* Er is gelezen [..][letter]* */
{
if ( *str == '.' && *(str+1) == '.')
return( next > yytext+1);
if ( ( *next++ = scanc()) == '.')
if ( ( *next++ = scanc()) == '.')
return( next > yytext+1);
else
backc( *--next);
else
backc( *--next);
return( FALSE);
}

View File

@@ -0,0 +1,76 @@
#include <stdio.h>
FILE *infile = stdin;
#define BUF_SIZE 16
char buf[BUF_SIZE], /* Bufer to save backc()-characters */
*bufptr = buf; /* Pointer to space for backc()-character */
int yylineno = 1;
char nextc()
{
if ( bufptr > buf)
return( *--bufptr);
else
return( getc( infile));
}
backc( c)
char c;
{
if ( bufptr > buf + BUF_SIZE)
error( "backc(), no space in buffer left!");
else {
if ( c == '\n')
yylineno--;
*bufptr++ = c;
}
}
char scanc()
/* Get next character, but delete al C-comments */
{
char c;
c = nextc();
while ( c == '/') {
c = nextc();
if ( c == '*') { /* start of comment */
while ( nextc() != '*' || nextc() != '/')
;
c = nextc();
}
else {
backc( c);
return( '/');
}
}
if ( c == '\n')
yylineno++;
return( c);
}
FILE *switch_input( new)
FILE *new;
/* Return the current FILE, if buf[] can't be cleaned NULL will be returned */
{
char *ptr; FILE *old;
/* Clean buf[] */
for ( ptr = buf; ptr < bufptr; ptr++)
if ( ungetc( *ptr, infile) == EOF && *ptr != EOF)
return( NULL);
bufptr = buf;
old = infile;
infile = new;
return( old);
}