static uint8_t *compile1(struct dict *d, uint16_t dn, uint8_t *pc) { uint16_t **p=d->def; print_atom(dn); putchar('['); for(;*p;p++) { uint16_t *def=*p; print_atom(def[2]); putchar(' '); #ifdef DEBUG putchar('\n'); putchar(' '); putchar(' '); putchar(' '); #endif if(def[1]==makeatom(0,0x060f121408LL)) { // forth pc=compile_def(pc,def,d,dn); } else if(def[1]==makeatom(0,0x04090314LL)) { // dict uint16_t *def=*p; if(d!=(struct dict *)(def+4)) { pc=compile1((struct dict *)(def+4),def[2],pc); } } } putchar(']'); putchar(' '); return pc; }
void compile() { printf("compile: "); memset(comp,0,sizeof(comp)); memset(caddrs,0,sizeof(caddrs)); memset(backs,0,sizeof(backs)); compile1(dict,makeatom(0,0x030f1205),comp); checkbackrefs(); checkcaddrs(); printf("done.\n"); }
PRIVATE_STATIC void out_acc_subscript(CExpr *subscript, CExpr *parent) { if(EXPR_CODE(subscript) != EC_UNDEF){ compile1(subscript, parent); }else{ CExpr *lower = exprListHeadData(subscript); if(! EXPR_ISNULL(lower)){ compile1(lower, parent); } if(EXPR_L_SIZE(subscript) > 1){ CExpr *length = exprListNextNData(subscript, 1); if(! EXPR_ISNULL(length)){ compile1(length, parent); } } } }
PRIVATE_STATIC void compile_acc_arrayRef(CExprOfBinaryNode *arrayRef, CExpr *parent) { CExpr *arrayExpr = arrayRef->e_nodes[0]; CExpr *subscripts = arrayRef->e_nodes[1]; compile1(arrayExpr, parent); CCOL_DListNode *ite; EXPR_FOREACH(ite, subscripts){ CExpr *node = EXPR_L_DATA(ite); out_acc_subscript(node, parent); }