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

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

?? compile.cpp

?? 編譯原理課程設計大作業PL0文法簡易編譯器
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "ctype.h"

#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif

typedef int BOOL;

#define cxmax 2000
#define amax 16383

#define imax 100 /* length of identifier table */
#define tmax 100 /* length of type table */
#define lmax 10  /* maximum level */
#define al 10  /* length of identifiers */
#define norw 27  /* number of reserverd words */

/* standard function */
#define fabs 0
#define fsqr 1
#define fodd 2
#define fchr 3
#define ford 4
#define fwrite 5
#define fwriteln 6
#define fread 7
#define freadln 8
#define feoln 9

/* standard types */
#define intip 1
#define booltip 2
#define chartip 3
#define realtip 4

/*指令碼*/
typedef enum opcode{
	add, neg, mul, divd, remd, div2, rem2, eqli, neqi, lssi,
		leqi, gtri, geqi, dupl, swap, andb, orb,
		load, stor, hhalt, wri, wrc, wrl, rdi, rdc, rdl, eol,
		ldc, ldla, ldl, ldg, stl, stg, move, copy, addc, mulc,
		jump, jumpz, call, adjs, sets, pexit, inc, dec
}opcode;

/*指令結構體*/
typedef struct instr{
	opcode op;
	int a;
}instr;

/*詞法類別*/
typedef enum symbol{pl0=-1,
ident, number, sstring, plus, minus, star, lbrack, rbrack,
colon, eql, neq, lss, leq, gtr, geq, lparen, rparen, comma, 
semicolon, period, becomes,
beginsym, endsym, ifsym, thensym, elsesym, whilesym, dosym,
casesym, repeatsym, untilsym, forsym, tosym, downtosym,
notsym, divsym, modsym, andsym, orsym, constsym, varsym,
typesym, arraysym, ofsym, recordsym, funcsym,procsym,cstring
}symbol;

/*變量類型*/
typedef enum idkind{
	konst, varbl, field, tipe, funkt
}idkind;

/*類型的種類,簡單的,數組,記錄類型*/
typedef enum tpkind{
	simple, arrays, records
}tpkind;

typedef char alfa[al+1];

instr code[cxmax + 1];
int m[amax + 1];

/*詞法分析相關全局變量*/
char ch;
int cc = 0, ll = 0;
char line[129];
symbol sym;
alfa id;
char string[imax];
int num;
char str[81];
int slen;
/*alfa word[norw + 1];*/
int cx;
int lev;
int dx;
BOOL labeled;
int nl; /* as namelist[-1] */
int namelist[lmax];
int ix, tx; /* indices in tables */

/* identifier table */
typedef struct ITAB{
	alfa name;
	int link;
	int tip;
	idkind kind;
	union{
		int val; /*常量類型的值*/
		struct{
			int vlevel;
			int vadr;
			BOOL refpar;
		};   /*變量類型的屬性*/
		int offset; /*域類型的偏移地址*/
		struct{
			int flevel;
			int fadr;
			int lastpar;
			int resultadr;
			BOOL inside;
		};   /*函數類型的屬性*/
	};
}ITAB;
ITAB itab[imax + 1];

/* type table */
typedef struct TTAB{
	int size;
	tpkind kind;
	union{
		struct{
			int low;
			int high;
			int elemtip;
		}; /*數組類型的屬性*/
		int fields; /*記錄類型最后一個域的地址*/
	};
}TTAB;
TTAB ttab[tmax + 1];

/*保留字*/
static struct{
	alfa name;
	symbol lex;
}word[] = {
	{" ", pl0},
	{"begin", beginsym },
	{ "end", endsym },
	{ "if", ifsym },
	{ "then", thensym },
	{ "else", elsesym },
	{ "while", whilesym },
	{ "do", dosym },
	{ "case", casesym },
	{ "repeat", repeatsym },
	{ "until", untilsym },
	{ "for", forsym },
	{ "to", tosym },
	{ "downto", downtosym },
	{ "not", notsym },
	{ "div", divsym },
	{ "mod", modsym },
	{ "and", andsym },
	{ "or", orsym },
	{ "const", constsym },
	{ "var", varsym },
	{ "type", typesym },
	{ "array", arraysym },
	{ "of", ofsym },
	{ "record", recordsym },
	{ "function", funcsym },
	{ "procedure", procsym }
};

FILE * source;
BOOL eof_flag = FALSE;

symbol search()
{
	int i;
	for(i = norw; i >= 1; i--)
	{
		if(strcmp(id, word[i].name) == 0)
			return word[i].lex;
	}
	return ident;
}

void error(int n)
{
	int i;
	for(i = 0; i < ll; i++)
		putchar(line[i]);
	for(i = 0; i <= cc - 1; i++)
		putchar(' ');
	printf("^\n");
	printf("error %d detected\n", n);
	exit(1);
}

void getch()
{
	if (cc == ll)
	{
		memset(line, 0, 129);
		if(feof(source))
		{
			fprintf(stderr, "program incomplete\n");
			exit(0);
		}
		ll = 0;
		cc = 0;
		while(!feof(source) && (ch = getc(source)) != '\n')
		{
			line[ll] = ch;
			ll++;
		}
		if(ch == '\n')
		{
			line[ll] = ch;
			ll++;
		}
	}
	ch = line[cc];
	cc++;
}

void getsym()
{
	int k;
	int strend;
	while(ch == ' ' || ch == '\t' || ch == '\n')
		getch();
	if(isalpha(ch))
	{
		memset(id, 0, al+1);
		k = 0;
		do{
			if(k != al)
			{
				id[k] = ch;
				k++;
			}
			getch();
		}while(isalnum(ch));
		sym = search();
	}
	else if(ch=='\"')
	{
		k=0;
		do{
			getch();
			string[k]=ch;
			k++;
		}while(ch!='\"');
		sym=cstring;
	}
	else if(isdigit(ch))
	{
		num = 0;
		sym = number;
		do{
			num = 10 * num + (ch - '0');
			getch();
		}while(isdigit(ch));
	}
	else if(ch == ':')
	{
		getch();
		if(ch == '=')
		{
			getch();
			sym = becomes;
		}
		else
			sym = colon;
	}
	else if(ch == '>')
	{
		getch();
		if(ch == '=')
		{
			getch();
			sym = geq;
		}
		else
			sym = gtr;
	}
	else if(ch == '<')
	{
		getch();
		if(ch == '=')
		{
			getch();
			sym = leq;
		}
		else if(ch == '>')
		{
			getch();
			sym = neq;
		}
		else
			sym = lss;
	}
	else if(ch == '.')
	{
		getch();
		if(ch == '.')
		{
			getch();
			sym = colon;
		}
		else
			sym = period;
	}
	else if(ch == '\\')
	{
		slen = 0;
		strend = FALSE;
		sym = sstring;
		do{
			if(cc == ll)
				error(101);
			getch();
			if(ch == '\\')
			{
				getch();
				if(ch == '\\')
				{
					str[slen] = ch;
					slen++;
				}
				else
					strend = TRUE;
			}
			else
			{
				str[slen] = ch;
				slen++;
			}
		}while(strend == FALSE);
		if(slen == 0)
			error(102); /*不允許空字符串*/
		str[slen++] = '\0';
	}
	else if(ch == '+')
	{
		getch();
		sym = plus;
	}
	else if(ch == '-')
	{
		getch();
		sym = minus;
	}
	else if(ch == '*')
	{
		getch();
		sym = star;
	}
	else if(ch == '(')
	{
		getch();
		sym = lparen;
	}
	else if(ch == ')')
	{
		getch();
		sym = rparen;
	}
	else if(ch == '[')
	{
		getch();
		sym = lbrack;
	}
	else if(ch == ']')
	{
		getch();
		sym = rbrack;
	}
	else if(ch == '=')
	{
		getch();
		sym = eql;
	}
	else if(ch == ',')
	{
		getch();
		sym = comma;
	}
	else if(ch == ';')
	{
		getch();
		sym = semicolon;
	}
	else if(ch == '{')
	{
		do{
			getch();
		}while(ch != '}');
		getch();
		getsym();
	}
	else
		error(104);
}

void check(symbol s)
{
	if(sym != s)
		error(s);
}

void skip(symbol s)
{
	check(s);
	getsym();
}

/*將符號串登記入符號表*/
void enter(alfa id, idkind k, int t)
{
	int j;
	if(ix == imax)
		error(104);
	else
	{
		ix++;
		strcpy(itab[0].name, id);
		if(lev == -1)
			j = nl;
		else
			j = namelist[lev];
		while(strcmp(itab[j].name, id) != 0)
			j = itab[j].link;
		if(j != 0)
			error(105);
		else
		{
			strcpy(itab[ix].name, id);
			if(lev == -1)
				itab[ix].link = nl;
			else
				itab[ix].link = namelist[lev];
			itab[ix].tip = t;
			itab[ix].kind = k;
			
			if(lev == -1)
				nl = ix;
			else
				namelist[lev] = ix;
		}
	}
}

/*在符號表中查找符號,返回位置*/
int position()
{
	int i , j;
	strcpy(itab[0].name, id);
	i = lev;
	do{
		if(i == -1)
			j = nl;
		else
			j = namelist[i];
		while(strcmp(itab[j].name, id) != 0)
			j = itab[j].link;
		i = i - 1;
	}while(i >= -1 && j == 0);
	if(j == 0)
		error(106);
	return j;
}

void gen(instr i)
{
	switch(i.op)
	{
	case dupl:
	case eol:
	case ldc:
	case ldla:
	case ldl:
	case ldg:
		dx = dx - 1;
		break;
	case add:
	case mul:
	case divd:
	case remd:
	case eqli:
	case neqi:
	case lssi:
	case leqi:
	case gtri:
	case geqi:
	case andb:
	case orb:
	case wrc:
	case rdi:
	case rdc:
	case stl:
	case stg:
	case jumpz:
		dx = dx + 1;
		break;
	case stor:
	case wri:
	case move:
		dx = dx + 2;
		break;
	case copy:
		dx = dx - i.a + 1;
		break;
	case adjs:
		dx = dx + i.a;
		break;
	}
	if(!(((i.op == addc || i.op == adjs) && (i.a == 0)) || ((i.op == mulc) && (i.a == 1))))
	{
		if(labeled)
		{
			code[cx] = i;
			cx = cx +1;
			labeled = FALSE;
		}
		else if(code[cx - 1].op == ldc && i.op == add)
		{
			code[cx - 1].op = addc;
		}
		else if(code[cx - 1].op == ldc && i.op == mul)
		{
			code[cx - 1].op = mulc;
		}
		else if(code[cx - 1].op == ldc &&  i.op == neg)
		{
			code[cx - 1].a = -code[cx - 1].a;
		}
		else if(code[cx - 1].op == ldc && code[cx - 1].a == 2 && i.op == divd)
		{
			code[cx - 1].op = div2;
		}
		else if(code[cx - 1].op == ldc && code[cx - 1].a == 2 && i.op == remd)
		{
			code[cx - 1].op = rem2;
		}
		else if(code[cx - 1].op == ldc && i.op == stor)
		{
			code[cx - 1].op = stg;
		}
		else if(code[cx - 1].op == ldc && i.op == load)
		{
			code[cx - 1].op = ldg;
		}
		else if(code[cx - 1].op == ldla && i.op == stor)
		{
			code[cx - 1].op = stl;
		}
		else if(code[cx - 1].op == ldla && i.op == load)
		{
			code[cx - 1].op = ldl;
		}
		else
		{
			code[cx] = i;
			cx = cx + 1;
		}
	}
}

void gen0(opcode op)
{
	instr i;
	i.op = op;
	gen(i);
}

void gen1(opcode op, int a)
{
	instr i;
	i.op = op;
	i.a = a;
	gen(i);
}

int codelabel()
{
	labeled = TRUE;
	return cx;
}

void address(int lv, int ad)
{
	if(lv == 0)
		gen1(ldc, ad);
	else if(lv == lev)
		gen1(ldla, ad - dx);
	else
	{
		gen1(ldl, -dx);
		while(lv + 1 != lev)
		{
			gen0(load);
			lv = lv + 1;
		}
		gen1(addc, ad);
	}
}

void addressvar(int ref)
{
	address(itab[ref].vlevel, itab[ref].vadr);
	if(itab[ref].refpar)
		gen0(load);
}

void mustbe(int x, int y)
{
	if(x != y)
	{
		if((ttab[x].kind == arrays) && (ttab[y].kind == arrays) && 
			(ttab[x].low == ttab[y].low) && (ttab[x].high == ttab[y].high))
			mustbe(ttab[x].elemtip, ttab[y].elemtip);
		else
			error(107);/*類型不匹配*/
	}
}

void expression(int * x);

void selector(int * t, int * ref)
{
	int j, x;
	*t = itab[*ref].tip;
	getsym();
	if(sym == period ||sym == lbrack)
	{
		addressvar(*ref);
		*ref = 0;
		while(sym == period || sym == lbrack)
		{
			switch(sym)
			{
			case period:
				if(ttab[*t].kind != records)
					error(108);
				else
				{
					getsym();
					check(ident);
					j = ttab[*t].fields;
					strcpy(itab[0].name, id);
					while(strcmp(itab[0].name, id) != 0)
						j = itab[j].link;
					if(j == 0)
						error(109);
					else
					{
						gen1(addc, itab[j].offset);
						*t = itab[j].tip;
						getsym();
					}
				}
				break;
			case lbrack:
				do{
					if(ttab[*t].kind != arrays)
						error(110);
					else
					{
						getsym();
						expression(&x);
						mustbe(intip, x);
						gen1(addc, -(ttab[*t].low));
						*t = ttab[*t].elemtip;
						gen1(mulc, ttab[*t].size);
						gen0(add);
					}
				}while(sym == comma);
				skip(rbrack);
				break;
			}
		}
	}
}

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕精品一区 | 国产高清成人在线| 94-欧美-setu| 欧美哺乳videos| 一区二区三区在线免费观看| 极品少妇一区二区| 欧美日韩国产一区| 亚洲精品免费视频| 成人精品视频一区二区三区尤物| 3d动漫精品啪啪1区2区免费 | 亚洲成人综合网站| 国产91清纯白嫩初高中在线观看 | 久久蜜桃一区二区| 青青国产91久久久久久| 日本韩国欧美一区二区三区| 久久综合九色综合欧美就去吻| 天堂影院一区二区| 在线免费观看日本欧美| 中文字幕不卡三区| 福利91精品一区二区三区| 91麻豆精品国产91久久久久久| 亚洲综合一区二区三区| 不卡的电影网站| 国产丝袜欧美中文另类| 久久电影网站中文字幕| 欧美疯狂做受xxxx富婆| 亚洲第一二三四区| 欧美日韩精品欧美日韩精品| 伊人婷婷欧美激情| 欧美性猛交xxxxxxxx| 亚洲女同一区二区| 色婷婷国产精品| 亚洲乱码日产精品bd| 日本黄色一区二区| 一区二区国产盗摄色噜噜| 国产精一区二区三区| 久久久亚洲精华液精华液精华液 | 丝袜诱惑亚洲看片| 欧美日本免费一区二区三区| 视频一区二区三区在线| 欧美日韩国产天堂| 卡一卡二国产精品| 国产欧美在线观看一区| 成人av网站在线观看| 欧美zozo另类异族| 国产精品资源在线观看| 中文av一区二区| 色综合天天综合网天天狠天天| 伊人色综合久久天天人手人婷| 欧美日韩亚洲综合一区| 日韩高清一级片| 国产亚洲婷婷免费| 色999日韩国产欧美一区二区| 亚洲国产一二三| 日韩欧美久久久| 成人免费电影视频| 亚洲一区二区中文在线| 4438成人网| 国产.精品.日韩.另类.中文.在线.播放 | 播五月开心婷婷综合| 亚洲激情在线激情| 欧美精品久久一区| 国产老肥熟一区二区三区| 亚洲啪啪综合av一区二区三区| 欧美日韩国产成人在线免费| 蓝色福利精品导航| 国产精品成人一区二区艾草| 欧美日韩国产综合一区二区三区| 日韩中文字幕不卡| 中文字幕欧美国产| 欧美日韩一区国产| 国产高清成人在线| 亚洲午夜精品在线| 中文av一区二区| 91精品国产综合久久香蕉的特点| 国产成人午夜电影网| 午夜影视日本亚洲欧洲精品| 国产婷婷色一区二区三区四区| 欧美自拍偷拍午夜视频| 国产精品主播直播| 婷婷开心激情综合| 综合久久国产九一剧情麻豆| 日韩久久免费av| 欧美日韩一区成人| 99精品欧美一区二区三区综合在线| 毛片不卡一区二区| 亚洲国产精品一区二区久久| 国产欧美日韩精品在线| 欧美大白屁股肥臀xxxxxx| 在线观看av不卡| 粉嫩13p一区二区三区| 日本不卡视频在线| 亚洲一区二区在线免费看| 国产精品久久久久永久免费观看| 欧美一区二区三区人| 91久久香蕉国产日韩欧美9色| 国产精品一二三四五| 秋霞电影一区二区| 日韩国产精品久久久| 一区二区三区欧美视频| 中文字幕在线不卡| 久久久久久久久久美女| 精品少妇一区二区三区在线播放| 在线不卡一区二区| 91久久精品日日躁夜夜躁欧美| 国产盗摄精品一区二区三区在线| 日韩精品电影在线观看| 亚洲a一区二区| 一区二区免费看| 伊人婷婷欧美激情| 亚洲精品国产高清久久伦理二区| 国产精品嫩草99a| 国产日韩精品一区二区浪潮av| 26uuu国产在线精品一区二区| 欧美日本乱大交xxxxx| 欧美精品tushy高清| 欧美日韩色综合| 在线观看欧美黄色| 欧美三级电影网| 在线观看成人免费视频| 欧美日韩综合不卡| 欧美精品在线视频| 欧美一区二区美女| 欧美一区午夜视频在线观看| 678五月天丁香亚洲综合网| 91精品国产91久久久久久一区二区| 欧美精品日韩精品| 欧美一区二区不卡视频| 日韩欧美激情在线| 久久精品一区二区三区四区| 国产欧美一区二区精品性色| 国产精品伦理一区二区| 亚洲蜜臀av乱码久久精品| 偷偷要91色婷婷| 国产综合久久久久影院| eeuss影院一区二区三区| 91视频一区二区| 欧美日韩一区二区三区高清 | 国产视频视频一区| 亚洲狼人国产精品| 免费成人美女在线观看| 久久er精品视频| 成人国产精品免费| 欧美性猛交xxxxxx富婆| 久久这里只精品最新地址| 国产精品久久免费看| 午夜久久久久久久久久一区二区| 经典三级视频一区| 91国产丝袜在线播放| 日韩欧美一二区| 国产精品高潮呻吟| 日韩高清一级片| 成人ar影院免费观看视频| 欧美日韩免费一区二区三区 | 国产传媒日韩欧美成人| 色综合久久久久综合| 日韩欧美一级在线播放| 亚洲欧美一区二区视频| 美女高潮久久久| 日本久久一区二区| 国产亚洲精品免费| 同产精品九九九| 成人免费观看av| 日韩手机在线导航| 亚洲一区成人在线| 国产**成人网毛片九色| 日韩一区二区三区三四区视频在线观看| 久久精品亚洲一区二区三区浴池| 亚洲高清免费观看高清完整版在线观看| 国产综合久久久久影院| 91精品国产色综合久久不卡电影| 国产精品国产三级国产a| 激情成人综合网| 91精品一区二区三区在线观看| 中文字幕一区免费在线观看| 久久99这里只有精品| 欧美色图第一页| 亚洲精品免费电影| 91丨九色丨黑人外教| 国产欧美日韩一区二区三区在线观看| 天天av天天翘天天综合网| 91在线观看高清| 国产欧美日韩三级| 国产乱人伦精品一区二区在线观看| 538prom精品视频线放| 亚洲一区二区三区四区中文字幕| 国产不卡视频在线观看| 久久综合九色综合97婷婷女人| 秋霞午夜鲁丝一区二区老狼| 欧美视频在线一区| 一区二区三区欧美视频| 一本色道**综合亚洲精品蜜桃冫| 亚洲国产精品国自产拍av| 国产乱理伦片在线观看夜一区| 欧美电影免费提供在线观看| 日韩精品亚洲专区| 日韩视频一区二区在线观看| 喷白浆一区二区| 日韩女优视频免费观看| 免费观看在线综合|