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

📄 expr.c

📁 花了很长时间找了这么多c语言的编译器
💻 C
📖 第 1 页 / 共 5 页
字号:
										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 + -