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

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

?? pl0.cpp

?? c++ pl/0簡易編譯器
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#include "pl0.h"
/**************************************************************************
*	PL/0 語言編譯程序,由江漢石油學院計算機系周云才根據清華大學出版社出版,
*	呂映芝,張素琴,蔣維杜編寫的教材《編譯原理》中第二章(PL/0編譯程序的實現)
*	以及附錄A中的代碼改編而成。
*	代碼版權由周云才擁有,使用者必須遵循以下約定:
*	可以免費使用此文件,但必須包含此聲明。
*	可以修改、傳播、打印、出版這里的源代碼。
*	可以在任何軟件工程中使用這里的源代碼。
*	周云才對于由此源代碼的使用而引起的任何問題沒有任何責任。
*	周云才地址:湖北省荊州市江漢石油學院計算機系
*		  郵編:434023
*	      信箱:zyc262@163.net
*		  電話: 0716-8431262
**********************************************************************************************/

string PL0::errStr[]={" ","error 0001:  常數說明中“=”寫成“:=”",
	"error 0002:  常數說明中的“=”后應為數字",
	"error 0003:  常數說明中的標識符后應是“=”",
	"error 0004:  const,var,procedure后應為標識符",
	"error 0005:  漏掉了‘,’或‘;’",
	"error 0006:  過程說明后的符號不正確(應是語句開始符或過程開始符)",
	"error 0007:  應是語句開始符",
	"error 0008:  過程體內語句部分的后跟符不正確",
	"error 0009:  程序皆為丟了句號‘.’",
	"error 0010:  語句之間漏了‘;’",
	"error 0011:  標識符沒說明",
	"error 0012:  賦值語句中,賦值號左部標識符屬性應是變量",
	"error 0013:  賦值語句左部標識符應是賦值號:=",
	"error 0014:  call后應為標識符",
	"error 0015:  call后標識符屬性應為過程",
	"error 0016:  條件語句中丟了then",
	"error 0017:  丟了end或;",
	"error 0018:  while型循環語句中丟了do",
	"error 0019:  語句后的標識符不正確",
	"error 0020:  應為關系運算符",
	"error 0021:  表達式內標識符屬性不能是過程",
	"error 0022:  表達式中漏掉了右括號‘)’",
	"error 0023:  因子后的非法符號",
	"error 0024:  表達式開始符不能是此符號",
	"error 0025:  文件在不該結束的地方結束了",
	"error 0026:  結束符出現在不該結束的地方",
	"error 0027:  ","error 0028:  ","error 0029:  ","error 0030:  ",
	"error 0031:  數越界",
	"error 0032:  read語句括號中標識符不是變量"};

PL0::PL0(char* source,char*destination)
{
	listswitch=true,sourceEnd=false;
	strcpy(word[1],"begin");
	strcpy(word[2],"call");
	strcpy(word[3],"const"); 
	strcpy(word[4],"do");
	strcpy(word[5],"end");
	strcpy(word[6],"if");
	strcpy(word[7],"odd");
	strcpy(word[8],"procedure");
	strcpy(word[9],"read");
	strcpy(word[10],"then");
	strcpy(word[11],"var");
	strcpy(word[12],"while");
	strcpy(word[13],"write");
	wsym[1]= BEGINSYM;   wsym[2]=CALLSYM;
	wsym[3]= CONSTSYM;   wsym[4]=DOSYM;
	wsym[5]=ENDSYM;     wsym[6]=IFSYM;
	wsym[7]=ODDSYM;     wsym[8]=PROCSYM;
	wsym[9]=READSYM;	wsym[10]=THENSYM;
	wsym[11]=VARSYM;    wsym[12]=WHILESYM;
	wsym[13]=WRITESYM;
	memset(code,0,sizeof(code));
	memset(ssym,0,100*sizeof(symbol));
	memset(table,0,sizeof(table));
	memset(line,0,sizeof(line));
	ssym['+']= PLUS;
	ssym['-']= MINUS;
	ssym['*']= TIMES;
	ssym['/']= SLASH;
	ssym['(']= LPAREN;
	ssym[')']= RPAREN;
	ssym['=']= EQL;
	ssym[',']= COMMA;
	ssym['.']= PERIOD;
	ssym['#']= NEQ;
	ssym['<']= LSS;
	ssym['>']= GTR;
	ssym[';']= SEMICOLON;
	strcpy(mnemonic[LIT]," lit ");
	strcpy(mnemonic[OPR]," opr ");
	strcpy(mnemonic[LOD]," lod ");
	strcpy(mnemonic[STO]," sto ");
	strcpy(mnemonic[CAL]," cal ");
	strcpy(mnemonic[INT]," int ");
	strcpy(mnemonic[JMP]," jmp ");
	strcpy(mnemonic[JPC]," jpc ");
	declbegsys.insert(CONSTSYM),declbegsys.insert(VARSYM),declbegsys.insert(PROCSYM);
	statbegsys.insert(BEGINSYM),statbegsys.insert(CALLSYM),statbegsys.insert(IFSYM),statbegsys.insert(WHILESYM);
	facbegsys.insert(IDENT),facbegsys.insert(NUMBER),facbegsys.insert(LPAREN);
	err= 0;
	cc= 0;
	cx= 0;
	ll= 0;
	ch= ' ';
	kk= al;
	codeNo=0;
	fin=fopen(source,"r");
	fout=fopen(destination,"w");
}
void PL0::error(int n)
{
	char s[10];
	sprintf(s,"第 %d 行:",codeNo);
	errorString.push_back(s+errStr[n]);
	err= err+1;//error count
}//error end
void PL0::getch()
{
	if(cc==ll)
	{
		if(feof(fin))
		{
			if(sym!=PERIOD)
				error(25);
			sourceEnd=true;
			return;
		}
		cc= 0;
		fgets(line,lineLength,fin);
		codeNo++;
		ll=strlen(line);
		if(line[ll-1]==10)ll--;
	}
	ch= line[cc];
	cc= cc+1;
}
void PL0::getsym()
{
	if(sourceEnd)
		return;
	int i,j,k;
	while (ch ==' '||ch==9)
		getch();//cls space and tab
	if(isalpha(ch))//id or reserved word
	{
		k=0;
		memset(a,0,al+1);
		do{
			if (k < al)
			{
				a[k]= ch;
				k= k+1;
			}
			getch();
			if(sourceEnd)
				return;
		}while(isalpha(ch)||isdigit(ch));
		if(k >= kk)
			kk= k;
		else
		{
			do{
				a[kk]= ' ';
				kk= kk-1;
			}while(kk > k);
		}
		strcpy(id,a);
		i= 1;
		j= norw;
		do{
			k= (i+j) / 2;
			if(strcmp(id, word[k])<=0)
				j= k-1;
			if(strcmp(id,word[k])>=0)
				i= k+1;
		}while(i<=j);
		if(i-1 > j)
			sym= wsym[k];
		else
			sym= IDENT;
	}
	else if(isdigit(ch))//number
	{
		k= 0;
		num= 0;
		sym= NUMBER;
		do{
			num= 10 * num+ch-'0';
			k= k+1;
			getch();
		}while(isdigit(ch));
		if(k > nmax)
			error(30);
	}
	else if (ch == ':')
	{
		getch();
		if( ch== '=')
		{
			sym= BECOMES;
			getch();
		}
		else
			sym= NUL;
	}
	else if(ch == '<')//extra stuff added to support <=
	{
		getch();
		if (ch== '=')
		{
			sym= LEQ;
			getch();
		}
		else
			sym= LSS;
	}
	else if (ch == '>')
	{
		getch();
		if( ch == '=')
		{
			sym= GEQ;
			getch();
		}
		else
			sym= GTR;
	}
	else//end of extra stuff
	{
		sym= ssym[ch];
		getch();
	}
}

void PL0::gen(fct x,int y,int z)
{
	if (cx > cxmax)
	{
		cout<<"Program too long\n";
		return;
	}
	code[cx].f= x;
	code[cx].l= y;
	code[cx].a= z;
    cx= cx+1;
}//gen end

void PL0::test(symset s1,symset s2,int n)
{
	if(sourceEnd)return;
	if (s1.find(sym)==s1.end())
	{
		error(n);
		symset::iterator it;
		for(it=s2.begin();it!=s2.end();it++)
			s1.insert(*it);//s1=s1+s2
		while (s1.find(sym)==s1.end())
			getsym();
	}
}//test end
void PL0::enter(obj0 k,int &tx,int &dx,int lev)
{
	tx= tx+1;
	strcpy(table[tx].name,id);
	table[tx].kind=k;
	switch(k)
	{
	case CONSTANT:
		if(num>amax)
		{
			error(31);
			num=0;
		}
		table[tx].other.val=num;
		break;
	case VARIABLE:
		table[tx].other.inOther.level=lev;
		table[tx].other.inOther.adr=dx;
		dx++;
		break;
	case PROCEDURE:
		table[tx].other.inOther.level=lev;
		break;
	}
}//enter end

int PL0::position(alfa id,int tx)//find identifier id in table
{
	int i;
	strcpy(table[0].name, id);
	i= tx;
	while (strcmp(table[i].name,id)!=0)i--;
	return i;
}//position end
void PL0::constdeclaration(int&tx,int&dx,int lev)
{
	if(sym = IDENT)
	{
	  getsym();
	  if(sym>=EQL&&sym<=BECOMES)
	  {
		if( sym ==BECOMES)
			  error(1);
		getsym();
		if( sym == NUMBER)
		{
			enter(CONSTANT,tx,dx,lev);
			getsym();
		}
		else
		  error(2);
	  }
	  else
		error(3);
	}
	else
	  error(4);
}// constdeclaration end

void PL0::vardeclaration(int&tx,int&dx,int lev)
{
	if( sym == IDENT)
	{
		enter(VARIABLE,tx,dx,lev);
		getsym();
	}
	else
		error(4);
}//vardeclaration end

void PL0::listcode(int cx0)//list code generated for this block
{
	int i;
	if(listswitch)
		for (i= cx0;i<cx;i++)
		   cout<<" "<<i<<"  "<<mnemonic[code[i].f]
			<<"  "<<code[i].l<<"  "<<code[i].a<<endl;
}// listcode end
void PL0:: factor(symset fsys,int tx,int lev)
{
	int i;
	test(facbegsys,fsys,24);
	while(facbegsys.find(sym)!=facbegsys.end())
	{
		if( sym ==IDENT)
		{
			i= position(id,tx);
			if( i == 0)
				error(11);
			else
				switch(table[i].kind)
			{
			 case CONSTANT:
				 gen(LIT,0,table[i].other.val);
				 break;
			 case VARIABLE:
				 gen(LOD,lev-table[i].other.inOther.level,table[i].other.inOther.adr);
				 break;
			 case PROCEDURE:
				 error(21);
				 break;
			}
			getsym();
		}
		else  if (sym ==NUMBER)
		{
			if (num>amax)
			{
				error(31);
				num= 0;
			}
			gen(LIT,0,num);
			getsym();
		}
		else if( sym ==LPAREN)
		{
			getsym();
			symset tmp=fsys;
			tmp.insert(RPAREN);
			expression(tmp,tx,lev);
			if (sym == RPAREN)
				getsym();
			else
				error(22);
		}
		test(fsys,facbegsys,23);
	}
}//factor end
void PL0::term(symset fsys,int tx,int lev)
{
	if(sourceEnd)
		return;
	symbol  mulop;
	symset tmp=fsys;
	for(int t=TIMES;t<=SLASH;t++)
		tmp.insert((symbol)t);
	factor(tmp,tx,lev);
	while( sym>=TIMES && sym<=SLASH)
	{
		mulop= sym;
		getsym();
		factor(tmp,tx,lev);
		if (mulop ==TIMES)
			gen(OPR,0,4);
		else
			gen(OPR,0,5);
	}
}// term end
void PL0::expression(symset fsys,int tx,int lev)
{
	symbol addop;
	symset tmp=fsys;
	for(int t=PLUS;t<=MINUS;t++)
		tmp.insert((symbol)t);
	if( sym>=PLUS&&sym<=MINUS)
	{
		addop= sym;
		getsym();
		term(tmp,tx,lev);
		if( addop ==MINUS)
			gen(OPR,0,1);
	}
	else
		term(tmp,tx,lev);
	while (sym >=PLUS&&sym<=MINUS)
	{
		addop= sym;
		getsym();
		term(tmp,tx,lev);
		if (addop ==PLUS)
			gen(OPR,0,2);
		else
			gen(OPR,0,3);
	}
}// expression end
void PL0::condition(symset fsys,int tx,int lev)
{
	symbol relop;
	symset tmp=fsys;
	tmp.insert(EQL),tmp.insert(NEQ),tmp.insert(LSS),tmp.insert(LEQ),tmp.insert(GTR),tmp.insert(GEQ);
    if( sym ==ODDSYM)
	{
		getsym();
		expression(fsys,tx,lev);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美电影院| 久久一区二区视频| 国产成人免费网站| 久久久天堂av| 成人网在线免费视频| 亚洲人一二三区| 制服丝袜亚洲精品中文字幕| 久久不见久久见免费视频7| 久久久精品日韩欧美| 成人免费高清在线观看| 亚洲综合久久久久| 91精品国产综合久久国产大片| 精品在线播放免费| 国产精品久久精品日日| 欧美色倩网站大全免费| 久久国产福利国产秒拍| 中文欧美字幕免费| 精品视频在线免费| 国产一区二区福利| 一区二区国产视频| 欧美精品一区二区三| 99re6这里只有精品视频在线观看| 亚洲曰韩产成在线| 26uuu亚洲综合色| 91久久国产综合久久| 捆绑紧缚一区二区三区视频| 国产精品欧美极品| 91精品国产欧美一区二区| 成人黄色电影在线| 肉肉av福利一精品导航| 亚洲国产成人在线| 3751色影院一区二区三区| 成人网页在线观看| 蜜桃视频在线观看一区| 1000部国产精品成人观看| 亚洲男同性视频| 精品乱人伦小说| 在线观看日韩毛片| 国产成人免费xxxxxxxx| 日韩中文字幕麻豆| 亚洲天堂a在线| xfplay精品久久| 欧美精品久久久久久久久老牛影院| 国产精品123| 日本在线不卡视频| 亚洲综合男人的天堂| 国产精品伦一区| 亚洲精品在线一区二区| 欧美日韩精品综合在线| 不卡的看片网站| 国产精品亚洲第一区在线暖暖韩国| 婷婷久久综合九色国产成人 | 亚洲欧美一区二区在线观看| 欧美一级搡bbbb搡bbbb| 91成人国产精品| 成人va在线观看| 国产精品一二二区| 久久精品国产成人一区二区三区 | 色婷婷精品大视频在线蜜桃视频| 精品夜夜嗨av一区二区三区| 天天综合网 天天综合色| 日韩码欧中文字| 国产精品视频九色porn| 久久精品视频免费观看| 精品毛片乱码1区2区3区| 日韩一卡二卡三卡国产欧美| 欧美日韩国产123区| 欧美日韩另类国产亚洲欧美一级| 91在线一区二区| fc2成人免费人成在线观看播放| 国产精品1024| 国产成人高清视频| 国产精品99久久久久久有的能看| 国产美女在线观看一区| 久久99精品国产.久久久久 | 美女被吸乳得到大胸91| 青青国产91久久久久久 | 91精品国产全国免费观看 | 日本中文字幕一区二区视频 | 日韩国产精品久久| 蜜臀av在线播放一区二区三区| 奇米影视在线99精品| 免费欧美日韩国产三级电影| 裸体健美xxxx欧美裸体表演| 美女网站色91| 国产精品一区专区| av亚洲精华国产精华| 一本色道综合亚洲| 欧美日韩电影一区| 亚洲欧美一区二区不卡| 欧美日韩www| 欧美一区二区三区系列电影| 制服丝袜激情欧洲亚洲| 精品国产污网站| 国产日产亚洲精品系列| 最近日韩中文字幕| 婷婷国产在线综合| 国内精品久久久久影院色| 国产凹凸在线观看一区二区| 91美女精品福利| 欧美一区二区视频观看视频| 欧美精品一区二| 亚洲天堂2014| 日本不卡的三区四区五区| 韩日av一区二区| 91亚洲国产成人精品一区二三| 欧美日韩电影在线| 久久精品一区二区| 亚洲在线视频一区| 久久成人免费网| 91片黄在线观看| 日韩一区和二区| 日韩码欧中文字| 麻豆国产91在线播放| av影院午夜一区| 91麻豆精品国产91久久久| 欧美国产综合一区二区| 丝袜亚洲精品中文字幕一区| 国产成人av一区二区| 欧美日韩精品福利| 国产精品欧美一级免费| 在线视频国内自拍亚洲视频| 日韩欧美一卡二卡| 最新欧美精品一区二区三区| 麻豆成人久久精品二区三区小说| 99久久精品情趣| 日韩欧美亚洲国产精品字幕久久久 | 久久综合久久综合九色| 一级中文字幕一区二区| 国产一区二区不卡| 欧美一区二区三区公司| 亚洲欧美日韩国产中文在线| 韩国欧美一区二区| 欧美一区中文字幕| 亚洲激情成人在线| 国产成人99久久亚洲综合精品| 欧美精品aⅴ在线视频| 亚洲欧美日韩小说| 国产精品99久| 欧美精品一区男女天堂| 三级亚洲高清视频| 日本韩国精品在线| 综合久久综合久久| 成人国产在线观看| 国产午夜精品一区二区三区嫩草 | 免费在线一区观看| 欧美性色欧美a在线播放| 中文字幕免费不卡在线| 国产原创一区二区三区| 欧美一级黄色片| 日韩精品亚洲专区| 欧美老年两性高潮| 亚洲第一成人在线| 色94色欧美sute亚洲线路一ni| 亚洲国产成人私人影院tom| 国内精品视频666| 天天综合网天天综合色| 欧美在线不卡一区| 一区二区三区鲁丝不卡| 97精品国产97久久久久久久久久久久| 久久蜜桃av一区二区天堂| 久久国产综合精品| 精品欧美久久久| 激情综合色综合久久综合| 欧美一级高清片| 久久aⅴ国产欧美74aaa| 欧美大片免费久久精品三p| 看电视剧不卡顿的网站| 欧美大片一区二区| 激情图区综合网| 国产欧美一区二区在线| 国产河南妇女毛片精品久久久 | 91.com在线观看| 日韩精品电影在线| 欧美一二区视频| 国产美女一区二区| 欧美国产1区2区| caoporn国产精品| 亚洲欧美国产77777| 欧美日本一道本在线视频| 免费成人美女在线观看| 亚洲精品一线二线三线无人区| 激情综合网最新| 国产精品美女久久久久久久久| caoporm超碰国产精品| 亚洲一区二区三区视频在线 | 精品美女一区二区| 国产精品91xxx| 1区2区3区精品视频| 欧美探花视频资源| 美国十次了思思久久精品导航| www久久精品| 色综合天天综合| 日韩精品一卡二卡三卡四卡无卡| www国产成人| 色婷婷国产精品| 久久成人免费网| 亚洲图片欧美激情| 日韩一区二区免费视频| 成人丝袜18视频在线观看|