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

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

?? pascal_sub.c

?? C語言的擴充PL0文法編譯器
?? C
?? 第 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

/*指令碼*/
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
}opcode;

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

/*詞法類別*/
typedef enum symbol{
	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, progsym, funcsym,
	procsym
}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;
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[] = {
	{ "", -1 },
	{ "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 },
	{ "program", progsym },
	{ "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(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);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美高清dvd碟片| 亚洲免费在线视频一区 二区| 国产成人免费av在线| 成人av网站在线| 欧美日韩免费高清一区色橹橹| 91视频你懂的| 亚洲丝袜另类动漫二区| 欧美一区二区啪啪| 国产一区二区福利视频| 亚洲电影一区二区| 亚洲一线二线三线久久久| 国产一区二区三区观看| 国产精品你懂的在线欣赏| 欧美日韩一区二区三区视频| 亚洲欧洲一区二区在线播放| 国产综合色精品一区二区三区| 日本亚洲电影天堂| 欧美一卡二卡三卡| 91国产免费观看| 蜜臀国产一区二区三区在线播放| 26uuu国产日韩综合| 91精品久久久久久久99蜜桃| 一本大道av伊人久久综合| 亚洲一区二区三区四区的| www.性欧美| 久久成人久久爱| 精品久久久久av影院| 色综合色狠狠综合色| 麻豆精品国产传媒mv男同| 日本一区二区三区在线观看| 久久综合九色综合欧美就去吻| 国产一区二区视频在线| 亚洲电影第三页| 青娱乐精品视频| 婷婷久久综合九色国产成人| 丁香亚洲综合激情啪啪综合| 亚洲精品一线二线三线无人区| 免费高清在线视频一区·| 午夜视频一区二区三区| 亚洲福中文字幕伊人影院| 国产精品毛片高清在线完整版| 制服丝袜亚洲色图| 国产精品污www在线观看| 日韩一级大片在线观看| 91精品麻豆日日躁夜夜躁| 久久精品亚洲精品国产欧美kt∨ | 日韩色在线观看| 久久精品亚洲精品国产欧美| 国产精品久久久一本精品| 午夜精品久久久久影视| 亚洲欧美另类在线| 国产一区二区三区免费观看| 国产成人午夜片在线观看高清观看| 国产剧情一区二区三区| 99riav久久精品riav| 在线观看一区二区视频| 国产乱码精品1区2区3区| 国产精品综合一区二区三区| 欧美羞羞免费网站| www一区二区| 亚洲成人福利片| 99在线视频精品| 宅男在线国产精品| 国产亚洲福利社区一区| 日韩专区欧美专区| 久久精品国产免费看久久精品| 在线观看日韩国产| 亚洲韩国精品一区| 欧美精品v国产精品v日韩精品| 国产精品久久久久aaaa| 日韩和欧美一区二区三区| 国产精品一区二区你懂的| 777奇米四色成人影色区| 国产蜜臀97一区二区三区| 国产高清不卡一区二区| 91精品国产一区二区| 国产一区二区在线看| 欧美少妇性性性| 亚洲综合色在线| 亚洲国产日日夜夜| 麻豆精品一区二区av白丝在线 | 亚洲欧美中日韩| 成人性视频网站| 国产视频一区在线播放| 亚洲综合精品自拍| 亚洲一区二区三区小说| 精品国产伦一区二区三区观看方式 | 日韩一区在线免费观看| 国产美女娇喘av呻吟久久| 国产午夜精品一区二区| 国产乱子伦一区二区三区国色天香| 国产精品少妇自拍| 欧美精品v国产精品v日韩精品| 激情欧美一区二区三区在线观看| 久久美女艺术照精彩视频福利播放| 午夜精品福利在线| 国产性色一区二区| 在线观看国产一区二区| 色综合久久综合中文综合网| 久久久蜜臀国产一区二区| 国产精品一区二区不卡| 久久久噜噜噜久久中文字幕色伊伊| 99久久精品免费| 麻豆成人久久精品二区三区红 | ...中文天堂在线一区| 精品一区二区三区免费毛片爱| 国产精品二三区| 色婷婷av一区| 五月天欧美精品| 国产欧美一区二区精品性| 91国内精品野花午夜精品| 日本成人在线看| 天天免费综合色| 一区二区视频在线看| 欧美精品一区二区三区视频| 欧美人与性动xxxx| av不卡免费电影| 国产69精品久久久久777| 亚洲综合色视频| 一区二区欧美在线观看| 久久蜜桃av一区精品变态类天堂 | 国产女人aaa级久久久级| 中文字幕欧美国产| 国产精品每日更新| 国产日韩精品久久久| 国产欧美日韩激情| 成人一道本在线| 欧美伊人精品成人久久综合97| 成人精品鲁一区一区二区| 国产精品丝袜在线| 91福利国产精品| 亚洲综合色丁香婷婷六月图片| 欧美高清www午色夜在线视频| 91在线云播放| 99久久99久久精品国产片果冻| 欧美午夜影院一区| www.久久精品| 日韩二区三区四区| 粉嫩av亚洲一区二区图片| 夜夜嗨av一区二区三区网页| 日韩欧美精品在线视频| 欧美日韩综合色| 99视频精品免费视频| 在线一区二区视频| 韩国毛片一区二区三区| 激情欧美日韩一区二区| 青青国产91久久久久久| 亚洲黄网站在线观看| 欧美日韩中字一区| 风流少妇一区二区| 99久久国产综合精品麻豆| 日韩片之四级片| 51精品视频一区二区三区| 日韩欧美的一区二区| yourporn久久国产精品| 91久久精品一区二区三| 久久综合久久综合亚洲| 图片区小说区国产精品视频| 亚洲影视资源网| 免费高清在线一区| 99视频国产精品| 精品成人一区二区三区四区| 亚洲超碰精品一区二区| eeuss鲁片一区二区三区在线看| 欧美亚洲国产一卡| 午夜精品免费在线观看| 国产suv精品一区二区6| 中文字幕欧美激情一区| 国产精品久久久久久久久免费桃花| 一片黄亚洲嫩模| 欧美一级片在线| 国产日韩欧美一区二区三区乱码 | 午夜欧美视频在线观看| 国产一区二区伦理| 欧美一区二区三区色| 亚洲第一成年网| 国产在线精品国自产拍免费| 91精品啪在线观看国产60岁| 九九视频精品免费| 国产精品久久三| 在线亚洲一区观看| 中文字幕第一页久久| 欧美日韩在线综合| 自拍偷在线精品自拍偷无码专区| 欧美亚洲国产一区在线观看网站| 亚洲丶国产丶欧美一区二区三区| 免费看日韩精品| 亚洲视频一区二区在线| 一区二区三区四区亚洲| 欧美视频一区在线| 国产精品免费丝袜| 色88888久久久久久影院按摩| 色综合天天综合网国产成人综合天| 欧美一区二区精品在线| 日本在线不卡视频| 日本韩国一区二区三区视频| 天堂va蜜桃一区二区三区| 粉嫩av亚洲一区二区图片| 亚洲四区在线观看| 黄色日韩三级电影|