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

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

?? pascal_sub.c

?? C語言的擴充PL0文法編譯器
?? C
?? 第 1 頁 / 共 3 頁
字號:
					}
				}while(sym == comma);
				skip(rbrack);
				break;
			}
		}
	}
}

void varpar(int * t)
{
	int j;
	check(ident);
	j = position();
	selector(t, &j);
	if(j != 0)
		addressvar(j);
}

/*標準函數*/
void standfct(int n)
{
	int x, l;
	switch(n)
	{
	case fabs:
		skip(lparen);
		expression(&x);
		mustbe(intip, x);
		gen0(dupl);
		gen1(ldc, 0);
		gen0(lssi);
		l = codelabel();
		gen1(jumpz, 0);
		gen0(neg);
		code[l].a = codelabel();
		skip(rparen);
		break;
	case fsqr:
		skip(lparen);
		expression(&x);
		mustbe(intip, x);
		gen0(dupl);
		gen0(mul);
		skip(rparen);
		break;
	case fodd:
		skip(lparen);
		expression(&x);
		mustbe(intip, x);
		gen0(rem2);
		skip(rparen);
		break;
	case fchr:
		skip(lparen);
		expression(&x);
		mustbe(intip, x);
		skip(rparen);
		break;
	case ford:
		skip(lparen);
		expression(&x);
		mustbe(chartip, x);
		skip(rparen);
		break;
	case fwrite:
	case fwriteln:
		if(n == fwrite)
			check(lparen);
		if(sym == lparen)
		{
			do{
				getsym();
				if(sym == sstring)
				{
					for(x = 0; x < slen; x++)
					{
						gen1(ldc, str[x]);
						gen0(wrc);
					}
					getsym();
				}
				else
				{
					expression(&x);
					if(sym == colon)
					{
						mustbe(intip, x);
						getsym();
						expression(&x);
						mustbe(intip, x);
						gen0(wri);
					}
					else if(x == intip)
					{
						gen1(ldc, 8);
						gen0(wri);
					}
					else if(x == chartip)
					{
						gen0(wrc);
					}
					else
						error(111);
				}
			}while(sym == comma);
			skip(rparen);
		}
		if(n == fwriteln)
			gen0(wrl);
		break;
	case fread:
	case freadln:
		if(n == fread)
			check(lparen);
		if(sym == lparen)
		{
			do{
				getsym();
				varpar(&x);
				if(x == intip)
					gen0(rdi);
				else if(x == chartip)
					gen0(rdc);
				else
					error(112);
			}while(sym == comma);
			skip(rparen);
		}
		if(n == freadln)
			gen0(rdl);
		break;
	case feoln:
		gen0(eol);
		break;
	}
}

/*函數,過程調用*/
void funcall(int i)
{
	int d, p, x;
	getsym();
	if(itab[i].flevel < 0)
		standfct(itab[i].fadr);
	else
	{
		if(itab[i].tip != 0)
			gen1(ldc, 0);
		p = i;
		d = dx;
		if(sym == lparen)
		{
			do{
				getsym();
				if(p == itab[i].lastpar)
					error(113);
				else
				{
					p = p + 1;
					if(itab[p].refpar == TRUE)
						varpar(&x);
					else
					{
						expression(&x);
						if(ttab[x].kind != simple)
							gen1(copy, ttab[x].size);
					}
				}
				mustbe(itab[p].tip, x);
			}while(sym == comma);
			skip(rparen);
		}
		if(p != itab[i].lastpar)
			error(114);
		if(itab[i].flevel != 0)
			address(itab[i].flevel, 0);
		gen1(call, itab[i].fadr);
		dx = d;
	}
}

/*因子*/
void factor(int * t)
{
	int i;
	if(sym == ident)
	{
		i = position();
		*t = itab[i].tip;
		switch(itab[i].kind)
		{
		case konst:
			getsym();
			gen1(ldc, itab[i].val);
			break;
		case varbl:
			selector(t, &i);
			if(i != 0)
				addressvar(i);
			if(ttab[i].kind == simple)
				gen0(load);
			break;
		case funkt:
			if(*t == 0)
				error(115);
			else
				funcall(i);
			break;
		case tipe:
			error(116);	/*類型名不能作為因子*/
			break;
		}
	}
	else if(sym == number)
	{
		gen1(ldc, num);
		*t = intip;
		getsym();
	}
	else if(sym == sstring && slen == 2)
	{
		gen1(ldc, str[0]);
		*t = chartip;
		getsym();
	}
	else if(sym == lparen)
	{
		getsym();
		expression(t);
		skip(rparen);
	}
	else if(sym == notsym)
	{
		getsym();
		factor(t);
		mustbe(booltip, *t);
		gen0(neg);
		gen1(addc, 1);
	}
	else
		error(117);
}

/*表達式的項*/
void term(int * x)
{
	int y;
	factor(x);
	while(sym == andsym || sym == star || sym == divsym || sym == modsym)
	{
		if(sym == andsym)
			mustbe(booltip, *x);
		else
			mustbe(intip, *x);
		switch(sym)
		{
		case star:
			getsym();
			factor(&y);
			gen0(mul);
			break;
		case divsym:
			getsym();
			factor(&y);
			gen0(divd);
			break;
		case modsym:
			getsym();
			factor(&y);
			gen0(remd);
			break;
		case andsym:
			getsym();
			factor(&y);
			gen0(andb);
			break;
		}
		mustbe(*x, y);
	}
}

/*簡單表達式*/
void simpleexpression(int * x)
{
	int y;
	if(sym == plus)
	{
		getsym();
		term(x);
		mustbe(intip, *x);
	}
	else if(sym == minus)
	{
		getsym();
		term(x);
		mustbe(intip, *x);
		gen0(neg);
	}
	else
		term(x);
	while(sym == orsym || sym == plus || sym == minus)
	{
		if(sym == orsym)
			mustbe(booltip, *x);
		else
			mustbe(intip, *x);
		switch(sym)
		{
		case plus:
			getsym();
			term(&y);
			gen0(add);
			break;
		case minus:
			getsym();
			term(&y);
			gen0(neg);
			gen0(add);
			break;
		case orsym:
			getsym();
			term(&y);
			gen0(orb);
			break;
		}
		mustbe(*x, y);
	}
}

/*表達式*/
void expression(int * x)
{
	symbol op;
	int y;
	simpleexpression(x);
	if(sym == eql ||sym == neq || sym == lss || sym == leq || sym == gtr ||sym == geq)
	{
		if(ttab[*x].kind != simple)
			error(118);
		else
		{
			op = sym;
			getsym();
			simpleexpression(&y);
			mustbe(*x, y);
			switch(op)
			{
			case eql:
				gen0(eqli);
				break;
			case neq:
				gen0(neqi);
				break;
			case lss:
				gen0(lssi);
				break;
			case leq:
				gen0(leqi);
				break;
			case gtr:
				gen0(gtri);
				break;
			case geq:
				gen0(geqi);
				break;
			}
			*x = booltip;
		}
	}
}

/*語句*/
void statement()
{
	int i, j, t, x;
	if(sym == ident)
	{
		i = position();
		switch(itab[i].kind)
		{
		case varbl:
			selector(&t, &i);
			skip(becomes);
			expression(&x);
			mustbe(t, x);
			if(i == 0)
				gen0(swap);
			else
				addressvar(i);
			if(ttab[i].kind == simple)
				gen0(stor);
			else
				gen1(move, ttab[i].size);
			break;
		case funkt:
			if(itab[i].tip == 0)
				funcall(i);
			else
			{
				if(itab[i].inside == FALSE)
					error(119);/*此處不能對函數賦值*/
				else
				{
					getsym();
					skip(becomes);
					expression(&x);
					mustbe(itab[i].tip, x);
					address(itab[i].flevel + 1, itab[i].resultadr);
					gen0(stor);
				}
			}
			break;
		case konst:
		case field:
		case tipe:
			error(120);	/*變量不能用在此處*/
			break;
		}
	}
	else if(sym == ifsym)
	{
		getsym();
		expression(&t);
		mustbe(booltip, t);
		skip(thensym);
		i = codelabel();
		gen1(jumpz, 0);
		statement();
		if(sym == elsesym)
		{
			getsym();
			j = codelabel();
			gen1(jump, 0);
			code[i].a = codelabel();
			i = j;
			statement();
		}
		code[i].a = codelabel();
	}
	else if(sym == whilesym)
	{
		getsym();
		i = codelabel();
		expression(&t);
		mustbe(booltip, t);
		skip(dosym);
		j = codelabel();
		gen1(jumpz, 0);
		statement();
		gen1(jump, i);
		/*這里表寫錯了*/
		code[j].a = codelabel();
	}
	else if(sym == repeatsym)
	{
		i = codelabel();
		do{
			getsym();
			statement();
		}while(sym == semicolon);
		skip(untilsym);
		expression(&t);
		mustbe(booltip, t);
		gen1(jumpz, i);
	}
	else if(sym == beginsym)
	{
		do{
			getsym();
			statement();
		}while(sym == semicolon);
		skip(endsym);
	}
}

void block(int l);

/*常量*/
void constant(int * c, int * t)
{
	int i, s;
	if(sym == sstring && slen == 2)
	{
		*c = str[0];
		*t = chartip;
	}
	else
	{
		if(sym == plus)
		{
			getsym();
			s = +1;
		}
		else if(sym == minus)
		{
			getsym();
			s = -1;
		}
		else
			s = 0;
		if(sym == ident)
		{
			i = position();
			if(itab[i].kind != konst)
				error(121);
			else
			{
				*c = itab[i].val;
				*t = itab[i].tip;
			}
		}
		else if(sym == number)
		{
			*c = num;
			*t = intip;
		}
		else
			error(122);
		if(s != 0)
		{
			mustbe(*t, intip);
			(*c) = (*c) * (s);
		}
	}
	getsym();
}

/*常量聲明*/
void constdeclaration()
{
	alfa a;
	int t, c;
	strcpy(a, id);
	getsym();
	skip(eql);
	constant(&c, &t);
	skip(semicolon);
	enter(a, konst, t);
	itab[ix].val = c;
}

void typ(int * t);

/*數組類型*/
void arraytyp(int * t)
{
	int x;
	ttab[*t].kind = arrays;
	getsym();
	constant(&(ttab[*t].low), &x);
	mustbe(intip, x);
	skip(colon);
	constant(&(ttab[*t].high), &x);
	mustbe(intip, x);
	if(ttab[*t].low > ttab[*t].high)
		error(123);	/*數組邊界問題*/
	if(sym == comma)
		arraytyp(&(ttab[*t].elemtip));
	else
	{
		skip(rbrack);
		skip(ofsym);
		typ(&(ttab[*t].elemtip));
	}
	ttab[*t].size = (ttab[*t].high - ttab[*t].low + 1) * ttab[ttab[*t].elemtip].size;
}

/*類型定義*/
void typ(int * t)
{
	int i, j, sz, ft;
	if(sym == ident)
	{
		i = position();
		if(itab[i].kind != tipe)
			error(124);	/*這個標識符不是類型能夠*/
		else
		{
			*t = itab[i].tip;
			getsym();
		}
	}
	else
	{
		if(tx == tmax)
		{
			error(125);	/*溢出,應退出*/
		}
		else
		{
			tx = tx + 1;
			*t = tx;
		}
		if(sym == arraysym)
		{
			getsym();
			check(lbrack);
			arraytyp(t);
		}
		else
		{
			skip(recordsym);
			if(lev == lmax)
			{
				error(126);	/*深度超過限度,應退出*/
			}
			else
			{
				lev = lev + 1;
				if(lev == -1)
					nl = 0;
				else
					namelist[lev] = 0;
				check(ident);
				sz = 0;
				do{
					enter(id, field, 0);
					i = ix;
					getsym();
					while(sym == comma)
					{
						getsym();
						check(ident);
						enter(id, field, 0);
						getsym();
					}
					j = ix;
					skip(colon);
					typ(&ft);
					do{
						itab[i].tip = ft;
						itab[i].offset = sz;
						sz = sz + ttab[ft].size;
						i = i + 1;
					}while(i <= j);
					if(sym == semicolon)
						getsym();
					else
						check(endsym);
				}while(sym == ident);
				ttab[*t].size = sz;
				ttab[*t].kind = records;
				if(lev == -1)
					ttab[*t].fields = nl;
				else
					ttab[*t].fields = namelist[lev];
				lev = lev - 1;
				skip(endsym);
			}
		}
	}
}

/*類型聲明,type保留字處*/
void typedeclaration()
{
	alfa a;
	int t;
	strcpy(a, id);
	getsym();
	skip(eql);
	typ(&t);
	skip(semicolon);
	enter(a, tipe, t);
}

/*變量聲明*/
void vardeclaration()

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久99热这里只有精品| 亚洲午夜电影在线| 91黄色激情网站| 日本韩国精品在线| 99综合影院在线| 国产成人综合在线观看| 国产在线播精品第三| 国产成人av一区二区三区在线观看| 丝袜国产日韩另类美女| 日韩一本二本av| 欧美综合在线视频| 在线播放国产精品二区一二区四区| 91精品婷婷国产综合久久性色| 91精品在线观看入口| 日韩三级视频在线看| 国产日韩欧美一区二区三区综合 | av网站免费线看精品| 日韩一级二级三级| 91在线观看免费视频| 成人动漫在线一区| 一个色综合av| 精品制服美女丁香| 成人妖精视频yjsp地址| 成人av电影在线播放| 欧美无人高清视频在线观看| 日韩欧美一二区| 国产精品不卡在线| 偷窥国产亚洲免费视频| 国产精一品亚洲二区在线视频| 高清久久久久久| 欧美高清视频不卡网| 久久久噜噜噜久噜久久综合| 亚洲人吸女人奶水| 国产一区二区不卡老阿姨| 91久久人澡人人添人人爽欧美| 欧美电视剧在线观看完整版| 日韩伦理av电影| 精品一区二区三区久久久| 99久久精品免费精品国产| 精品久久久久av影院| 午夜精品一区在线观看| 亚洲一区二区三区四区在线免费观看| 亚洲成人免费在线观看| 国产一区二区三区av电影| 色婷婷av一区二区三区gif | 国内外精品视频| 色综合久久久久综合| 久久这里只有精品6| 天天色图综合网| 一本色道**综合亚洲精品蜜桃冫| 欧美大胆人体bbbb| 亚洲精品国久久99热| 成人在线综合网站| 久久久久久久综合日本| 日本欧美在线看| 欧美精品777| 亚洲成av人片一区二区三区| 91免费观看视频| www.欧美亚洲| 久久国产精品露脸对白| 在线观看亚洲精品视频| 欧美激情一区在线观看| 视频一区在线播放| 久久久久久久免费视频了| 欧日韩精品视频| 色综合天天综合网国产成人综合天 | 亚洲综合一区二区三区| 精品久久久久一区二区国产| 亚洲国产成人av网| 亚洲一区二区偷拍精品| 国产精品高潮呻吟| 国产欧美一区二区精品仙草咪| 日韩精品在线一区| 欧美日韩一卡二卡三卡| 91精品国产色综合久久不卡电影| 精品一区二区三区久久| 国产成人在线视频网址| 亚洲一二三区视频在线观看| 婷婷丁香久久五月婷婷| 91在线观看成人| 欧美国产国产综合| 亚洲国产精品v| 18涩涩午夜精品.www| 亚洲午夜久久久久久久久久久| 96av麻豆蜜桃一区二区| 亚洲高清不卡在线| 欧美日韩一级二级三级| 婷婷国产在线综合| 日韩欧美国产一区二区三区| 亚洲成av人片www| 欧美一级高清片| 国产福利91精品一区| 国产精品福利电影一区二区三区四区| 成人国产一区二区三区精品| 亚洲人成网站影音先锋播放| 欧美日韩在线一区二区| 久久99精品国产91久久来源| 国产精品国产三级国产有无不卡| 色婷婷激情综合| 日本免费在线视频不卡一不卡二| 久久久久国产成人精品亚洲午夜| 成人高清免费观看| 午夜影院久久久| 国产蜜臀97一区二区三区| 91免费观看国产| 久久成人18免费观看| 国产精品久久久久影院色老大 | 欧美精品丝袜中出| 精品亚洲国内自在自线福利| 亚洲女同ⅹxx女同tv| 欧美一级黄色大片| 色域天天综合网| 久久国产精品区| 亚洲一二三专区| 欧美极品xxx| 欧美巨大另类极品videosbest | 中文字幕第一区二区| 欧美性大战久久| 国产成人精品亚洲午夜麻豆| 亚洲第一主播视频| 国产精品色呦呦| 欧美大片国产精品| 欧美日韩激情一区| 91同城在线观看| 国产精品一二三在| 久久激五月天综合精品| 亚洲国产精品自拍| 亚洲美女偷拍久久| 亚洲国产成人在线| 欧美精品一区二区三区蜜桃 | 欧美日韩小视频| 色又黄又爽网站www久久| 丰满岳乱妇一区二区三区| 久久国产成人午夜av影院| 午夜av一区二区三区| 亚洲综合精品自拍| 一区二区三区蜜桃| 亚洲欧美日本韩国| 综合婷婷亚洲小说| 国产精品成人免费在线| 国产精品久久久久久久久久免费看| 日韩三级在线免费观看| 日韩欧美自拍偷拍| 91精品国产91久久综合桃花| 欧美肥妇毛茸茸| 欧美人与z0zoxxxx视频| 欧美性感一类影片在线播放| 在线视频国内一区二区| 欧美中文一区二区三区| 欧美日韩精品欧美日韩精品一| 欧美又粗又大又爽| 欧美午夜精品久久久久久超碰| 91福利资源站| 欧美日韩在线直播| 91精品国产麻豆| 欧美精品一区二区三区久久久 | 欧美日韩一二三| 欧美视频一二三区| 日韩一区二区三区在线观看| 日韩一区二区在线免费观看| 欧美成人性战久久| 久久人人爽人人爽| 国产精品卡一卡二| 一区二区三区在线观看网站| 亚洲成人在线网站| 精品一区二区三区在线播放视频| 精品一区二区精品| 成人福利视频在线| 欧美在线观看视频一区二区三区| 欧美日韩免费观看一区三区| 欧美一区在线视频| 国产农村妇女毛片精品久久麻豆| 亚洲品质自拍视频| 日本中文一区二区三区| 国内精品久久久久影院色 | 亚洲一区二区三区小说| 美女免费视频一区| 国产91精品一区二区| 色婷婷av一区二区三区大白胸| 欧美一区欧美二区| 中文字幕亚洲成人| 午夜av区久久| 成人国产精品免费| 欧美一区二区人人喊爽| 亚洲国产精品精华液ab| 亚洲成a人v欧美综合天堂| 国内精品在线播放| 欧美视频完全免费看| 欧美激情综合五月色丁香小说| 亚洲一区二区三区四区在线观看 | 国产网站一区二区| 一区二区成人在线| 风间由美性色一区二区三区| 欧美一区二区视频观看视频| 国产精品国产自产拍高清av王其 | 午夜欧美电影在线观看| 国产精品99久| 精品久久久久99| 亚洲va国产天堂va久久en| 高清不卡在线观看av|