亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? expr.c

?? 本程序集是Allen I. Holub所寫的《Compiler Design in C》一書的附隨軟件
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*
 * 68K/386 32-bit C compiler.
 *
 * copyright (c) 1997, David Lindauer
 * 
 * This compiler is intended for educational use.  It may not be used
 * for profit without the express written consent of the author.
 *
 * It may be freely redistributed, as long as this notice remains intact
 * and either the original sources or derived sources 
 * are distributed along with any executables derived from the originals.
 *
 * The author is not responsible for any damages that may arise from use
 * of this software, either idirect or consequential.
 *
 * v1.35 March 1997
 * David Lindauer, gclind01@starbase.spd.louisville.edu
 *
 * Credits to Mathew Brandt for original K&R C compiler
 *
 */
/*
 * Evaluate expressions very recursive descent.  MAke sure your STACK
 * is large enough to parse the expressions you want to parse.  a 4K stack
 * will handle all but the very extreme cases
 */
#include        <stdio.h>
#include        "expr.h"
#include        "c.h"
#include        "errors.h"
#include				"list.h"

extern int block_nesting;
extern int global_flag;
extern enum e_sym lastst;
extern char lastid[],laststr[];
extern TABLE gsyms,lsyms;
extern long ival;
extern long double rval;
/* Default types */
extern TYP stdint,stdlongdouble, stduns,stdstring;
TYP             stdfloat = { bt_float, 0, UF_DEFINED | UF_USED,0, 0,-1, -1, 8, {0, 0}, 0, 0,0 };
TYP             stddouble = { bt_double, 0, 0,0,0, -1, -1, 8, {0, 0}, 0, 0,0 };
TYP             stdvoid = { bt_matchall, 0, 0 ,0, 0,-1, -1, 4, {0, 0}, 0, 0,0 };
TYP             stdmatch = { bt_matchall, 0, UF_DEFINED | UF_USED,0, 0,-1, -1, 4, {0, 0}, &stdvoid, 0,0 };
TYP             stdlong = {bt_long, 0, 0,0,0,-1, -1, 4, {0, 0}, 0, 0,0 };
TYP             stdunsigned = {bt_unsigned, 0, 0,0,0,-1, -1, 4, {0, 0}, 0, 0,0 };
TYP             stdchar = {bt_char, 0, 0,0,0,-1, -1, 1, {0, 0}, 0, 0,0 };
TYP             stdfunc = {bt_func, 1, UF_DEFINED | UF_USED,0,0,-1, -1, 0, {0, 0}, &stdint, 0,0};
extern TYP      *head;          /* shared with decl */
extern TABLE    tagtable;
extern char declid[100];
extern int goodcode;
extern int prm_cplusplus;
extern int regdsize,regasize,regfsize,stackadd,stackmod;

int skm_closepa[] = { closepa, comma, semicolon, end, 0 };
int skm_closebr[] = { closebr, comma, openbr, semicolon, end, 0 };
static SYM *lastsym;
static int globaldref = 0;
static char regname[] = "processor reg" ;
static char *nm = 0;
static TYP *asntyp = 0;
static int dumpos;
static SYM undef;
void exprini(void)
{
	globaldref = 0;
	asntyp = 0;
	dumpos = 0;
	undef.value.i = 0;
	undef.name = "UNDEFINED";
}
ENODE    *makenode(enum e_node nt, char *v1, char *v2)
/*
 *      build an expression node with a node type of nt and values
 *      v1 and v2.
 */
{       ENODE    *ep;
        ep = xalloc(sizeof(ENODE));
        ep->nodetype = (char)nt;
				ep->cflags = 0;
        ep->v.p[0] = v1;
        ep->v.p[1] = v2;
        return ep;
}

TYP *deref(ENODE **node, TYP *tp)
/*
 *      build the proper dereference operation for a node using the
 *      type pointer tp.
 */
{
				ENODE *onode = *node;
				switch( tp->type ) {
								case bt_double:
                        *node = makenode(en_doubleref,*node,0);
                        break;
								case bt_longdouble:
                        *node = makenode(en_longdoubleref,*node,0);
                        break;
								case bt_float:
                        *node = makenode(en_floatref,*node,0);
                        break;
								case bt_unsignedchar:
                        *node = makenode(en_ub_ref,*node,0);
                        break;
								case bt_unsignedshort:
                        *node = makenode(en_uw_ref,*node,0);
                        break;
                case bt_char:
                        *node = makenode(en_b_ref,*node,0);
                        break;
                case bt_short:
                case bt_enum:
                        *node = makenode(en_w_ref,*node,0);
                        break;
                case bt_unsigned:
                        *node = makenode(en_ul_ref,*node,0);
												break;
                case bt_long:
                case bt_matchall:
                case bt_pointer:
								case bt_ptrfunc:
								case bt_ref:
                        *node = makenode(en_l_ref,*node,0);
                        break;
                default:
                        generror(ERR_DEREF,0,0);
                        break;
                }
				(*node)->cflags = onode->cflags;
        return tp;
}
ENODE *dummyvar(int size, TYP *type)
{
	char nm[20];
	ENODE *newnode;
	SYM *sp = xalloc(sizeof(SYM));
	sprintf(nm,"**DUMMY%d",dumpos++);
	sp->name = litlate(nm);
	sp->defalt = 0;
  sp->storage_class = sc_auto;
  sp->tp = type;
	type->uflags |= UF_USED;
	sp->extflag = FALSE;
	sp->absflag = FALSE;
	sp->intflag = FALSE;
	sp->pascaldefn = FALSE;
	sp->init = 0;
	sp->indecltable = 0;
	sp->funcparm = 0;
	sp->inreg = 0;
	sp->staticlabel = FALSE;
	sp->value.i = block_nesting;
	insert(sp,&lsyms);
	newnode = makenode(en_autocon,sp,0);
	return newnode;
}
int isintconst(int type)
{
	switch (type) {
		case en_icon:
		case en_lcon:
		case en_lucon:
		case en_iucon:
		case en_ccon:
			return 1;
	}
	return 0;
}
TYP     *nameref(ENODE **node)
/*
 * get an identifier.  If it is followed by parenthesis gather the
 * function parms.  If it is an undefined function declare it as external
 * for now.
 */
{       SYM             *sp;
        TYP             *tp,*tp1;
				ENODE *pnode=0,*qnode = 0;
				int fn = FALSE;
				char buf[100];
				strcpy(buf,lastid);
				getsym();
/* Get function args */
				if (lastst == openpa) {
					fn = TRUE;
					getsym();
					tp1 = gatherparms(&pnode);
					sp = funcovermatch(buf,tp1);
					if (sp)
						tp1->sname = nm = sp->name;
					else
#ifdef CPLUSPLUS
						if (prm_cplusplus)
							tp1->sname = nm = cppmangle(buf,tp1);
						else
#endif
							tp1->sname = nm = litlate(buf);
				}
				else {
					nm = litlate(buf);
					sp = gsearch(nm);
				}
        if( sp == 0 ) {
/* No such identifier */
                if (fn) {
/* External function, put it in the symbol table */
#ifdef CPLUSPLUS
												if (prm_cplusplus) 
													gensymerror(ERR_NOFUNCMATCH,nm);
												else
#endif
													gensymerror(ERR_NOPROTO,nm);
                        ++global_flag;
												sp = xalloc(sizeof(SYM));
                				sp->name = litlate(nm);
												sp->tp = maketype(bt_func,0);
												*(sp->tp) = stdfunc;
                        sp->storage_class = sc_externalfunc;
												sp->extflag = TRUE;
                        insert(sp,&gsyms);
                        --global_flag;
                        *node = makenode(en_napccon,sp,0);
												parmlist(&pnode,tp1,0);
												*node = makenode(en_void,*node,pnode);
                        tp = &stdint;
												qnode = makenode(en_icon,(char *)-4,0);
	                      *node = makenode(en_fcall,qnode,*node);
												goodcode |= GF_ASSIGN;
                        }
                else    {
/* External non-function.  These also get put in the symbol table so that
 * we don't keep spitting errors out but also put an error out
 */
#ifdef CPLUSPLUS
												if (prm_cplusplus && asntyp && asntyp->type == bt_ptrfunc) {
													sp = funcovermatch(lastid,asntyp);
													if (sp)
														goto foundsp;
												}
#endif
												sp = xalloc(sizeof(SYM));
                				sp->name = nm;
                        sp->tp = tp = &stdmatch;
												sp->storage_class = sc_external;
												insert(sp,&lsyms);
												*node = makenode(en_nacon,&undef,0);
												gensymerror(ERR_UNDEFINED,nm);
                        tp = deref(node,tp);
                        }
                }
        else    {
/* If we get here the symbol was already in the table
 */
foundsp:
								sp->tp->uflags |= UF_USED;
                if( (tp = sp->tp) == 0 ) {
/* This lack of type info should never happen */
                        tp = &stdmatch;
												*node = makenode(en_nacon,&undef,0);
												gensymerror(ERR_UNDEFINED,nm);
                        tp = deref(node,tp);
                        return tp;       /* guard against untyped entries */
                        }
                switch( sp->storage_class ) {
                        case sc_static:
                        case sc_global:
                        case sc_external:
                        case sc_externalfunc:
												case sc_abs:
																sp->extflag = TRUE;
																if (fn) {
/* make a function node */
																	if (sp->tp->type == bt_ptrfunc)
                                		*node = makenode(en_nacon,sp,0);
																	else
                                		*node = makenode(en_napccon,sp,0);
isfunc:
																	if (sp->tp->type != bt_ptrfunc && sp->tp->type != bt_func && sp->tp->type != bt_ifunc)
																		generror(ERR_MISMATCH,0,0);
																	if (sp->tp->type == bt_ptrfunc)
																		tp = deref(node,tp);
#ifdef CPLUSPLUS
																	if (prm_cplusplus && !strcmp(buf,"main"))
																		generror(ERR_NOMAIN,0,0);
#endif
																	parmlist(&pnode,tp1,sp->tp);
																	*node = makenode(en_void,*node,pnode);
																	qnode = makenode(en_icon,(char *)sp->tp->btp->size,0);
                                  tp = tp->btp;
																	if (sp->intflag)
	                                	*node = makenode(en_intcall,qnode,*node);
																	else
																	if (tp->type == bt_union || tp->type == bt_struct) {
																		if (sp->pascaldefn)
	                              		  *node = makenode(en_pfcallb,qnode,*node);
																		else 
	                              		  *node = makenode(en_fcallb,qnode,*node);
																		(*node)->size = tp->size;
																	}
																	else
																		if (sp->pascaldefn)
	                              			*node = makenode(en_pfcall,qnode,*node);
																		else
	                              			*node = makenode(en_fcall,qnode,*node);
																	if (tp)
																		(*node)->cflags = tp->cflags;
																	goodcode |= GF_ASSIGN;
																}
																else
/* otherwise make a node for a regular variable */
																	if (sp->absflag)
                                		*node = makenode(en_absacon,sp,0);
																	else
																		if (sp->tp->type == bt_func || sp->tp->type == bt_ifunc) {
																			fn = TRUE;
                                			*node = makenode(en_napccon,sp,0);
																		}
																		else
																			if (sp->staticlabel)
																				*node = makenode(en_nalabcon,(char *)sp->value.i,0);
																			else
                                				*node = makenode(en_nacon,sp,0);
                                break;
                        case sc_const:
/* constants and enums */
                                *node = makenode(en_icon,(char *)sp->value.i,0);
																return &stdint;
                        default:        /* auto and any errors */
                                if( sp->storage_class != sc_auto && sp->storage_class != sc_autoreg) {
                                        gensymerror(ERR_ILLCLASS2,sp->name);
																				tp = 0;
																}
																else {
/* auto variables */
															 		if (sp->storage_class == sc_auto)
                                		*node = makenode(en_autocon,sp,0);
																	else if (sp->storage_class == sc_autoreg)
                                		*node = makenode(en_autoreg,sp,0);
																	if (fn)
																		goto isfunc;
																}
                                break;
                        }
/* dereference if it isn't an array or structure address */

								(*node)->cflags = tp->cflags;
								/* deref if not an array or if is function parm */
	              if(!fn && tp && (tp->val_flag == 0 || (sp->funcparm && tp->type == bt_pointer)))
  	                     tp = deref(node,tp);
/* and dereference again if it is a refernece variable */
								if (tp->type == bt_ref) {
												tp = tp->btp;
												tp = deref(node,tp);
								}
												
                }
				lastsym = sp;
        return tp;
}

void promote_type(TYP *typ, ENODE **node)
/*
 * Type promotion for casts and function args 
 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久久久久看片| 一区二区三区色| 日韩欧美国产三级| 91精品国产欧美一区二区| 欧美日韩在线播放一区| 色婷婷亚洲综合| 欧美在线|欧美| 欧美天堂亚洲电影院在线播放| 91黄色免费网站| 欧美三级电影网站| 欧美精品777| 欧美一区二区成人6969| 精品免费国产一区二区三区四区| 欧美videofree性高清杂交| 日韩欧美一级在线播放| 精品国产一区a| 国产日本欧洲亚洲| 亚洲欧洲美洲综合色网| 亚洲一区精品在线| 麻豆成人91精品二区三区| 久久精品二区亚洲w码| 国产一区 二区| 成人黄色小视频在线观看| 一本色道a无线码一区v| 欧美人狂配大交3d怪物一区| 日韩一区二区电影| 久久久久久综合| 中文字幕亚洲综合久久菠萝蜜| 亚洲免费观看在线视频| 亚洲第一久久影院| 国产综合色精品一区二区三区| 国产精品一级在线| 一本在线高清不卡dvd| 在线不卡一区二区| 久久亚洲一级片| 亚洲美女电影在线| 看电视剧不卡顿的网站| 国产成人亚洲综合a∨婷婷 | 国产.精品.日韩.另类.中文.在线.播放| 国产精品一区二区在线播放 | 色婷婷综合久久久中文字幕| 欧美久久一区二区| 久久天天做天天爱综合色| 国产精品嫩草影院av蜜臀| 亚洲一区二区五区| 国产精品亚洲专一区二区三区| 99精品久久只有精品| 日韩午夜精品视频| √…a在线天堂一区| 丝袜亚洲另类欧美| proumb性欧美在线观看| 91精品国产综合久久精品麻豆| 久久精品一二三| 亚洲国产精品久久一线不卡| 国产乱码精品一区二区三区忘忧草 | 极品少妇一区二区三区精品视频| 丁香激情综合五月| 91精品国产91久久久久久最新毛片| 国产色婷婷亚洲99精品小说| 亚洲成人午夜影院| 99国产精品一区| 26uuu国产电影一区二区| 一区二区三区在线免费播放| 国产一区二区三区| 欧美日韩一级黄| 亚洲色欲色欲www在线观看| 精品中文字幕一区二区小辣椒| 在线视频亚洲一区| 中文天堂在线一区| 美女网站色91| 欧美日韩亚洲丝袜制服| 国产精品国产精品国产专区不片| 麻豆视频观看网址久久| 欧美中文字幕一区| 亚洲欧洲中文日韩久久av乱码| 精品一区中文字幕| 欧美美女bb生活片| 亚洲一卡二卡三卡四卡无卡久久 | 国产精品99久久久久久久vr| 欧美精品日日鲁夜夜添| 一区二区三区四区激情| 成人午夜激情影院| 久久综合九色综合欧美亚洲| 三级欧美在线一区| 欧美色综合网站| 亚洲愉拍自拍另类高清精品| 93久久精品日日躁夜夜躁欧美| 国产欧美综合在线观看第十页| 免费观看日韩av| 69久久99精品久久久久婷婷 | 美女一区二区三区| 欧美一级欧美一级在线播放| 亚洲一级不卡视频| 一本久久综合亚洲鲁鲁五月天 | 成人黄色小视频在线观看| 久久久久久免费网| 国产美女一区二区| 久久久久国产精品人| 狠狠色丁香久久婷婷综合丁香| 欧美一区二区免费| 久久精品国产久精国产| 欧美一区二区三级| 久久精品国产77777蜜臀| 日韩精品一区二区三区中文精品| 日本色综合中文字幕| 欧美日韩和欧美的一区二区| 亚洲一二三专区| 欧美喷潮久久久xxxxx| 香蕉久久一区二区不卡无毒影院| 欧美日韩国产小视频在线观看| 亚洲午夜私人影院| 欧美色电影在线| 三级不卡在线观看| 日韩视频一区二区三区| 久久精品国产久精国产| 日韩欧美亚洲另类制服综合在线| 日韩精品一级中文字幕精品视频免费观看| 欧美日韩国产成人在线免费| 日韩极品在线观看| 精品少妇一区二区三区| 国产一区二区看久久| 国产欧美精品国产国产专区 | 国产婷婷色一区二区三区四区| 国产福利精品一区二区| 国产精品国产三级国产aⅴ中文| 91欧美一区二区| 亚洲成人先锋电影| 精品国产伦一区二区三区观看方式| 国产一区二区三区四区在线观看| 国产农村妇女毛片精品久久麻豆| 91丝袜国产在线播放| 亚洲v精品v日韩v欧美v专区| 日韩精品一区二区三区在线播放| 国产福利91精品一区| 亚洲精品少妇30p| 欧美高清一级片在线| 激情六月婷婷久久| 亚洲视频 欧洲视频| 91精品国产一区二区三区蜜臀 | 麻豆精品在线播放| 国产人成亚洲第一网站在线播放| 不卡影院免费观看| 一区二区三区免费| 日韩视频免费观看高清完整版在线观看| 国产一区久久久| 亚洲品质自拍视频网站| 日韩一区二区在线播放| 99视频国产精品| 日产国产欧美视频一区精品| 国产日本欧美一区二区| 欧美日韩一区二区在线观看| 国产精品性做久久久久久| 一区二区三区欧美日韩| 欧美变态口味重另类| 91麻豆123| 韩国精品久久久| 亚洲已满18点击进入久久| 久久午夜免费电影| 欧美视频日韩视频在线观看| 国产盗摄一区二区| 日韩精品亚洲专区| 中文字幕亚洲电影| 欧美大白屁股肥臀xxxxxx| 91福利资源站| 国产91在线看| 美女脱光内衣内裤视频久久影院| 亚洲免费观看视频| 久久成人18免费观看| 欧美一区二区视频在线观看 | 91亚洲精品一区二区乱码| 青青草原综合久久大伊人精品| 国产精品久久久久久久久图文区| 欧美一级二级在线观看| 日本二三区不卡| 国产成人免费高清| 日韩精品久久久久久| 一区二区三区美女视频| 国产精品女同互慰在线看| 精品日韩成人av| 91精品婷婷国产综合久久| 色婷婷精品大在线视频| 成人视屏免费看| 国内精品国产三级国产a久久| 午夜精品一区在线观看| 亚洲欧洲综合另类| 中文字幕在线观看一区二区| 精品国产一区二区三区四区四| 在线91免费看| 欧美视频在线一区二区三区| 99国产精品国产精品久久| 成人在线视频首页| 国产黄色精品网站| 国产一区二区女| 激情图片小说一区| 免费在线观看一区二区三区| 天天色综合天天| 肉肉av福利一精品导航| 天堂va蜜桃一区二区三区漫画版| 亚洲妇熟xx妇色黄| 亚洲成人www|