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

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

?? expr.c

?? 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一区二区三区免费野_久草精品视频
日韩av不卡在线观看| 亚洲欧美日韩在线| 欧美一级xxx| 7777精品伊人久久久大香线蕉经典版下载 | 国产精品久久三| 国产精品乱码久久久久久| 欧美高清在线精品一区| 国产精品国产三级国产aⅴ入口| 国产目拍亚洲精品99久久精品| 久久久久久久久久电影| 国产精品免费人成网站| 亚洲视频一区在线| 亚洲成在线观看| 麻豆国产精品官网| 成人精品视频一区二区三区| 色综合久久久久综合体| 欧美日韩在线不卡| 欧美一区二区精品在线| 国产三级三级三级精品8ⅰ区| 欧美激情中文不卡| 亚洲视频在线一区观看| 视频一区在线播放| 国产资源在线一区| 91免费在线看| 精品久久人人做人人爽| 中文字幕一区二区三区在线观看| 一级特黄大欧美久久久| 免费在线观看日韩欧美| 成人av在线观| 日韩一级完整毛片| 中文字幕日韩一区| 久久99精品久久久久久| 在线观看亚洲精品视频| 26uuu色噜噜精品一区二区| 国产欧美日韩综合| 日本欧美韩国一区三区| 国产不卡视频在线播放| 在线电影一区二区三区| 国产精品久久毛片a| 奇米777欧美一区二区| 不卡一区在线观看| 欧美一级日韩免费不卡| 亚洲色图20p| 国产乱人伦精品一区二区在线观看| 99综合影院在线| xnxx国产精品| 五月婷婷另类国产| 色婷婷综合久久久久中文| 久久久久国产一区二区三区四区| 五月激情综合网| 色噜噜夜夜夜综合网| 中国色在线观看另类| 美美哒免费高清在线观看视频一区二区| 99这里只有久久精品视频| 久久综合色天天久久综合图片| 亚洲h动漫在线| 91在线云播放| 国产无一区二区| 国产综合色精品一区二区三区| 欧美日韩大陆一区二区| 一区二区三区四区乱视频| 粉嫩13p一区二区三区| 久久久久免费观看| 精品一区二区三区av| 日韩一卡二卡三卡四卡| 蜜桃久久av一区| 88在线观看91蜜桃国自产| 一区二区三区四区不卡在线 | 久久精品亚洲精品国产欧美kt∨| 日韩精品久久理论片| 欧美老女人在线| 无码av免费一区二区三区试看| 日本精品视频一区二区三区| 亚洲精品网站在线观看| 色网综合在线观看| 亚洲电影欧美电影有声小说| 欧美中文字幕一区二区三区| 亚洲愉拍自拍另类高清精品| 91免费视频网址| 亚洲电影一区二区三区| 69堂国产成人免费视频| 日韩精品91亚洲二区在线观看 | 成人美女视频在线观看18| 国产视频一区二区三区在线观看| 经典三级在线一区| 中文字幕欧美日韩一区| eeuss影院一区二区三区| 亚洲色欲色欲www在线观看| 91日韩一区二区三区| 亚洲电影欧美电影有声小说| 日韩一区二区不卡| 国产a精品视频| 亚洲靠逼com| 91精品视频网| 国产精品一级片在线观看| 中文字幕一区在线观看视频| 在线亚洲人成电影网站色www| 亚洲国产精品久久一线不卡| 欧美精品日韩一本| 国产麻豆精品久久一二三| 中文字幕视频一区二区三区久| 欧美日韩一区二区不卡| 久久国产剧场电影| 中文字幕色av一区二区三区| 欧美日韩电影在线播放| 国产精品1024久久| 亚洲图片欧美色图| 国产亚洲欧美一级| 欧美三级电影一区| 国产成人精品免费看| 亚洲成人自拍偷拍| 欧美国产欧美综合| 欧美一级免费大片| 成人激情综合网站| 久久精品国产成人一区二区三区 | 亚洲精品久久久蜜桃| 日韩视频免费观看高清完整版| 国产成人av自拍| 亚洲高清在线精品| 成人免费在线视频| 久久一区二区三区四区| 欧美影视一区二区三区| 国产成人精品一区二区三区四区 | 色天天综合久久久久综合片| 久久99久久精品| 亚洲国产欧美日韩另类综合| 亚洲国产高清在线| 日韩欧美一区电影| 欧美放荡的少妇| 91豆麻精品91久久久久久| 成人动漫一区二区| 国产精品一级片在线观看| 日日摸夜夜添夜夜添精品视频 | 久久亚洲精精品中文字幕早川悠里| 色婷婷国产精品久久包臀| 国产精品99精品久久免费| 久久av资源网| 免费视频最近日韩| 日日摸夜夜添夜夜添亚洲女人| 一区二区欧美精品| 亚洲九九爱视频| 亚洲欧美色图小说| 亚洲欧美国产77777| 国产精品网站在线播放| 亚洲国产高清不卡| 国产精品视频在线看| 日本一区二区三区视频视频| 久久综合视频网| 久久综合99re88久久爱| 久久婷婷国产综合国色天香| 精品日韩一区二区三区| 欧美大尺度电影在线| 精品三级av在线| 亚洲精品在线观看网站| 国产亚洲精品aa| 国产日本欧美一区二区| 中文字幕av一区二区三区免费看 | 一区二区三区在线观看视频| 亚洲美女区一区| 亚洲高清免费观看 | 国产精品一区二区在线观看不卡 | 日韩欧美在线影院| 欧美草草影院在线视频| 26uuu国产日韩综合| 国产欧美一区二区三区在线老狼| 国产情人综合久久777777| 国产精品麻豆久久久| 尤物av一区二区| 偷拍一区二区三区| 精品亚洲成a人| 日本va欧美va精品| 国产麻豆精品视频| 91美女蜜桃在线| 日韩丝袜美女视频| 国产女人18水真多18精品一级做| ...中文天堂在线一区| 丝袜诱惑制服诱惑色一区在线观看| 青青草原综合久久大伊人精品优势| 国模大尺度一区二区三区| 91在线小视频| 欧美精品乱码久久久久久| 精品国产凹凸成av人网站| 亚洲视频免费在线| 久久99久久99| 91国偷自产一区二区三区成为亚洲经典 | 亚洲最大的成人av| 麻豆91精品91久久久的内涵| 国产成人三级在线观看| 色噜噜狠狠成人中文综合| 欧美xxxx在线观看| 亚洲日本一区二区三区| 日本va欧美va欧美va精品| 成人av电影免费观看| 91.xcao| 一级做a爱片久久| 国产精品99久| 欧美一级欧美三级在线观看| 国产精品视频在线看| 精品亚洲免费视频| 欧美日韩视频在线观看一区二区三区|