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

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

?? pascal_sub.c

?? C語言的擴充PL0文法編譯器
?? C
?? 第 1 頁 / 共 3 頁
字號:
{
	int p, q, t;
	enter(id, varbl, 0);
	p = ix;
	getsym();
	while(sym == comma)
	{
		getsym();
		check(ident);
		enter(id, varbl, 0);
		getsym();
	}
	q = ix;
	skip(colon);
	typ(&t);
	skip(semicolon);
	do{
		itab[p].vlevel = lev;
		dx = dx - ttab[t].size;
		itab[p].tip = t;
		itab[p].vadr = dx;
		itab[p].refpar = FALSE;
		p = p + 1;
	}while(p <= q);	
}

/*參數列表*/
void paramlist(int *p, int * ps)
{
	BOOL r;
	int t;
	if(sym == varsym)
	{
		r = TRUE;
		getsym();
	}
	else
		r = FALSE;
	check(ident);
	*p = ix;
	enter(id, varbl, 0);
	getsym();
	while(sym == comma)
	{
		getsym();
		check(ident);
		enter(id, varbl, 0);
		getsym();
	}
	skip(colon);
	check(ident);
	typ(&t);
	while(*p < ix)
	{
		*p = *p + 1;
		itab[*p].tip = t;
		itab[*p].refpar = r;
		if(r)
			*ps = *ps + 1;	/*傳地址*/
		else
			*ps = *ps + ttab[t].size;	/*傳值*/
	}
}

void funcdeclaration(BOOL isf)
{
	int f, p, ps, odx;
	getsym();
	check(ident);
	enter(id, funkt, 0);
	getsym();
	f = ix;
	itab[f].flevel = lev;
	itab[f].fadr = codelabel();
	gen1(jump, 0);
	if(lev == lmax)
	{
		error(127);	/*深度超過限度,應退出*/
	}
	lev = lev + 1;
	if(lev == -1)
		nl = 0;
	else
		namelist[lev] = 0;
	ps = 1;
	odx = dx;
	if(sym == lparen)
	{
		do{
			getsym();
			paramlist(&p, &ps);
		}while(sym == semicolon);
		skip(rparen);
	}
	if(lev > 1)
		dx = -1;
	else
		dx = 0;
	itab[f].resultadr = ps;
	p = f;
	while(p < ix)
	{
		p = p + 1;
		if(itab[p].refpar)
			ps = ps - 1;
		else
			ps = ps - ttab[itab[p].tip].size;
		itab[p].vlevel = lev;
		itab[p].vadr = ps;
	}
	if(isf == TRUE)
	{
		skip(colon);
		check(ident);
		typ(&(itab[f].tip));
		if(ttab[itab[f].tip].kind != simple)
			error(128);	/*只能返回簡單類型*/
	}
	skip(semicolon);
	itab[f].lastpar = ix;
	itab[f].inside = TRUE;
	block(itab[f].fadr);
	itab[f].inside = FALSE;
	gen1(pexit, itab[f].resultadr - dx);
	lev = lev - 1;
	dx = odx;
	skip(semicolon);
}

void block(int l)
{
	int d, odx, oix;
	odx = dx;
	oix = ix;
	if(sym == constsym)
	{
		getsym();
		check(ident);
		do{
			constdeclaration();
		}while(sym == ident);
	}
	if(sym == typesym)
	{
		getsym();
		check(ident);
		do{
			typedeclaration();
		}while(sym == ident);
	}
	if(sym == varsym)
	{
		getsym();
		check(ident);
		do{
			vardeclaration();
		}while(sym == ident);
	}
	while(sym == funcsym || sym == procsym)
	{
		if(sym == funcsym)
			funcdeclaration(TRUE);
		else
			funcdeclaration(FALSE);
	}
	if(l + 1 == codelabel())
		cx = cx -1;
	else
		code[l].a = codelabel();
	if(lev == 0)
		gen1(sets, dx);
	else
	{
		d = dx - odx;
		dx = odx;
		gen1(adjs, d);
	}
	statement();
	if(lev != 0)
		gen1(adjs, odx - dx);
	ix = oix;
}

void listcode(FILE * fi)
{
	int i;
	for(i = 0; i < cx; i++)
	{
		fprintf(fi, "%-4d :   ", i);
		switch(code[i].op)
		{
		case add:
			fprintf(fi, "add\n");
			break;
        case neg:
			fprintf(fi, "neg\n");
			break;
        case mul:
			fprintf(fi, "mul\n");
			break;
        case divd:
			fprintf(fi, "divd\n");
			break;
        case remd:
			fprintf(fi, "remd\n");
			break;
        case div2:
			fprintf(fi, "div2\n");
			break;
        case rem2:
			fprintf(fi, "rem2\n");
			break;
        case eqli:
			fprintf(fi, "eqli\n");
			break;
        case neqi:
			fprintf(fi, "neqi\n");
			break;
        case lssi:
			fprintf(fi, "lssi\n");
			break;
        case leqi:
			fprintf(fi, "leqi\n");
			break;
        case gtri:
			fprintf(fi, "gtri\n");
			break;
        case geqi:
			fprintf(fi, "geqi\n");
			break;
        case dupl:
			fprintf(fi, "dupl\n");
			break;
        case swap:
			fprintf(fi, "swap\n");
			break;
        case andb:
			fprintf(fi, "andb\n");
			break;
        case orb:
			fprintf(fi, "orb\n");
			break;
        case load:
			fprintf(fi, "load\n");
			break;
        case stor:
			fprintf(fi, "stor\n");
			break;
        case hhalt:
			fprintf(fi, "hhalt\n");
			break;
        case wri:
			fprintf(fi, "wri\n");
			break;
        case wrc:
			fprintf(fi, "wrc\n");
			break;
        case wrl:
			fprintf(fi, "wrl\n");
			break;
        case rdi:
			fprintf(fi, "rdi\n");
			break;
        case rdc:
			fprintf(fi, "rdc\n");
			break;
        case rdl:
			fprintf(fi, "rdl\n");
			break;
        case eol:
			fprintf(fi, "eol\n");
			break;
        case ldc:
			fprintf(fi, "ldc   %d\n", code[i].a);
			break;
        case ldla:
			fprintf(fi, "ldla  %d\n", code[i].a);
			break;
        case ldl:
			fprintf(fi,"ldl   %d\n", code[i].a);
			break;
        case ldg:
			fprintf(fi, "ldg   %d\n", code[i].a);
			break;
        case stl:
			fprintf(fi, "stl   %d\n", code[i].a);
			break;
        case stg:
			fprintf(fi, "stg   %d\n", code[i].a);
			break;
        case move:
			fprintf(fi, "move  %d\n", code[i].a);
			break;
        case copy:
			fprintf(fi, "copy  %d\n", code[i].a);
			break;
        case addc:
			fprintf(fi, "addc  %d\n", code[i].a);
			break;
        case mulc:
			fprintf(fi, "mulc  %d\n", code[i].a);
			break;
        case jump:
			fprintf(fi, "jump  %d\n", code[i].a);
			break;
        case jumpz:
			fprintf(fi, "jumpz %d\n", code[i].a);
			break;
        case call:
			fprintf(fi, "call  %d\n", code[i].a);
			break;
        case adjs:
			fprintf(fi, "adjs  %d\n", code[i].a);
			break;
        case sets:
			fprintf(fi, "sets  %d\n", code[i].a);
			break;
        case pexit:
			fprintf(fi, "exit  %d\n", code[i].a);
			break;
		}
	}
}

void compile()
{
	ttab[intip].size = 1;
	ttab[intip].kind = simple;
	ttab[chartip].size = 1;
	ttab[chartip].kind = simple;
	ttab[booltip].size = 1;
	ttab[booltip].kind = simple;
	tx = 3;
	nl = 0;	/* namelist[-1] = 0; */
	lev = -1;
	ix = 0;
	enter("false", konst, booltip);
	itab[ix].val = FALSE;
	enter("true", konst, booltip);
	itab[ix].val = TRUE;
	enter("maxint", konst, intip);
	itab[ix].val = 32767;
	enter("integer", tipe, intip);
	enter("char", tipe, chartip);
	enter("boolean", tipe, booltip);

	enter("abs", funkt, intip);
	itab[ix].flevel = -1;
	itab[ix].fadr = fabs;
	itab[ix].inside = FALSE;

	enter("sqr", funkt, intip);
	itab[ix].flevel = -1;
	itab[ix].fadr = fsqr;
	itab[ix].inside = FALSE;

	enter("odd", funkt, booltip);
	itab[ix].flevel = -1;
	itab[ix].fadr = fodd;
	itab[ix].inside = FALSE;

	enter("chr", funkt, chartip);
	itab[ix].flevel = -1;
	itab[ix].fadr = fchr;
	itab[ix].inside = FALSE;

	enter("ord", funkt, intip);
	itab[ix].flevel = -1;
	itab[ix].fadr = ford;
	itab[ix].inside = FALSE;

	enter("write", funkt, 0);
	itab[ix].flevel = -1;
	itab[ix].fadr = fwrite;

	enter("writeln", funkt, 0);
	itab[ix].flevel = -1;
	itab[ix].fadr = fwriteln;

	enter("read", funkt, 0);
	itab[ix].flevel = -1;
	itab[ix].fadr = fread;

	enter("readln", funkt, 0);
	itab[ix].flevel = -1;
	itab[ix].fadr = freadln;

	enter("eoln", funkt, booltip);
	itab[ix].flevel = -1;
	itab[ix].fadr = feoln;
	itab[ix].inside = FALSE;

	namelist[0] = 0;
	lev = 0;
	cc = 0;
	ll = 0;

	getch();
	getsym();

	labeled = FALSE;
	cx = 0;
	dx = amax + 1;

	skip(progsym);
	skip(ident);
	check(lparen);
	do{
		getsym();
		check(ident);
		if(strcmp(id, "input") != 0 && strcmp(id, "output") != 0)
			error(129);
		getsym();
	}while(sym == comma);
	skip(rparen);
	skip(semicolon);
	gen1(jump, 0);
	block(0);
	gen0(hhalt);
	check(period);
}

/*解釋執行*/
void interpret()
{
	int pc, sp, j, k, n;
	instr i;
	char c;
	BOOL h;

	pc = 0;
	h = FALSE;
	do{
		i = code[pc];
		pc = pc + 1;
		switch(i.op)
		{
		case add:
			m[sp + 1] = m[sp + 1] + m[sp];
			sp = sp + 1;
			break;
		case neg:
			m[sp] = -m[sp];
			break;
		case mul:
			m[sp + 1] = m[sp + 1] * m[sp];
			sp = sp + 1;
			break;
		case divd:
			m[sp + 1] = m[sp + 1] / m[sp];
			sp = sp + 1;
			break;
		case remd:
			m[sp + 1] = m[sp + 1] % m[sp];
			sp = sp + 1;
			break;
		case div2:
			m[sp] = m[sp] / 2;
			break;
		case rem2:
			m[sp] = m[sp] % 2;
			break;
		case eqli:
			m[sp + 1] = (m[sp + 1] == m[sp]);
			sp = sp + 1;
			break;
		case neqi:
			m[sp + 1] = (m[sp + 1] != m[sp]);
			sp = sp + 1;
			break;
		case lssi:
			m[sp + 1] = (m[sp + 1] < m[sp]);
			sp = sp + 1;
			break;
		case leqi:
			m[sp + 1] = (m[sp + 1] <= m[sp]);
			sp = sp + 1;
			break;
		case gtri:
			m[sp + 1] = (m[sp + 1] > m[sp]);
			sp = sp + 1;
			break;
		case geqi:
			m[sp + 1] = (m[sp + 1] >= m[sp]);
			sp = sp + 1;
			break;
		case dupl:
			sp = sp - 1;
			m[sp] = m[sp + 1];
			break;
		case swap:
			k = m[sp];
			m[sp] = m[sp + 1];
			m[sp + 1] = k;
			break;
		case andb:
			if(m[sp] == 0)
				m[sp + 1] = 0;
			sp = sp + 1;
			break;
		case orb:
			if(m[sp] == 1)
				m[sp + 1] = 1;
			sp = sp + 1;
			break;
		case load:
			m[sp] = m[m[sp]];
			break;
		case stor:
			m[m[sp]] = m[sp + 1];
			sp = sp + 2;
			break;
		case hhalt:
			h = TRUE;
			break;
		case wri:
			/*待定*/
			fprintf(stdout, "%d", m[sp + 1]);
			sp = sp + 2;
			break;
		case wrc:
			fprintf(stdout, "%c", m[sp]);
			sp = sp + 1;
			break;
		case wrl:
			fprintf(stdout, "\n");
			break;
		case rdi:
			fprintf(stdout, "input integer: ");
			fscanf(stdin, "%d", &(m[m[sp]]));
			sp = sp + 1;
			break;
		case rdc:
			fprintf(stdout, "input character: ");
			fscanf(stdin, "%c", &c);
			m[m[sp]] = c;
			sp = sp + 1;
			break;
		case rdl:
			/*待定*/
			break;
		case eol:
			sp = sp - 1;
			m[sp] = feof(stdin);
			break;
		case ldc:
			sp = sp - 1;
			m[sp] = i.a;
			break;
		case ldla:
			sp = sp - 1;
			m[sp] = sp + 1 + i.a;
			break;
		case ldl:
			sp = sp - 1;
			m[sp] = m[sp + 1 + i.a];
			break;
		case ldg:
			sp = sp - 1;
			m[sp] = m[i.a];
			break;
		case stl:
			m[sp + i.a] = m[sp];
			sp = sp + 1;
			break;
		case stg:
			m[i.a] = m[sp];
			sp = sp + 1;
			break;
		case move:
			k = m[sp];
			j = m[sp + 1];
			sp = sp + 2;
			n = i.a;
			do{
				n = n - 1;
				m[k + n] = m[j + n];
			}while(n > 0);
			break;
		case copy:
			j = m[sp];
			n = i.a;
			sp = sp - n + 1;
			do{
				n = n - 1;
				m[sp + n] = m[j + n];
			}while(n > 0);
			break;
		case addc:
			m[sp] = m[sp] + i.a;
			break;
		case mulc:
			m[sp] = m[sp] * i.a;
			break;
		case jump:
			pc = i.a;
			break;
		case jumpz:
			if(m[sp] == 0)
				pc = i.a;
			sp = sp + 1;
			break;
		case call:
			sp = sp - 1;
			m[sp] = pc;
			pc = i.a;
			break;
		case adjs:
			sp = sp + i.a;
			break;
		case sets:
			sp = i.a;
			break;
		case pexit:
			pc = m[sp];
			sp = sp + i.a;
			break;
		}
	}while(h == FALSE);
}


void main(int argc, char **argv)
{
	char filename[81], save;
	FILE * sf;
	memset(filename, 0, 81);
	if(argc == 1)
	{
		fprintf(stdout, "please enter source file name: ");
		fscanf(stdin, "%s", filename);
	}
	else
		strcpy(filename, argv[1]);
	source = fopen(filename, "r");
	if(source == NULL)
	{
		fprintf(stderr, "cann't open file: %s\n", filename);
		return;
	}
	fprintf(stdout, "compiling...\n");
	compile();
	fclose(source);
	fprintf(stdout, "no errors, compile succeed.\n");
	fprintf(stdout, "--------------------------------\n");
	listcode(stdout);
	fprintf(stdout, "--------------------------------\n");
	fprintf(stdout, "Run>\n");
	interpret();
	fprintf(stdout, "program exit.\n");
	fprintf(stdout, "do you want to save the code(y or n): ");
	do{
		scanf("%c", &save);
	}while(save != 'y' && save != 'Y' && save != 'n' && save != 'N');
	if(save == 'y' || save == 'Y')
	{
		fprintf(stdout, "enter file name: ");
		scanf("%s", filename);
		sf = fopen(filename, "w");
		if(sf)
		{
			listcode(sf);
			fclose(sf);
		}
		else
			fprintf(stdout, "open file error, code not saved.\n");
	}
	
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线免费亚洲电影| 免费在线观看成人| 欧美本精品男人aⅴ天堂| 色婷婷av一区| 色婷婷国产精品| 99精品久久只有精品| 久久se这里有精品| 日韩精品成人一区二区在线| 亚洲精品国产第一综合99久久 | 国产精一品亚洲二区在线视频| 婷婷久久综合九色国产成人| 亚洲综合精品自拍| 天天av天天翘天天综合网| 亚洲自拍偷拍av| 日韩av电影免费观看高清完整版在线观看| 一区二区日韩av| 香蕉久久夜色精品国产使用方法| 午夜视频在线观看一区| 欧美a级一区二区| 国产精品一品视频| 99精品桃花视频在线观看| 色网站国产精品| 日韩欧美在线一区二区三区| 26uuuu精品一区二区| 国产精品免费人成网站| 亚洲裸体xxx| 青娱乐精品视频在线| 国产在线精品一区二区夜色 | 经典一区二区三区| 国产成人av电影免费在线观看| 成人av在线网站| 91精品黄色片免费大全| 久久久久亚洲综合| 亚洲精品美国一| 激情深爱一区二区| 色就色 综合激情| 欧美成人综合网站| 国产精品妹子av| 视频精品一区二区| 福利一区二区在线| 56国语精品自产拍在线观看| 亚洲国产精品传媒在线观看| 亚洲国产精品一区二区尤物区| 韩国女主播成人在线观看| 91在线视频官网| 亚洲精品一区二区三区香蕉| 亚洲理论在线观看| 国产一区二区0| 91精品国产色综合久久久蜜香臀| 亚洲国产精品ⅴa在线观看| 午夜精品视频一区| www.欧美日韩| 久久网站最新地址| 天堂精品中文字幕在线| 成人免费观看视频| 久久在线免费观看| 五月婷婷久久综合| 在线观看欧美黄色| 国产精品不卡在线| 国产一区二区视频在线| 欧美日韩久久久一区| 亚洲欧美综合色| 国产成人av资源| 精品捆绑美女sm三区| 亚洲va韩国va欧美va| 91蜜桃免费观看视频| 国产目拍亚洲精品99久久精品| 日韩成人伦理电影在线观看| 欧美性大战久久久| 亚洲尤物视频在线| 91福利区一区二区三区| 最新成人av在线| 波多野结衣中文字幕一区| 久久久久九九视频| 极品少妇xxxx精品少妇偷拍| 欧美一级日韩一级| 奇米一区二区三区| 678五月天丁香亚洲综合网| 夜色激情一区二区| 日本久久一区二区| 亚洲在线中文字幕| 欧洲一区二区三区免费视频| 亚洲婷婷综合色高清在线| 成人99免费视频| 国产精品乱码人人做人人爱| 盗摄精品av一区二区三区| 久久精品夜色噜噜亚洲a∨| 国产在线不卡一卡二卡三卡四卡| 欧美成人猛片aaaaaaa| 国产一区不卡精品| 国产精品久久午夜| 91丨九色丨蝌蚪丨老版| 亚洲另类春色校园小说| 欧美日本乱大交xxxxx| 丝袜美腿亚洲一区二区图片| 日韩欧美国产wwwww| 国产麻豆精品在线| 亚洲婷婷综合色高清在线| 一本大道久久a久久综合婷婷| 亚洲一区二区三区四区五区黄| 欧美精选一区二区| 经典三级在线一区| 17c精品麻豆一区二区免费| 91黄视频在线| 毛片不卡一区二区| 国产精品乱人伦| 欧美日韩国产影片| 国产伦精品一区二区三区免费| 亚洲欧美在线视频观看| 欧美亚洲愉拍一区二区| 久久国产剧场电影| 亚洲欧美国产三级| 日韩精品在线一区| 91久久国产最好的精华液| 强制捆绑调教一区二区| 成人欧美一区二区三区白人| 欧美人伦禁忌dvd放荡欲情| 国产精品一区二区x88av| 亚洲综合一区二区三区| 精品国产污污免费网站入口 | 在线这里只有精品| 日韩电影免费一区| 亚洲欧美一区二区三区国产精品| 欧美一区二区视频观看视频| aaa国产一区| 久久不见久久见免费视频7| 亚洲精品中文字幕在线观看| 精品国产百合女同互慰| 91久久精品一区二区三| 风间由美一区二区三区在线观看| 91蜜桃免费观看视频| 亚洲久草在线视频| 97se亚洲国产综合自在线不卡| 日韩av一区二区三区| 国产精品福利在线播放| 日韩欧美第一区| 色综合久久久久| 成人少妇影院yyyy| 久久99国产精品久久99果冻传媒| 亚洲精品国产无天堂网2021 | 亚洲精品一二三| 国产日产亚洲精品系列| 日韩一区二区三区免费观看| 欧美亚洲图片小说| 91女神在线视频| 国产91精品一区二区麻豆网站| 青青草国产精品97视觉盛宴| 午夜影院在线观看欧美| 亚洲精品日韩专区silk| 国产精品成人一区二区艾草 | 亚洲在线中文字幕| 一区二区三区四区精品在线视频| 国产精品麻豆欧美日韩ww| 国产亚洲欧洲一区高清在线观看| 日韩视频在线永久播放| 欧美大胆一级视频| 欧美一区二区三区免费视频| 88在线观看91蜜桃国自产| 欧美性感一类影片在线播放| 欧美午夜免费电影| 91.com视频| 精品91自产拍在线观看一区| 2017欧美狠狠色| 国产精品乱子久久久久| 亚洲精品国产第一综合99久久 | 国产一区999| 国产精品 日产精品 欧美精品| 国产成人精品一区二区三区四区 | 国产精品传媒入口麻豆| 亚洲欧美偷拍卡通变态| 亚洲欧美视频在线观看视频| 日韩欧美中文字幕精品| 91在线观看下载| 91麻豆国产香蕉久久精品| a4yy欧美一区二区三区| 欧美精品日韩一区| 欧美日韩国产经典色站一区二区三区| 色综合久久久久久久| 欧美一区二区三区播放老司机| 制服丝袜在线91| 精品久久久久久亚洲综合网| 色婷婷综合久久| 欧美一级艳片视频免费观看| 欧美mv日韩mv国产网站| 欧美一区二视频| 国产精品每日更新| 亚洲一区在线观看免费 | 欧美日高清视频| 91精品国产品国语在线不卡| 日韩美女主播在线视频一区二区三区 | 日本中文在线一区| 蜜臀精品一区二区三区在线观看| 精品一区中文字幕| 久久爱另类一区二区小说| 久久国产三级精品| 99久久婷婷国产综合精品电影| 欧美优质美女网站| 777色狠狠一区二区三区| 久久久久久免费| 亚洲久本草在线中文字幕|