亚洲欧美第一页_禁久久精品乱码_粉嫩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++;//行數加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);
	}
	//讀到的第一個字符是數字,則進入常數處理
	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","常數太大~");
		}

		//把解析到的數字寫入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="算術因子里出現非整型變量";
		break;
	case 3:
		errorInfo="丟失')'";
		break;
	case 4:
		errorInfo="算術表示不能以此符號開始";
		break;
	case 5:
		errorInfo="邏輯表達式里出現函數名";
		break;
	case 6:
		errorInfo="邏輯表達式不能以此符號開始";
		break;
	case 7:
		errorInfo="非法的變量名";
		break;
	case 8:
		errorInfo="丟失')'";
		break;
	case 9:
		errorInfo="非法的參數名";
		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="語句后出現非法字符";
		break;
	case 18:
		errorInfo="變量定義后出現非法字符";
		break;
	case 19:
		errorInfo="丟失','";
		break;
	case 20:
		errorInfo="變量定義不能以此符號開始";
		break;
	case 21:
		errorInfo="變量定義后出現非法字符";
		break;
	case 22:
		errorInfo="此處應為\":=\"";
		break;
	case 23:
		errorInfo="此處不能為函數名";
		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="此處應為函數名";
		break;
	case 30:
		errorInfo="語句不能以此符號開始";
		break;
	case 31:
		errorInfo="語句后不能跟此符號";
		break;
	case 32:
		errorInfo="算術表達式不能以此符號開始";
		break;
	case 33:
		errorInfo="丟失'('";
		break;
	case 34:
		errorInfo="邏輯表達式后出現非法字符";
		break;
	case 35:
		errorInfo="函數定義后出現非法字符";
		break;
	case 36:
		errorInfo="多余的';'";
		break;
	case 37:
		errorInfo="這里等待一個'*'或'/'";
		break;
	case 38:
		errorInfo="這里等待一個'+'或'-'";
		break;
	case 39:
		errorInfo="參數個數不符";
		break;
	case 40:
		errorInfo="函數定義需以procedure開始";
		break;
	case 41:
		errorInfo="函數定義后出現非法字符";
		break;
	case 42:
		errorInfo="外層不能訪問內層的變量或調用內層函數";
		break;
	case 43:
		errorInfo="除數為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一区二区三区免费野_久草精品视频
国产精品久久久久婷婷| 色嗨嗨av一区二区三区| 精品国产一区二区三区不卡 | 欧美激情自拍偷拍| 成人一区二区三区视频| 欧美极品xxx| 97成人超碰视| 亚洲chinese男男1069| 91精品欧美福利在线观看| 蜜臀av性久久久久蜜臀aⅴ| 日韩午夜激情av| 国产成人av影院| 亚洲另类在线视频| 91精品国产aⅴ一区二区| 久久97超碰国产精品超碰| 国产精品免费视频一区| 日韩女优电影在线观看| 国产成人综合亚洲91猫咪| 亚洲欧美日韩在线| 欧美va日韩va| 色呦呦一区二区三区| 免费看黄色91| 一区二区成人在线| 欧美精品一区二区三区蜜桃视频| 91在线视频18| 久久电影网站中文字幕 | 制服丝袜亚洲网站| 成人av第一页| 久久99久久99精品免视看婷婷| 日本一二三不卡| 日韩午夜精品视频| 欧美少妇性性性| 91片在线免费观看| 大美女一区二区三区| 毛片av一区二区| 蜜桃在线一区二区三区| 午夜视频在线观看一区| 亚洲私人黄色宅男| 国产精品久久毛片| 国产日韩欧美亚洲| 亚洲精品一区二区三区精华液 | 色综合夜色一区| 99久久婷婷国产综合精品电影| 在线不卡一区二区| 欧美日韩一区 二区 三区 久久精品| 欧美日韩大陆一区二区| 国产精品久久久久久久浪潮网站| 欧美视频在线不卡| 一本一道波多野结衣一区二区| 国产suv精品一区二区三区| 免费视频最近日韩| 久久成人av少妇免费| 香蕉乱码成人久久天堂爱免费| 亚洲视频网在线直播| 久久综合一区二区| 国产欧美日本一区视频| 久久久欧美精品sm网站 | 成人永久免费视频| eeuss影院一区二区三区| 国产91精品露脸国语对白| 久久激情五月激情| 国产福利一区二区三区视频在线 | 91久久精品一区二区三| 91成人免费网站| 欧美日韩日日骚| 欧美tickling网站挠脚心| 中文字幕乱码亚洲精品一区| 亚洲素人一区二区| 日韩av在线免费观看不卡| 久久69国产一区二区蜜臀| 9人人澡人人爽人人精品| 欧美日韩中文字幕一区| 日韩欧美一级精品久久| 国产精品狼人久久影院观看方式| 亚洲日本在线观看| 国产真实乱子伦精品视频| 高清视频一区二区| 欧美精品三级在线观看| 国产日韩欧美麻豆| 婷婷夜色潮精品综合在线| www.综合网.com| 久久只精品国产| 亚洲高清在线视频| www.综合网.com| 国产女同性恋一区二区| 视频在线观看一区| 成人激情黄色小说| 国产婷婷色一区二区三区在线| 亚洲成人免费av| 日本黄色一区二区| 中文字幕日韩一区| 成人综合婷婷国产精品久久蜜臀| 在线电影欧美成精品| 亚洲一区二区三区四区不卡| 不卡av在线免费观看| 久久久天堂av| 国产成人精品免费| 久久色在线视频| 国产成人免费视频| 国产肉丝袜一区二区| 国产精品一品视频| 精品国产一区二区精华| 精品一区二区在线免费观看| 日韩一级片在线观看| 日本欧美肥老太交大片| 精品伦理精品一区| 风间由美一区二区av101| 亚洲视频在线一区| 色综合 综合色| 亚洲国产精品久久久久婷婷884| 国产精品毛片大码女人| 国产麻豆精品在线| 国产精品丝袜黑色高跟| 久久精品国产秦先生| 国产欧美一区二区三区在线看蜜臀 | 国产成人在线视频免费播放| 久久综合久久综合九色| 91蝌蚪porny| 奇米777欧美一区二区| 国产三级欧美三级日产三级99| 色婷婷av一区| 国产精一区二区三区| 亚洲一级片在线观看| 国产欧美综合在线| 欧美va亚洲va在线观看蝴蝶网| 懂色av一区二区三区免费看| 一区二区久久久| 久久久久久99精品| 在线观看av一区| 成人午夜碰碰视频| 蜜桃在线一区二区三区| 国产成人综合视频| 三级在线观看一区二区 | 久久综合色鬼综合色| 欧美色综合天天久久综合精品| 国产aⅴ综合色| 激情文学综合插| 免费视频一区二区| 日韩电影在线免费观看| 亚洲精品一二三四区| 国产欧美一区二区三区鸳鸯浴| 91麻豆精品国产自产在线 | 久久精品理论片| 日本午夜精品视频在线观看| 自拍偷在线精品自拍偷无码专区| 国产精品久久久久一区二区三区共| 欧美日韩国产系列| 欧美乱熟臀69xxxxxx| 一本色道久久综合亚洲91| 91在线云播放| 99在线热播精品免费| 99精品久久只有精品| 国产精品综合网| 高清不卡一区二区在线| 成人精品在线视频观看| 一本大道久久a久久精二百| 欧美影片第一页| 在线综合视频播放| 久久久久久亚洲综合| 亚洲欧洲日产国产综合网| 亚洲狠狠丁香婷婷综合久久久| 亚洲在线观看免费视频| 日韩经典中文字幕一区| 国产在线不卡视频| 成人激情综合网站| 欧美精品丝袜中出| 久久久.com| 亚洲一卡二卡三卡四卡 | 日韩成人免费在线| 国产精品一区二区久久不卡 | 欧美亚洲图片小说| 欧美一卡二卡三卡| 亚洲欧美中日韩| 成人国产在线观看| 欧美一区二区三区白人 | 在线成人高清不卡| 亚洲同性gay激情无套| 久久www免费人成看片高清| 91农村精品一区二区在线| 欧美日韩dvd在线观看| 中文字幕一区二区三区不卡在线 | 日韩高清在线观看| 成人免费观看男女羞羞视频| 日韩一区二区三区视频在线观看| 欧美国产1区2区| 国产一区二区三区不卡在线观看| 一本一道综合狠狠老| 国产目拍亚洲精品99久久精品| 蜜芽一区二区三区| 欧美性videosxxxxx| 曰韩精品一区二区| 99免费精品在线观看| 国产网站一区二区| 国产乱码精品一区二区三区忘忧草| 91精品国产品国语在线不卡| 亚洲丝袜精品丝袜在线| 欧美一区二区三区视频| 一区二区成人在线| 欧美日韩精品一区二区三区 | 韩国av一区二区|