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

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

?? plxcompiler.cpp

?? pl/x的編譯器
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
/************************************************
 *                                              *
 * Purpose    :the body of the PLX Compiler     *
 * Created by :tinysun                          *
 *                                              *
 ************************************************/

#include "PLXCompiler.h"


/***********************************************
 * ------------ Key words of PLX --------------*
 ***********************************************/
string word[]=
{
	"          ",
	"and       ",
	"begin     ",
	"call      ",
	"do        ",
	"else      ",
	"end       ",
	"false     ",
	"for       ",
	"from      ",
	"if        ",
	"integer   ",
	"logical   ",
	"not       ",
	"or        ",
	"procedure ",
	"program   ",
	"read      ",
	"repeat    ",
	"then      ",
	"to        ",
	"true      ",
	"until     ",
	"while     ",
	"write     "	
};

int wsym[]=
{
	0,
	ANDSYM,BEGINSYM,CALLSYM,DOSYM,ELSESYM,ENDSYM,
	FALSESYM,FORSYM,FROMSYM,IFSYM,INTESYM,LOGISYM,
	NOTSYM,ORSYM,PROSYM,PROGSYM,READSYM,REPEATSYM,
	THENSYM,TOSYM,TRUESYM,UNTILSYM,WHILESYM,WRITESYM
};

int ssym[127];

PLXCompiler::PLXCompiler()
{
	
}

PLXCompiler::PLXCompiler(char* pSource)
{
	Init();
	this->m_pfSource=fopen(pSource,"r");
	if(m_pfSource==NULL)
	{
		exit(0);
	}
}

PLXCompiler::~PLXCompiler()
{
	if(this->m_pfSource)
	{
		fclose(this->m_pfSource);
	}
}

void PLXCompiler::Init()
{
	m_ch=' ';
	memset(m_id,'\0',sizeof(m_id));
	memset(m_line,'\0',sizeof(m_line));
	memset(ssym,NUL,sizeof(ssym));
	m_sym=NUL;
	m_cc=0;
	m_ln=0;
	m_ll=0;
	m_err=0;
	m_cx=0;
	m_tx=0;
	m_isEnd=false;

	ssym['+']=PLUS;
	ssym['-']=MINUS;
	ssym['*']=TIMES;
	ssym['/']=SLASH;
	ssym['(']=LPAREN;
	ssym[')']=RPAREN;
	ssym['=']=EQL;
	ssym[',']=COMMA;
	ssym[';']=SEMICOLON;
	ssym['.']=PERIOD;
	ssym['<']=LSS;
	ssym['>']=GTR;

	m_firsts.insert(IDENT);
	m_firsts.insert(IFSYM);
	m_firsts.insert(WHILESYM);
	m_firsts.insert(REPEATSYM);
	m_firsts.insert(WRITESYM);
	m_firsts.insert(READSYM);
	m_firsts.insert(FORSYM);
	m_firsts.insert(CALLSYM);

	m_follows.insert(SEMICOLON);
	m_follows.insert(ENDSYM);
	m_follows.insert(ELSESYM);
	m_follows.insert(UNTILSYM);

	m_followss.insert(ENDSYM);
	m_followss.insert(ELSESYM);
	m_followss.insert(UNTILSYM);

	m_followae.clear();
	m_followae=m_follows;
	m_followae.insert(RPAREN);
	m_followae.insert(DOSYM);
	m_followae.insert(THENSYM);
	m_followae.insert(ANDSYM);
	m_followae.insert(ORSYM);

	m_followbe.insert(RPAREN);
    m_followbe.insert(THENSYM);
	m_followbe.insert(DOSYM);

    m_firstaf.insert(IDENT);
	m_firstaf.insert(NUMBER);
	m_firstaf.insert(LPAREN);

	m_firstbf.insert(IDENT);
	m_firstbf.insert(TRUESYM);
	m_firstbf.insert(FALSESYM);
	m_firstbf.insert(NOTSYM);
	m_firstbf.insert(LPAREN);
	m_firstbf.insert(NUMBER);
}
//判斷一個字符是否為制表字符
bool PLXCompiler::isTable(char ch)
{
	return (' '==ch || '\t'==ch);
}
//
void PLXCompiler::removeNote(char *pstr,int len)
{
	int i=0;
	for(;i<len;i++)
	{
		if(pstr[i]=='/')
		{
			if((i+1)<len && pstr[i+1]=='/') //開始過濾注釋
			{
				pstr[i]=' ';
				pstr[i+1]='\0';
				break;
			}
		}
	}
}
//只支持單行注釋 (//.....)
void PLXCompiler::getCh()
{
	if(this->m_cc==this->m_ll)
	{
		memset(m_line,'\0',lineLength);
		if(feof(this->m_pfSource))  //文件結束
		{
			if(this->m_sym!=PERIOD)
			{
				//fprintf(this->m_pfError,"%s\n","--Program incomplete--");
				error(0);
			}
			m_isEnd=true;
			return;
		}

		m_cc=0;
		fgets(this->m_line,lineLength-1,this->m_pfSource); //讀取一行

		//去除注釋
        removeNote(this->m_line,strlen(m_line));

		m_ll=strlen(this->m_line);

		this->m_ln++;//行數(shù)加1
		if(m_line[m_ll-1]==10)//過濾掉 '\r'
		{
			//ll--;
			m_line[m_ll-1]=' ';
		}
	}
	m_ch= m_line[m_cc];
	m_cc= m_cc+1;
}

//獲取一個token
void PLXCompiler::getSym()
{
	int k=0;
	int i=0,j;
	memset(m_id,'\0',sizeof(m_id));

	if(m_isEnd) //源文件已讀到結束
		return;
	//獲取一個token的第一個字母
	while(isTable(m_ch) && !m_isEnd)
		getCh();
	
	//讀到的第一個字符是26個英文字符,則進入標識符或關鍵字處理
	if(isalpha(m_ch))
	{
		while(k<al-1 && (isalpha(m_ch) || isdigit(m_ch)))
		{
			m_id[k++]=m_ch;

			if(m_isEnd)
				break;

			getCh();
		}

		for(i=k;i<al-1;i++)
		{
			m_id[i]=' ';
		}

		//利用二分查找來查詢關鍵字
		i=1;
		j=norw;
		while(j>=i)
		{
			k=(i+j)/2;

			if(strcmp(m_id,word[k].c_str())>0)
				i=k+1;
			else if(strcmp(m_id,word[k].c_str())<0)
				j=k-1;
			else 
				break;
		}

		//未找到,說明id 不是關鍵字, 而是標識符
		if(i-1>=j)
		{
			m_sym=IDENT;
		}
		else
		{
			m_sym=(symbol)wsym[k];
		}

		//把解析到的一個token寫入result文件
		//fprintf(this->m_pfResult,"(%d,%d)%s\n",this->m_ln,this->m_cc-1,m_id);
	}
	//讀到的第一個字符是數(shù)字,則進入常數(shù)處理
	else if(isdigit(m_ch))
	{
		k=0;
		m_num=0;
		m_sym=NUMBER;
		while(k<=nmax && isdigit(m_ch))
		{
			m_num=m_num*10+(m_ch-'0');
			k++;

			if(m_isEnd)
				break;
			getCh();
		}
		if(k>nmax)
		{
			error(0);
			//fprintf(this->m_pfError,"%s","常數(shù)太大~");
		}

		//把解析到的數(shù)字寫入result文件
		//fprintf(this->m_pfResult,"(%d,%d)%d\n",this->m_ln,this->m_cc-k,m_num);
	}
	//以下處理雙字符組成的token,如::=、>=、<=、/=
	else if(':'==m_ch)
	{
		if(m_isEnd)
		{
			m_sym=NUL; //非法token

			//fprintf(this->m_pfResult,"(%d,%d)%c\n",this->m_ln,this->m_cc-1,m_ch);
		}
		else
		{
			getCh();
			if('='==m_ch)//處理賦值符號":="
			{
				m_sym=BECOMES;
				getCh();

				//fprintf(this->m_pfResult,"(%d,%d)%s\n",this->m_ln,this->m_cc-2,":=");
			}
			else
			{
				m_sym=NUL;//非法token

				//fprintf(this->m_pfResult,"(%d,%d)%c\n",this->m_ln,this->m_cc-2,":");
			}
		}
	}
	else if('>'==m_ch)
	{
		if(m_isEnd)
		{
			m_sym=GTR;

			//fprintf(this->m_pfResult,"(%d,%d)%c\n",this->m_ln,this->m_cc-1,m_ch);
		}
		else
		{
			getCh();
			if('='==m_ch)//">="
			{
				m_sym=GEQ;
				getCh();

				//fprintf(this->m_pfResult,"(%d,%d)%s\n",this->m_ln,this->m_cc-2,">=");
			}
			else
			{
				m_sym=GTR;

				//fprintf(this->m_pfResult,"(%d,%d)%c\n",this->m_ln,this->m_cc-2,'>');
			}
		}
	}
	else if('<'==m_ch)
	{
		if(m_isEnd)
		{
			m_sym=LSS;

			//fprintf(this->m_pfResult,"(%d,%d)%c\n",this->m_ln,this->m_cc-1,m_ch);
		}
		else
		{
			getCh();
			if('='==m_ch)//"<="
			{
				m_sym=LEQ;
				getCh();
				
				//fprintf(this->m_pfResult,"(%d,%d)%s\n",this->m_ln,this->m_cc-2,"<=");
			}
			else
			{
				m_sym=LSS;
				
				//fprintf(this->m_pfResult,"(%d,%d)%c\n",this->m_ln,this->m_cc-2,'<');
			}
		}
	}
	else if('/'==m_ch)
	{
		if(m_isEnd)
		{
			m_sym=SLASH;
			
			//fprintf(this->m_pfResult,"(%d,%d)%c\n",this->m_ln,this->m_cc-1,m_ch);
		}
		else
		{
			getCh();
			if('='==m_ch)//"/="
			{
				m_sym=NEQ;
				getCh();
				
				//fprintf(this->m_pfResult,"(%d,%d)%s\n",this->m_ln,this->m_cc-2,"/=");
			}
			else
			{
				m_sym=SLASH;
				
				//fprintf(this->m_pfResult,"(%d,%d)%c\n",this->m_ln,this->m_cc-2,'/');
			}
		}
	}
	else //處理單個字符
	{
		m_sym=(symbol)ssym[m_ch];
		//fprintf(this->m_pfResult,"(%d,%d)%c\n",this->m_ln,this->m_cc-1,m_ch);

		getCh();
	}
}

//出錯處理~
void PLXCompiler::error(int errorNum)
{
	this->m_err++;
	string errorInfo;
	if(this->m_err>maxerr)
	{
		printf("%s\n","----Too many errors------");
		exit(0);
	}
	switch (errorNum)
	{
	case 0:
		errorInfo="程序需以'.'結束";
		break;
	case 1:
		errorInfo="用了未定義的變量";
		break;
	case 2:
		errorInfo="算術因子里出現(xiàn)非整型變量";
		break;
	case 3:
		errorInfo="丟失')'";
		break;
	case 4:
		errorInfo="算術表示不能以此符號開始";
		break;
	case 5:
		errorInfo="邏輯表達式里出現(xiàn)函數(shù)名";
		break;
	case 6:
		errorInfo="邏輯表達式不能以此符號開始";
		break;
	case 7:
		errorInfo="非法的變量名";
		break;
	case 8:
		errorInfo="丟失')'";
		break;
	case 9:
		errorInfo="非法的參數(shù)名";
		break;
	case 10:
		errorInfo="丟失begin關鍵字";
		break;
	case 11:
		errorInfo="丟失end關鍵字";
		break;
	case 12:
		errorInfo="開始符號不是program";
		break;
	case 13:
		errorInfo="此處應為整型變量";
		break;
	case 14:
		errorInfo="關系表達式不能以此符號開始";
		break;
	case 15:
		errorInfo="此處應為一個比較符號";
		break;
	case 16:
		errorInfo="丟失';'";
		break;
	case 17:
		errorInfo="語句后出現(xiàn)非法字符";
		break;
	case 18:
		errorInfo="變量定義后出現(xiàn)非法字符";
		break;
	case 19:
		errorInfo="丟失','";
		break;
	case 20:
		errorInfo="變量定義不能以此符號開始";
		break;
	case 21:
		errorInfo="變量定義后出現(xiàn)非法字符";
		break;
	case 22:
		errorInfo="此處應為\":=\"";
		break;
	case 23:
		errorInfo="此處不能為函數(shù)名";
		break;
	case 24:
		errorInfo="缺了then";
		break;
	case 25:
		errorInfo="缺了from";
		break;
	case 26:
		errorInfo="缺了do";
		break;
	case 27:
		errorInfo="缺了until";
		break;
	case 28:
		errorInfo="缺了to";
		break;
	case 29:
		errorInfo="此處應為函數(shù)名";
		break;
	case 30:
		errorInfo="語句不能以此符號開始";
		break;
	case 31:
		errorInfo="語句后不能跟此符號";
		break;
	case 32:
		errorInfo="算術表達式不能以此符號開始";
		break;
	case 33:
		errorInfo="丟失'('";
		break;
	case 34:
		errorInfo="邏輯表達式后出現(xiàn)非法字符";
		break;
	case 35:
		errorInfo="函數(shù)定義后出現(xiàn)非法字符";
		break;
	case 36:
		errorInfo="多余的';'";
		break;
	case 37:
		errorInfo="這里等待一個'*'或'/'";
		break;
	case 38:
		errorInfo="這里等待一個'+'或'-'";
		break;
	case 39:
		errorInfo="參數(shù)個數(shù)不符";
		break;
	case 40:
		errorInfo="函數(shù)定義需以procedure開始";
		break;
	case 41:
		errorInfo="函數(shù)定義后出現(xiàn)非法字符";
		break;
	case 42:
		errorInfo="外層不能訪問內層的變量或調用內層函數(shù)";
		break;
	case 43:
		errorInfo="除數(shù)為0";
		break;
	}
	printf("%d:%s--%s(line:%d,column:%d)\n",errorNum,this->m_id,errorInfo.c_str(),this->m_ln,this->m_cc-1);
	//exit(0);
}

//
void PLXCompiler::test(symset s1,symset s2,int errorNum)
{
	symset s;
	s.clear();
	if(s1.find(m_sym)==s1.end()) //m_sym不在s1中
	{
		error(errorNum);
		set_union(s1.begin(),s1.end(),s2.begin(),s2.end(),insert_iterator<symset>(s,s.begin()));

		while(!this->m_isEnd && s.find(m_sym)==s.end())
			getSym();
	}
}

//enter a function item into table
void PLXCompiler::enter(objectt k,int lev)
{
	item _item;
	memset(&_item,'\0',sizeof(_item));
	_item.kind=k;
	if(_item.kind==pident)
	{
		_item.num=0;
	}
	_item.level=lev;
	strcpy(_item.name,m_id);
	m_tx++;
	m_table.push_back(_item);
}
//
void PLXCompiler::enter(objectt k,int &dx,int lev)
{
	item _item;
	memset(&_item,'\0',sizeof(_item));
	_item.kind=k;
	if(_item.kind==bident ||_item.kind==aident)//變量
	{
		_item.adr=dx;
		dx++;
	}
	_item.level=lev;
	strcpy(_item.name,m_id);
	m_tx++;
	m_table.push_back(_item);
}

//
vector<item>::iterator PLXCompiler::position(alfa name)
{
	int i=0;
	vector<item>::iterator iter=m_table.end()-1;
	
	
	for(; i<m_table.size(); iter--,i++) 
		
	{
		if(strcmp(name,iter->name)==0)
			break;
	}
	return (i==m_table.size() ? NULL :iter);
}


// 處理re非終結符
void PLXCompiler::RelationExpression(int level,symset fsys)
{
	symset tmp;
	symbol op;
	tmp.insert(IDENT);
	tmp.insert(NUMBER);
	test(tmp,fsys,14);
	if(m_sym==IDENT || m_sym==NUMBER)
	{
		if(m_sym==IDENT) //檢查變量需為整型
		{
			//查找符號表
			vector<item>::iterator iter=this->position(m_id);
			if(NULL==iter)
			{
				error(1); //變量為定義
			}
			else
			{
				if(iter->kind!=aident)
				{
					error(13);//此處變量需為整型
				}
				else
				{
					gen(LOD,level-iter->level,iter->adr);
				}
			}
			getSym();
		}
		else
		{
			gen(LIT,0,this->m_num);
			getSym();
		}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99国产精品国产精品久久| 亚洲国产精品久久艾草纯爱| 一区二区三区四区视频精品免费| 日韩中文字幕区一区有砖一区 | 成年人午夜久久久| 欧美日韩成人综合天天影院| 久久久久久久电影| 亚洲成在线观看| 国产精品一卡二卡| 欧美日韩大陆一区二区| 国产精品久久久久久亚洲伦| 蜜桃一区二区三区在线| 99久久精品久久久久久清纯| 精品久久人人做人人爱| 亚洲综合色视频| 亚洲电影一级黄| 国产成人av一区二区| 日韩一区二区三区观看| 亚洲成精国产精品女| 色综合久久中文综合久久97| 亚洲国产精品二十页| 老司机精品视频线观看86| 666欧美在线视频| 亚洲自拍另类综合| 色综合久久99| 中文字幕五月欧美| 成人美女视频在线观看| 久久久久97国产精华液好用吗| 蜜桃精品视频在线观看| 日韩一级大片在线| 午夜精品福利在线| 欧美日韩国产经典色站一区二区三区| 亚洲色图制服丝袜| 波多野洁衣一区| 中文字幕一区二区在线播放| 成人在线视频首页| 国产日韩精品一区二区浪潮av| 国产一区二区在线影院| 日韩免费高清电影| 久久精品国产色蜜蜜麻豆| 欧美一级久久久| 精品一区二区三区的国产在线播放| 91精品国产乱码| 久久成人精品无人区| 精品福利av导航| 国产一区亚洲一区| 久久精品人人做人人爽97| 国产精品1区2区| 国产精品污网站| 91浏览器打开| 亚洲一区二区欧美日韩| 欧美三级韩国三级日本三斤| 偷拍一区二区三区四区| 日韩午夜在线播放| 蜜臀av在线播放一区二区三区 | 成人免费看的视频| 国产精品久久精品日日| 一本大道久久a久久综合| 一区二区三区丝袜| 欧美精品xxxxbbbb| 久久成人免费日本黄色| 日本一区二区三级电影在线观看 | 美日韩一区二区三区| 欧美tickle裸体挠脚心vk| 国产精品一品二品| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 91美女精品福利| 肉色丝袜一区二区| 久久这里只有精品首页| 国产电影精品久久禁18| 中文字幕一区av| 欧美日韩视频第一区| 免费人成精品欧美精品| 久久精品网站免费观看| 99久久久国产精品免费蜜臀| 亚洲va欧美va天堂v国产综合| 91精品国产综合久久小美女| 国产精品自产自拍| 亚洲美女偷拍久久| 日韩午夜av一区| 成人小视频免费在线观看| 一区二区三区四区蜜桃| 日韩午夜电影av| av在线不卡免费看| 午夜电影一区二区三区| 久久久无码精品亚洲日韩按摩| 91在线观看下载| 青青青爽久久午夜综合久久午夜| 国产日产亚洲精品系列| 欧美伊人久久大香线蕉综合69| 久久国产生活片100| 中文字幕一区二区视频| 日韩一级二级三级精品视频| k8久久久一区二区三区| 午夜精品久久久久久久久久久 | 2020国产成人综合网| 97精品国产露脸对白| 蜜桃视频一区二区| 综合av第一页| 日韩欧美自拍偷拍| 99国产精品国产精品毛片| 麻豆国产精品一区二区三区| 成人免费视频在线观看| 欧美一级淫片007| 色综合天天综合狠狠| 国产在线播放一区二区三区| 亚洲一级二级三级| 欧美国产欧美综合| 日韩欧美中文字幕一区| 91啦中文在线观看| 国产精品一区二区男女羞羞无遮挡| 亚洲愉拍自拍另类高清精品| 国产精品入口麻豆九色| 欧美一级欧美一级在线播放| 色婷婷亚洲精品| 国产不卡一区视频| 久热成人在线视频| 亚洲国产精品尤物yw在线观看| 欧美激情一区二区三区四区| 日韩网站在线看片你懂的| 欧美视频中文字幕| 不卡的电影网站| 国产乱码字幕精品高清av| 天堂成人国产精品一区| 亚洲欧美激情小说另类| 欧美激情一区二区三区在线| 精品理论电影在线| 欧美剧情片在线观看| 色欧美片视频在线观看| 成人免费毛片嘿嘿连载视频| 国产一区视频导航| 另类调教123区| 日韩不卡免费视频| 亚洲成人久久影院| 一区二区欧美国产| 亚洲人妖av一区二区| 国产欧美日韩在线| 久久久www免费人成精品| 日韩亚洲欧美在线观看| 欧美精品1区2区3区| 欧美午夜精品一区| 色八戒一区二区三区| 99久久免费国产| 成人动漫一区二区三区| 国产不卡视频一区| 国产成人丝袜美腿| 国产美女精品人人做人人爽| 久久99国产精品久久99果冻传媒| 日本不卡一区二区三区高清视频| 亚洲国产精品久久不卡毛片| 亚洲国产综合在线| 亚洲一区二区三区在线播放| 亚洲精品国产a| 一区二区三区产品免费精品久久75| 1000精品久久久久久久久| 国产精品对白交换视频| 国产精品超碰97尤物18| 国产精品久久久久久久久免费桃花| 国产精品三级视频| 亚洲欧美自拍偷拍色图| 国产精品成人免费在线| 亚洲欧洲一区二区三区| 亚洲精品中文字幕在线观看| 亚洲一区在线看| 亚洲福利视频三区| 石原莉奈在线亚洲二区| 蜜桃视频一区二区三区| 国产一区二区三区av电影| 国产a区久久久| 99视频精品免费视频| 色哟哟日韩精品| 欧美日韩精品一区视频| 欧美一区二区三区啪啪| 久久一留热品黄| 国产精品无人区| 一区二区三区四区高清精品免费观看 | 欧美一级高清大全免费观看| 欧美一区二区三区思思人| 精品日韩在线观看| 中文字幕乱码久久午夜不卡 | 欧美岛国在线观看| 久久亚洲精华国产精华液| 国产欧美日韩三区| 亚洲欧美欧美一区二区三区| 图片区小说区区亚洲影院| 久久国产精品99久久人人澡| 国产aⅴ精品一区二区三区色成熟| 不卡电影一区二区三区| 欧美视频中文字幕| 欧美tk丨vk视频| 一区视频在线播放| 亚洲国产日韩综合久久精品| 麻豆国产一区二区| www.激情成人| 69堂精品视频| 国产精品午夜在线观看| 亚洲国产成人高清精品| 国产在线观看一区二区| 色综合咪咪久久| 日韩三级伦理片妻子的秘密按摩|