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

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

?? syntax.cpp

?? Win32 Console下C++實現的PL/0語言編譯程序
?? CPP
字號:
/*
FileName:		syntax.cpp
Author:			LiWen
Create:			2005-12-17
Last Modified:	2005-12-30
Discription:	語法分析和語義分析處理模塊
*/
#include "compiler.h"
//////////////////////////////////////////////////////////////////////////////////////////////
//語法分析中的錯誤一般有兩種:詞寫錯或者詞漏寫。但只有在特殊情況下才能分辨出到底屬于那種錯誤
//為了使語法分析盡可能的進行下去,在處理錯誤時,均認為是漏寫錯誤錯誤,當一個語法分析單位結束
//后,對其后跟符號集進行檢測,直到找到后跟符號集為止,再進行下一個語法單位的分析
//這樣做,不可避免的會在出錯的語法單元內相繼報告出一些無效錯誤,我們只能根據特殊情況來修正
//
//
#define iskeyword(a) (a>=beginsym && a<=procsym)
#define isrelation(a) (a>=eql && a<=geq)
#define isoperation(a) (a>=)
#define isseparator(a) (a>=lparen&&a<=period)
#define isstatebegin(a) (a==ident||a==callsym||a==beginsym||a==ifsym||a==whilesym||a==readsym||a==writesym)
/**********************后跟符號集**************************/
#define isstatefollow(a) (a==period||a==semicolon||a==endsym)
#define isprocbodyfollow(a) (a==period||a==semicolon)
#define isprocdeclfollow(a) (a==procsym||isstatebegin(a))
#define isvarfollow(a)	isprocdeclfollow(a)
#define isconstfollow(a) (a==varsym||isprocdeclfollow(a))
#define iscdtfollow(a) (a==dosym||a==thensym)
#define isexpfollow(a) (isrelation(a)||isstatefollow(a)||a==dosym||a==thensym||a==rparen||a==comma)
#define istermfollow(a) (isexpfollow(a)||a==minus||a==plus)
#define isfactorfollow(a) (istermfollow(a)||a==times||a==slash)

extern symbol sym;
extern int row;
extern char word[];
extern int num;

extern TABLE table[];
extern int tx;

extern INSTRUCTION codelist[];
extern int cx;

/*=======================================================
函數:program
參數:無
描述:處理整個代碼
返回:正常0,否則TMNT
========================================================*/
int program(){
	PRT_PROCBODY(0);
	if(sym == period)
		return 0;
	PRT_REPORT(MISSING_PERIOD);
	if(getsym()!=TMNT){
		PRT_REPORT(UNEXPECTED_EXTERN_CODE);
	}
	return 0;
}
/*=======================================================
函數:probody
參數:層數
描述:處理過程體,其第一個詞型在sym中,當它返回時
      sym中為下一個語法結構的第一個詞型
	  不檢查開始符號集,交付statement處理
返回:正常0,否則TMNT
========================================================*/
int procbody(int lev){
	int dx = 3;
	int tx0,dx0,cx0;
	if(lev>LEVMAX){
		PRT_REPORT(PROC_LEV_TOO_DEEP);
	}
	tx0 = tx;					//記錄
	dx0 = dx;
	cx0 = cx;
	table[tx0].addr = cx;			//useful in call procedure outside
	PRT_TRANSFORM(JMP,0,0);			//先為0,0,后面修改
	if(sym == constsym){
		PRT_CONSTDECLARE(lev,&dx);
	}
	if(sym == varsym){
		PRT_VARDECLARE(lev,&dx);
	}
	while(sym == procsym){
		PRT_PROCDECLARE(lev,&dx);
	}
	codelist[cx0].a = cx;
	table[tx0].addr = cx;
	PRT_TRANSFORM(INT,0,dx);
	PRT_STATEMENT(lev,&dx);
	PRT_TABLEPOP(tx-tx0);
	PRT_TRANSFORM(OPR,0,0);
	if(!isprocbodyfollow(sym)){
		PRT_REPORT(UNEXPECTED_PROCBODY_FOLLOW);
		while(!isprocbodyfollow(sym)){
			PRT_GETSYM();
		}
	}
	return 0;
}

/*=======================================================
函數:constdeclare
參數:層數,層偏移指針
描述:處理常量聲明
返回:正常0,否則TMNT
========================================================*/
int constdeclare(int lev,int* pdx){
	int i;
	PRT_GETSYM();
	while(1){
		if(sym == ident){
			i = tablesearch(word);
			if(i!=0 && table[i].lev == lev){
				PRT_REPORT(IDENT_REDECLARED);
			}
			PRT_GETSYM();
		}else{
			PRT_REPORT(IDENT_IN_CONST_EXPECTING);
		}
		if(sym == eql){
			PRT_GETSYM();
		}else{
			PRT_REPORT(EQL_IN_CONST_EXPECTING);
		}
		if(sym == number){
			PRT_TABLEINSERT(lev,cst,pdx);
			PRT_GETSYM();
		}else{
			PRT_REPORT(NUM_IN_CONST_EXPECTING);
		}
		if(sym == comma){
			PRT_GETSYM();
		}else if(sym == semicolon){
			PRT_GETSYM();
			break;
		}else{
			PRT_REPORT(MISSING_SEMICOLON_IN_CONST);
			break;
		}
	}
	if(!isconstfollow(sym)){
		PRT_REPORT(UNEXPECTED_CONST_FOLLOW);
		while(!isconstfollow(sym)){
			PRT_GETSYM();
		}
	}
	return 0;
}
/*=======================================================
函數:vardeclare
參數:層數,層偏移指針
描述:處理變量聲明
返回:正常0,否則TMNT
========================================================*/
int vardeclare(int lev, int* pdx){
	int i;
	PRT_GETSYM();
	while(1){
		if(sym == ident){
			i = tablesearch(word);
			if(i!=0 && table[i].lev == lev){
				PRT_REPORT(IDENT_REDECLARED);
			}
			PRT_GETSYM();
		}else{
			PRT_REPORT(IDENT_IN_VAR_EXPECTING);
		}
		PRT_TABLEINSERT(lev,var,pdx);
		if(sym == comma){
			PRT_GETSYM();
		}else if(sym == semicolon){
			PRT_GETSYM();
			break;
		}else{
			PRT_REPORT(MISSING_SEMICOLON_IN_VAR);
		}
	}
	if(!isvarfollow(sym)){
		PRT_REPORT(UNEXPECTED_VAR_FOLLOW);
		while(!isvarfollow(sym)){
			PRT_GETSYM();
		}
	}
	return 0;
}

int procdeclare(int lev,int*pdx){
	int i;
	PRT_GETSYM();
	if(sym == ident){
		i = tablesearch(word);
		if(i!=0 && table[i].lev == lev){
			PRT_REPORT(IDENT_REDECLARED);
		}
		PRT_TABLEINSERT(lev,proc,pdx);
		PRT_GETSYM();
	}else{
		PRT_REPORT(IDENT_IN_PROC_EXPECTING);
	}
	if(sym == semicolon){
		PRT_GETSYM();
	}else{
		PRT_REPORT(MISSING_SEMICOLON_IN_PROC);
	}
	PRT_PROCBODY(lev+1);
	if(sym == semicolon){
		PRT_GETSYM();
	}else{
		PRT_REPORT(MISSING_SEMICOLON_END_PROC);
	}
	if(!isprocdeclfollow(sym)){
		PRT_REPORT(UNEXPECTED_PROCDECL_FOLLOW);
		while(!isprocdeclfollow(sym)){
			PRT_GETSYM();
		}
	}
	return 0;
}

int statement(int lev,int* pdx){
	int i;
	int tcx,ccx;		//for jpc and PRT_CONDITION
	switch(sym){
	case ident:
		i = tablesearch(word);
		if(i == 0){
			PRT_REPORT(VAR_UNDECLARED);
			PRT_TABLEINSERT(lev,var,pdx);
		}else if(table[i].kind == constsym){
			PRT_REPORT(IDENT_CONST_IN_ASSIGN);
		}else if(table[i].kind == proc){
			PRT_REPORT(IDENT_PROC_IN_ASSIGN);
		}
		PRT_GETSYM();
		if(sym != becomes){
			PRT_REPORT(BECOMES_EXPECTING_IN_ASSIGN);
			break;
		}
		PRT_GETSYM();
		PRT_EXP(lev,pdx);
		PRT_TRANSFORM(STO,lev-table[i].lev,table[i].addr);
		break;
	case ifsym:
		PRT_GETSYM();
		PRT_CONDITION(lev,pdx);
		if(sym == thensym){
			PRT_GETSYM();
		}else{
			PRT_REPORT(THEN_EXPECTING_IN_IF);
		}
		tcx = cx;
		PRT_TRANSFORM(JPC,0,0);
		PRT_STATEMENT(lev,pdx);
		codelist[tcx].a = cx;
		break;
	case whilesym:
		PRT_GETSYM();
		ccx = cx;
		PRT_CONDITION(lev,pdx);			// if PRT_CONDITION false jmp
		tcx = cx;
		PRT_TRANSFORM(JPC,0,0);
		if(sym == dosym){
			PRT_GETSYM();
		}else{
			PRT_REPORT(DO_EXPECTING_IN_WHILE);
		}
		PRT_STATEMENT(lev,pdx);
		PRT_TRANSFORM(JMP,0,ccx);
		codelist[tcx].a = cx;
		break;
	case callsym:
		PRT_GETSYM();
		if(sym == ident){
			i = tablesearch(word);
			if(i == 0){
				PRT_REPORT(PROC_UNDECLARED);
			}else if(table[i].kind != proc){
				PRT_REPORT(PROC_EXPECTING_IN_CALL);
			}
			PRT_TRANSFORM(CAL,lev-table[i].lev,table[i].addr);
			PRT_GETSYM();
		}else{
			PRT_REPORT(PROC_EXPECTING_IN_CALL);
		}
		break;
	case readsym:
		PRT_GETSYM();
		if(sym == lparen){
			do{
				PRT_GETSYM();
				if(sym == ident){
					i = tablesearch(word);
					if(i == 0){
						PRT_REPORT(VAR_UNDECLARED);
					}else if(table[i].kind == constsym){
						PRT_REPORT(IDENT_CONST_IN_READ);
					}else if(table[i].kind == proc){
						PRT_REPORT(IDENT_PROC_IN_READ);
					}
					PRT_TRANSFORM(OPR,0,16);
					PRT_TRANSFORM(STO,lev-table[i].lev,table[i].addr);
					PRT_GETSYM();
				}else if(iskeyword(sym)){
					PRT_REPORT(KEYWORD_APPEAR_IN_READ);
				}else{
					PRT_REPORT(IDENT_EXPECTING_IN_READ);
				}
			}while(sym == comma);
		}else{
			PRT_REPORT(MISSING_LPAREN);
		}
		if(sym == rparen){
			PRT_GETSYM();
		}else{
			PRT_REPORT(MISSING_RPAREN);
		}
		break;
	case writesym:
		PRT_GETSYM();
		if(sym != lparen){
			PRT_REPORT(MISSING_LPAREN);
		}else{
			do{
				PRT_GETSYM();
				PRT_EXP(lev,pdx);
				PRT_TRANSFORM(OPR,0,14);
			}while(sym == comma);
		}
		if(sym == rparen){
			PRT_GETSYM();
		}else{
			PRT_REPORT(MISSING_RPAREN);
		}
		PRT_TRANSFORM(OPR,0,15);
		break;
	case beginsym:
		PRT_GETSYM();
		PRT_STATEMENT(lev,pdx);
		while(isstatebegin(sym) || sym == semicolon){
			if(sym==semicolon){
				PRT_GETSYM();
			}else{
				PRT_REPORT(MISSING_SEMICOLON_IN_STATEMENT);
			}
			PRT_STATEMENT(lev,pdx);
		}
		if(sym == endsym){
			PRT_GETSYM();
		}else{
			PRT_REPORT(MISSING_END);
		}
		break;
	default:
		if(isstatefollow(sym))
			break;
		PRT_REPORT(UNEXPECTED_STATEMENT_BEGIN);
		PRT_GETSYM();
		break;
	}
	if(!isstatebegin(sym)&&!isstatefollow(sym)){
		PRT_REPORT(UNEXPECTED_STATEMENT_FOLLOW);
		while(!isstatefollow(sym)){
			PRT_GETSYM();
		}
	}
	return 0;
}

int expression(int lev,int*pdx){
	enum symbol opr = sym;
	if(sym == plus || sym == minus){
		PRT_GETSYM();
	}
	PRT_TERM(lev,pdx);
	if(opr == minus){
		PRT_TRANSFORM(OPR,0,1);
	}
	while(sym == plus || sym == minus){
		opr = sym;
		PRT_GETSYM();
		PRT_TERM(lev,pdx);
		if(opr == plus){
			PRT_TRANSFORM(OPR,0,2);
		}else if(opr == minus){
			PRT_TRANSFORM(OPR,0,3);
		}
	}
	return 0;
}
int term(int lev,int* pdx){
	int opr;
	PRT_FACTOR(lev,pdx);
	while(sym == times || sym == slash){
		opr = (sym == times)?4:5;
		PRT_GETSYM();
		PRT_FACTOR(lev,pdx);
		PRT_TRANSFORM(OPR,0,opr);
	}
	return 0;
}

int factor(int lev,int* pdx){
	int i;
	if(sym == ident){
		i = tablesearch(word);
		if(i == 0){
			PRT_REPORT(VAR_UNDECLARED);
		}else if(table[i].kind == proc){
			PRT_REPORT(IDENT_PROC_IN_EXP);
		}else if(table[i].kind == cst){
			PRT_TRANSFORM(LIT,0,table[i].val);
		}else if(table[i].kind == var){
			PRT_TRANSFORM(LOD,lev-table[i].lev,table[i].addr);
		}
		PRT_GETSYM();
	}else if(sym == number){
		PRT_TRANSFORM(LIT,0,num);
		PRT_GETSYM();
	}else if(sym == lparen){
		PRT_GETSYM();
		PRT_EXP(lev,pdx);
		//PRT_GETSYM();
		if(sym == rparen){
			PRT_GETSYM();
		}else{
			PRT_REPORT(MISSING_RPAREN);
		}
	}
	if(!isstatebegin(sym)&&!isfactorfollow(sym)){
		PRT_REPORT(UNEXPECTED_FACTOR_FOLLOW);
		while(!isfactorfollow(sym)){
			PRT_GETSYM();
		}
	}
	return 0;
}


int condition(int lev,int* pdx){
	int opr;
	if(sym == oddsym){
		PRT_GETSYM();
		PRT_EXP(lev,pdx);
		return 0;
	}
	PRT_EXP(lev,pdx);
	if(!isrelation(sym)){
		PRT_REPORT(RELATIONOPR_EXPECTING_IN_CDT);
		return 0;
	}
	opr = sym - eql +8;			//8 -> opr 中 eql 的操作碼
	PRT_GETSYM();
	PRT_EXP(lev,pdx);
	PRT_TRANSFORM(OPR,0,opr);
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
|精品福利一区二区三区| 91高清视频在线| 精品国产伦理网| 久久97超碰国产精品超碰| 日韩视频免费直播| 久久国产综合精品| 久久久久久电影| 色综合久久88色综合天天| 一区二区三区欧美| 欧美一区二视频| 国产高清无密码一区二区三区| 欧美国产1区2区| 日本福利一区二区| 日韩—二三区免费观看av| 久久一留热品黄| 91麻豆.com| 老司机精品视频在线| 国产欧美一区二区三区网站| 91福利资源站| 黄色日韩三级电影| 亚洲欧美成人一区二区三区| 欧美伦理电影网| 东方欧美亚洲色图在线| 亚洲午夜国产一区99re久久| 精品区一区二区| 日本韩国一区二区三区| 韩国一区二区三区| 一区二区三区四区不卡在线 | 日韩电影在线观看一区| 欧美精品一区二区在线播放| 色综合天天综合在线视频| 日韩av一级电影| 亚洲男人电影天堂| 亚洲国产成人av| 久久综合一区二区| 色综合一区二区| 国产一区高清在线| 洋洋av久久久久久久一区| 26uuu亚洲综合色| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 久久精品噜噜噜成人av农村| 国产精品精品国产色婷婷| 日韩一级大片在线| 不卡的电视剧免费网站有什么| 日韩一区精品字幕| 亚洲欧洲另类国产综合| 欧美电视剧免费观看| 色综合久久六月婷婷中文字幕| 麻豆精品视频在线观看免费| 樱桃国产成人精品视频| 精品成人在线观看| 欧美挠脚心视频网站| 色综合久久中文字幕| 国产成人综合在线观看| 蜜桃视频一区二区三区| 亚洲午夜激情网页| 欧美一卡二卡在线观看| 色综合久久88色综合天天6| 国产**成人网毛片九色 | 喷白浆一区二区| 一区二区三区日韩欧美| 中文字幕在线一区免费| 久久伊99综合婷婷久久伊| 7777精品伊人久久久大香线蕉经典版下载| 处破女av一区二区| 成人午夜免费av| 国产精品亚洲а∨天堂免在线| 蜜臀av一区二区在线观看| 丝袜美腿亚洲色图| 日韩精品91亚洲二区在线观看 | 久久亚洲免费视频| 精品入口麻豆88视频| 日韩免费看的电影| 欧美一卡在线观看| 日韩精品一区二区在线| 日韩一区二区三区电影 | 精品久久久久一区| 日韩女同互慰一区二区| 精品捆绑美女sm三区| 精品国产一区二区三区忘忧草| 日韩一区二区电影在线| 日韩一级片网站| 亚洲国产三级在线| 亚洲国产综合色| 天天亚洲美女在线视频| 首页国产欧美日韩丝袜| 日韩电影一区二区三区| 日本三级亚洲精品| 国产最新精品免费| 国产福利91精品一区二区三区| 国产99久久久国产精品潘金| 9i在线看片成人免费| 91国偷自产一区二区开放时间| 在线观看av一区| 欧美一区二区三区不卡| 久久亚洲综合av| 国产精品久久777777| 亚洲一区二区在线免费观看视频| 亚洲国产精品一区二区www在线| 日韩主播视频在线| 狠狠色丁香久久婷婷综合丁香| 国产精品一区二区在线观看不卡 | 免费成人结看片| 国产精品自拍毛片| 91麻豆国产精品久久| 欧美在线不卡视频| 日韩欧美在线观看一区二区三区| 久久久久久一级片| 亚洲免费观看高清完整版在线| 亚洲v中文字幕| 国产伦精品一区二区三区免费| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 久久综合视频网| 综合电影一区二区三区| 午夜精品123| 国产成人午夜视频| 欧美日韩一区二区在线视频| 精品国产91乱码一区二区三区 | 成人在线综合网站| 欧美日韩国产大片| 日本一区二区三级电影在线观看 | 1024国产精品| 免费观看在线综合| 99久久99久久久精品齐齐| 欧美一级在线免费| 亚洲欧美在线aaa| 久久精品国产亚洲a| 欧美一卡2卡3卡4卡| 国产精品短视频| 韩日欧美一区二区三区| 欧美男男青年gay1069videost | 国内一区二区在线| 欧美日韩三级一区| 国产蜜臀av在线一区二区三区| 天天爽夜夜爽夜夜爽精品视频| 成人性生交大合| 日韩欧美国产不卡| 亚洲一区二区在线免费看| 成人免费视频一区二区| 日韩亚洲欧美在线| 亚洲成人你懂的| 日本乱人伦一区| 亚洲欧洲精品一区二区三区 | 一区二区三区产品免费精品久久75| 精品一区二区在线免费观看| 欧美在线观看视频一区二区三区| 国产精品毛片大码女人| 韩国精品在线观看| 欧美日韩免费一区二区三区视频| 国产精品第一页第二页第三页| 国产麻豆精品一区二区| 91精品国产综合久久福利| 亚洲激情六月丁香| 99re热这里只有精品视频| 中文在线资源观看网站视频免费不卡| 奇米综合一区二区三区精品视频| 欧美性生交片4| 亚洲乱码国产乱码精品精可以看| 东方aⅴ免费观看久久av| 国产午夜亚洲精品羞羞网站| 久久精品国产精品亚洲精品| 777亚洲妇女| 午夜精品在线视频一区| 欧美日韩在线电影| 亚洲第一二三四区| 欧美精品vⅰdeose4hd| 亚洲电影一区二区三区| 欧美体内she精高潮| 亚洲第一电影网| 欧美一区二区三区的| 男人的j进女人的j一区| 日韩欧美二区三区| 国产一区在线视频| 国产日韩精品一区| 成人国产精品免费观看动漫| 中文字幕不卡一区| 欧美精品一区二区三区在线| 麻豆精品视频在线| 亚洲精品在线三区| 不卡视频一二三| 一区二区三区国产| 日韩午夜在线影院| 国产毛片精品一区| 亚洲免费在线视频一区 二区| 色婷婷精品大在线视频| 香蕉影视欧美成人| 日韩一区二区视频在线观看| 国产精品18久久久| 亚洲天堂精品在线观看| 欧美日韩国产系列| 亚洲视频中文字幕| 国产精品一区二区免费不卡 | 91精品国产综合久久久久久久| 天天色 色综合| 久久亚洲精品小早川怜子| jiyouzz国产精品久久| 亚洲成人动漫在线免费观看| 日韩视频在线你懂得| 成人精品视频一区二区三区| 夜夜嗨av一区二区三区网页|