?? expr.c
字號:
if (lastst == comma)
getsym();
tptr = gatherparms(&pnode);
parmlist(&pnode,tptr,0);
qnode = makenode(en_icon,0,0);
pnode = makenode(en_void,makenode(en_icon,(char *)num,0),pnode);
pnode = makenode(en_trapcall,qnode,pnode);
}
goodcode |= GF_ASSIGN;
*node = pnode;
return &stdint;
case kw_D0:
case kw_D1:
case kw_D2:
case kw_D3:
case kw_D4:
case kw_D5:
case kw_D6:
case kw_D7:
case kw_D8:
case kw_D9:
case kw_DA:
case kw_DB:
case kw_DC:
case kw_DD:
case kw_DE:
case kw_DF:
tptr = xalloc(sizeof(TYP));
*tptr = stduns;
tptr->sname = regname;
pnode = makenode(en_regref,(char *)(regdsize*256+lastst-kw_D0),0);
pnode = makenode(en_ul_ref,pnode,0);
*node = pnode;
getsym();
return tptr;
case kw_A0:
case kw_A1:
case kw_A2:
case kw_A3:
case kw_A4:
case kw_A5:
case kw_A6:
case kw_A7:
case kw_A8:
case kw_A9:
case kw_AA:
case kw_AB:
case kw_AC:
case kw_AD:
case kw_AE:
case kw_AF:
tptr = xalloc(sizeof(TYP));
*tptr = stduns;
tptr->sname = regname;
pnode = makenode(en_regref,(char *)(regasize*256+lastst-kw_D0),0);
pnode = makenode(en_ul_ref,pnode,0);
*node = pnode;
getsym();
return tptr;
case kw_F0:
case kw_F1:
case kw_F2:
case kw_F3:
case kw_F4:
case kw_F5:
case kw_F6:
case kw_F7:
case kw_F8:
case kw_F9:
case kw_FA:
case kw_FB:
case kw_FC:
case kw_FD:
case kw_FE:
case kw_FF:
tptr = xalloc(sizeof(TYP));
*tptr = stdlongdouble;
tptr->sname = regname;
pnode = makenode(en_regref,(char *)(regfsize *256+lastst-kw_D0),0);
pnode = makenode(en_longdoubleref,pnode,0);
*node = pnode;
getsym();
return tptr;
case id:
tptr = nameref(&pnode);
break;
case iconst:
tptr = &stdint;
pnode = makenode(en_icon,(char *)ival,0);
getsym();
*node = pnode;
return tptr;
case iuconst:
tptr = &stduns;
pnode = makenode(en_iucon,(char *)ival,0);
getsym();
*node = pnode;
return tptr;
case lconst:
tptr = &stdlong;
pnode = makenode(en_lcon,(char *)ival,0);
getsym();
*node = pnode;
return tptr;
case luconst:
tptr = &stdunsigned;
pnode = makenode(en_lucon,(char *)ival,0);
getsym();
*node = pnode;
return tptr;
case cconst:
tptr = &stdchar;
pnode = makenode(en_ccon,(char *)ival,0);
getsym();
*node = pnode;
return tptr;
case rconst:
tptr = &stddouble;
pnode = xalloc(sizeof(ENODE));
pnode->nodetype = en_rcon;
pnode->cflags = 0;
pnode->v.f = rval;
getsym();
*node = pnode;
return tptr;
case lrconst:
tptr = &stdlongdouble;
pnode = xalloc(sizeof(ENODE));
pnode->nodetype = en_lrcon;
pnode->cflags = 0;
pnode->v.f = rval;
getsym();
*node = pnode;
return tptr;
case fconst:
tptr = &stdfloat;
pnode = xalloc(sizeof(ENODE));
pnode->nodetype = en_fcon;
pnode->cflags = 0;
pnode->v.f = rval;
getsym();
*node = pnode;
return tptr;
case sconst:
isstring = TRUE;
tptr = &stdstring;
pnode = makenode(en_labcon,(char *)tostring(),0);
*node = pnode;
break;
case lsconst:
isstring = TRUE;
tptr = &stdstring;
pnode = makenode(en_labcon,(char *)tostring(),0);
*node = pnode;
break;
case openpa:
getsym();
if (lastst == star) {
/* function pointers */
gcode = goodcode;
goodcode &= ~(GF_AND | GF_SUPERAND);
getsym();
gdf = globaldref;
globaldref = 1;
tptr = expression(&pnode);
globaldref = gdf;
if (needpunc(closepa, skm_closepa)) {
if (tptr->type == bt_ptrfunc) {
tptr = deref(&pnode,tptr);
goodcode = gcode;
if (needpunc(openpa,skm_closepa)) {
goodcode |= GF_ASSIGN;
tp1 = gatherparms(&qnode);
tp1->sname = tptr->sname;
parmlist(&qnode,tp1,tptr);
rnode = makenode(en_icon,(char *)tptr->btp->size,0);
pnode = makenode(en_void,pnode,qnode);
if (tptr->cflags & DF_INT)
pnode = makenode(en_intcall,rnode,pnode);
else
if (tptr->type == bt_union || tptr->type == bt_struct) {
if (lastsym && lastsym->pascaldefn)
pnode = makenode(en_pfcallb,rnode,pnode);
else
pnode = makenode(en_fcallb,rnode,pnode);
pnode->size = tptr->size;
}
else
if (lastsym && lastsym->pascaldefn)
pnode = makenode(en_pfcall,rnode,pnode);
else
pnode = makenode(en_fcall,rnode,pnode);
pnode->cflags = tptr->btp->cflags;
tptr = tptr->btp;
break;
}
}
else {
goodcode = gcode | (goodcode & GF_ASSIGN);
break;
}
}
else
goodcode = gcode | GF_ASSIGN;
*node = pnode;
return tptr;
}
else
castcont:
if( !castbegin(lastst) ) {
/* an expression in parenthesis */
gcode = goodcode;
goodcode &= ~(GF_AND | GF_SUPERAND);
gdf = globaldref;
globaldref = 0;
tptr = expression(&pnode);
globaldref = gdf;
goodcode = gcode | (goodcode & GF_ASSIGN);
needpuncexp(closepa,skm_closepa);
goto contfor;
}
else { /* cast operator */
/* a cast */
declid[0] = 0;
decl(0); /* do cast declaration */
decl1();
tptr = head;
if (needpunc(closepa, 0)) {
gcode = goodcode;
goodcode &= ~(GF_AND | GF_SUPERAND);
gdf = globaldref;
globaldref = 0;
if( (unary(&pnode)) == 0 ) {
generror(ERR_IDEXPECT,0,0);
tptr = 0;
}
globaldref = gdf;
goodcode = gcode | (goodcode & GF_ASSIGN);
pnode->cflags = tptr->cflags;
if (tptr) {
promote_type(tptr, &pnode);
}
}
else
return(0);
}
*node = pnode;
return tptr;
default:
return 0;
}
contfor:
/* modifiers that can appear after an expression */
for(;;) {
int i;
switch( lastst ) {
case autoinc:
case autodec:
if (isstring)
generror(ERR_INVALIDSTRING,0,0);
if( tptr->type == bt_pointer )
i = tptr->btp->size;
else
i = 1;
if (i == 0)
generror(ERR_ZEROPTR,0,0);
if(! lvalue(pnode) )
generror(ERR_LVALUE,0,0);
if (pnode->cflags & DF_CONST)
generror(ERR_MODCONS,0,0);
pnode = makenode(lastst==autoinc ? en_ainc : en_adec,pnode,(char *)i);
goodcode |= GF_ASSIGN;
getsym();
break;
case openbr: /* build a subscript reference */
flag = 1;
if( tptr->type != bt_pointer )
generrorexp(ERR_NOPOINTER,0,skm_closebr);
else
tptr = tptr->btp;
getsym();
qnode = makenode(en_icon,(char *)tptr->size,0);
gcode = goodcode;
goodcode &= ~(GF_AND | GF_SUPERAND);
gdf = globaldref;
globaldref = 0;
tp2 = expression(&rnode);
globaldref = gdf;
goodcode = gcode & ~GF_ASSIGN;
if (!isscalar(tp2) || tp2->type == bt_float || tp2->type == bt_double || tp2->type == bt_longdouble)
generror(ERR_ARRAYMISMATCH,0,0);
qnode = makenode(en_pmul,qnode,rnode);
pnode = makenode(en_add,pnode,qnode);
pnode->cflags = tptr->cflags;
if( tptr->val_flag == 0 )
tptr = deref(&pnode,tptr);
needpuncexp(closebr,skm_closebr);
break;
case pointsto: /* pointer reference */
if( tptr->type != bt_pointer ) {
generror(ERR_NOPOINTER,0,0);
while (lastst == pointsto || lastst == dot) {
getsym();
getsym();
}
break;
}
else
tptr = tptr->btp;
pnode->cflags = tptr->cflags;
if( tptr->val_flag == 0 ) {
pnode = makenode(en_l_ref,pnode,0);
pnode->cflags = tptr->cflags;
}
/*
* fall through to dot operation
*/
case dot:
if (isstring)
generror(ERR_INVALIDSTRING,0,0);
getsym(); /* past -> or . */
if( lastst != id )
generror(ERR_IDEXPECT,0,0);
else {
sp = search(nm=litlate(lastid),&tptr->lst);
if( sp == 0 ) {
tptr = &stdmatch;
pnode = makenode(en_nacon,&undef,0);
gensymerror(ERR_UNDEFINED,nm);
getsym();
while (lastst == pointsto || lastst == dot) {
getsym();
getsym();
}
}
else {
tp2 = sp->tp;
if (pnode->nodetype == en_fcallb || pnode->nodetype == en_pfcallb) {
if (pnode->nodetype == en_pfcallb)
pnode = makenode(en_pcallblock,dummyvar(pnode->size,tp2),pnode);
else
pnode = makenode(en_callblock,dummyvar(pnode->size,tp2),pnode);
}
qnode = makenode(en_icon,(char *)sp->value.i,0);
pnode = makenode(en_add,pnode,qnode);
pnode->cflags = tptr->cflags | pnode->v.p[0]->cflags;
tp2->uflags |= tptr->uflags;
tptr = tp2;
if( tptr->val_flag == 0 )
tptr = deref(&pnode,tptr);
if (tp2->bits != -1) {
qnode = pnode;
pnode = makenode(en_bits,qnode,0);
pnode->bits = tp2->bits;
pnode->startbit = tp2->startbit;
pnode->cflags = tptr->cflags | pnode->v.p[0]->cflags;
}
}
getsym(); /* past id */
}
break;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -