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

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

?? semantic.cpp

?? 詞法語法語義編譯器
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// Semantic.cpp: implementation of the CSemantic class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "scanner.h"
#include "Semantic.h"
#include "Parsing.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

/**
 * 語義分析構造函數
 *
 * @param  pWordCode			字符表數組
 * @param  pTokenFile			token串頭指針
 * @param  pSymbolTable			符號表頭指針
 * @param  pErrorCollection		錯誤信息頭指針
 *
 */
CSemantic::CSemantic(const char *pWordCode[],
					 PTokenNode pTokenFile,
					 PSTable pSymbolTable,
					 PFSymbol pFSymbol,
					 PErrorNode pErrorCollection)
{
	m_strSourceFile="";
	m_bUseCurToken=true;
	m_pCurToken=NULL;
	m_pFSymbol=pFSymbol;
	this->m_pMorpheme=new CMorpheme(pWordCode,pTokenFile,pSymbolTable,pErrorCollection);
	this->m_pSymbolTable=pSymbolTable;
	for (int i=0;i<KEYWORDCOUNT+1;i++)
	{
		this->m_pWordCode[i]=pWordCode[i];
	}
	InitPFSymbol();
}

/**
 * 語義分析構造函數
 *
 * @param  pWordCode			字符表數組
 * @param  pTokenFile			token串頭指針
 * @param  pSymbolTable			符號表頭指針
 * @param  pErrorCollection		錯誤信息頭指針
 * @param  strSourceFile		源程序文件路徑
 *
 */
CSemantic::CSemantic(const char *pWordCode[],
					 PTokenNode pTokenFile,
					 PSTable pSymbolTable,
					 PFSymbol pFSymbol,
					 PErrorNode pErrorCollection,
					 CString strSourceFile)
{
	m_strSourceFile=strSourceFile;
	m_bUseCurToken=true;
	m_pCurToken=NULL;
	m_pFSymbol=pFSymbol;
	this->m_pMorpheme=new CMorpheme(pWordCode,pTokenFile,pSymbolTable,pErrorCollection,strSourceFile);
	this->m_pSymbolTable=pSymbolTable;
	for (int i=0;i<KEYWORDCOUNT+1;i++)
	{
		this->m_pWordCode[i]=pWordCode[i];
	}

	InitPFSymbol();
}

/**
 * 初始化四元式鏈
 *
 */
void CSemantic::InitPFSymbol()
{
	PFSymbol pFS=NULL;
	if (this->m_pFSymbol->next!=NULL)
	{
		while (m_pFSymbol->next!=NULL)
		{
			pFS=m_pFSymbol->next;
			m_pFSymbol->next=pFS->next;
			delete pFS;
		}
	}

	this->m_pFSymbol->next=new FSymbol;
	m_pCurFS=m_pFSymbol->next;
	m_pCurFS->no=1;
	m_pCurFS->ag1=NULL;
	m_pCurFS->ag2=NULL;
	m_pCurFS->next=NULL;
	m_pCurFS->result=NULL;

}

CSemantic::~CSemantic()
{

}

/**
 * 獲取下一個token字
 *
 * @param	PTokenNode &pToken		token字引用
 *
 * @return  bool					F:文件分析完畢
 *
 */
bool CSemantic::GetNextToken(PTokenNode &pToken)
{
	bool returnValue=true;

	if (this->m_bUseCurToken)
	{
		returnValue=this->m_pMorpheme->StepMorpheme(m_pCurToken,this->m_strSourceFile);		
	}

	pToken=this->m_pCurToken;
	this->m_bUseCurToken=true;

	return returnValue;
}

/**
 * 當前獲取的token字沒被用
 *
 */
void CSemantic::NoUseCurToken()
{
	this->m_bUseCurToken=false;
}

/**
 * 連接兩個四元式鏈,鏈首以pFS2開始
 *
 * @param	PFSymbol pFS1			四元式一
 * @param	PFSymbol pFS2			四元式二
 *
 * @return	PFSymbol				連接鏈首指針
 *
 */
PFSymbol CSemantic::Merg(PFSymbol pFS1,PFSymbol pFS2)
{
	if (pFS2==NULL) return pFS1;
	else
	{
		PFSymbol pFS=pFS2;
		while (pFS->result!=NULL && pFS->result->type==PF && pFS->result->value.fSymbol!=NULL)
		{
			pFS=pFS->result->value.fSymbol;
		}

		if (pFS->result==NULL)
		{
			pFS->result=new FSAG;
			pFS->result->des=NULL;
			pFS->result->type=PF;
			pFS->result->value.fSymbol=pFS1;
		}
		else
		{
			pFS->result->value.fSymbol=pFS1;
			pFS->result->type=PF;
		}

		return pFS2;
	}
}

/**
 * 將nextFS填入pFS的第四個分量
 *
 * @param	PFSymbol pFS			四元式一
 * @param	PFSymbol nextFS			四元式二
 *
 * @return	bool					操作結果
 *
 */
bool CSemantic::BackPatch(PFSymbol pFS,PFSymbol nextFS)
{
	PFSymbol q,Q;
	char ch[10];
	Q=pFS;
	while (Q!=NULL)
	{
		if (Q->result==NULL)
		{
			Q->result=new FSAG;
			itoa(nextFS->no,ch,10);
			Q->result->des=new char[strlen(ch)+1];
			strcpy(Q->result->des,ch);
			Q->result->type=PF;
			Q->result->value.fSymbol=nextFS;
			break;
		}
		else
		{
			if (Q->result->type!=PF) break;

			q=Q->result->value.fSymbol;
			itoa(nextFS->no,ch,10);
			Q->result->des=new char[strlen(ch)+1];
			strcpy(Q->result->des,ch);
			Q->result->value.fSymbol=nextFS;
			Q=q;
		}
	}

	return true;
}

/**
 * 獲取當前要生成的四元式
 *
 */
PFSymbol CSemantic::GetCurPFS()
{
	return this->m_pCurFS;
}

/**
 * 添加錯誤信息
 *
 * @param	const char *description			錯誤信息描述
 *
 */
void CSemantic::AddError(const char *description)
{
	this->m_pMorpheme->AddError(description,this->m_pMorpheme->GetCurRow());
}

/**
 * 翻譯<AE>->i+i|i-i
 *
 * @param	PTokenNode pToken			token字
 *
 */
PFSAG CSemantic::Ae(PTokenNode pToken)
{
	char ch[10];EOP op;
	PFSAG ag1=NULL,ag2=NULL;
	PFSAG result=new FSAG;
	result->des="Temp";
	result->type=ST;

	if (strcmp(this->m_pWordCode[pToken->keycode],"identifier")!=0 && 
		strcmp(this->m_pWordCode[pToken->keycode],"constfloat")!=0 &&
		strcmp(this->m_pWordCode[pToken->keycode],"constint")!=0)
	{
		this->AddError("賦值表達式錯誤!");
		this->NoUseCurToken();
		return NULL;
	}
	ag1=new FSAG;
	if (strcmp(this->m_pWordCode[pToken->keycode],"identifier")==0)
	{
		ag1->des=this->GetIDName(pToken);
		ag1->type=PT;
		ag1->value.token=pToken;
	}
	else
	{ 
		itoa((int)this->m_pSymbolTable->sSubTable[pToken->strId-1].val,ch,10);
		ag1->des=new char[strlen(ch)+1];
		strcpy(ag1->des,ch);
		ag1->type=ST;
		ag1->value.value=this->m_pSymbolTable->sSubTable[pToken->strId-1].val;
	}

	GetNextToken(pToken);
	if (strcmp(this->m_pWordCode[pToken->keycode],"+")!=0 && 
		strcmp(this->m_pWordCode[pToken->keycode],"-")!=0)
	{
		this->NoUseCurToken();
		Gencode(GetOP(":="),ag1,NULL,result);
		return result;
	}
	op=GetOP(this->m_pWordCode[pToken->keycode]);
	GetNextToken(pToken);
	if (strcmp(this->m_pWordCode[pToken->keycode],"identifier")!=0 && 
		strcmp(this->m_pWordCode[pToken->keycode],"constfloat")!=0 &&
		strcmp(this->m_pWordCode[pToken->keycode],"constint")!=0)
	{
		this->AddError("賦值表達式錯誤!");
		this->NoUseCurToken();
		Gencode(GetOP(":="),ag1,NULL,result);
		return result;
	}
	ag2=new FSAG;
	if (strcmp(this->m_pWordCode[pToken->keycode],"identifier")==0)
	{
		ag2->des=this->GetIDName(pToken);
		ag2->type=PT;
		ag2->value.token=pToken;
	}
	else
	{ 
		itoa((int)this->m_pSymbolTable->sSubTable[pToken->strId-1].val,ch,10);
		ag2->des=new char[strlen(ch)+1];
		strcpy(ag2->des,ch);
		ag2->type=ST;
		ag2->value.value=this->m_pSymbolTable->sSubTable[pToken->strId-1].val;
	}
	Gencode(op,ag1,ag2,result);
	return result;
}

/**
 * 翻譯<BE>-><BT>(or<BE>|e)
 *
 * @param	PTokenNode pToken			token字
 * @param	PFSymbol &pTC				真出口
 * @param	PFSymbol &pFC				假出口
 *
 */
void CSemantic::Be(PTokenNode pToken,PFSymbol &pTC,PFSymbol &pFC)
{
	PFSymbol btTC=NULL,btFC=NULL,beTC=NULL,beFC=NULL;
	PTokenNode token=NULL;
	const char *str=this->m_pWordCode[pToken->keycode];
	if (strcmp(str,"not")==0 || strcmp(str,"(")==0 || strcmp(str,"identifier")==0)
	{
		Bt(pToken,btTC,btFC);
		this->BackPatch(btFC,GetCurPFS());
		this->GetNextToken(token);
		if (strcmp(this->m_pWordCode[token->keycode],"or")==0)
		{
			this->GetNextToken(token);
			Be(token,beTC,beFC);
			pTC=this->Merg(btTC,beTC);
			pFC=beFC;
		}
		else
		{
			pTC=btTC;
			pFC=btFC;
			this->NoUseCurToken();
		}
	}
	else
	{
		this->AddError("條件表達式錯誤!");
		this->NoUseCurToken();
	}
}

/**
 * 翻譯<BT>-><BF>(and<BT>|e)
 *
 * @param	PTokenNode pToken			token字
 * @param	PFSymbol &pTC				真出口
 * @param	PFSymbol &pFC				假出口
 *
 */
void CSemantic::Bt(PTokenNode pToken,PFSymbol &pTC,PFSymbol &pFC)
{
	PFSymbol bfTC=NULL,bfFC=NULL,btTC=NULL,btFC=NULL;
	PTokenNode token=NULL;
	const char *str=this->m_pWordCode[pToken->keycode];
	if (strcmp(str,"not")==0 || strcmp(str,"(")==0 || strcmp(str,"identifier")==0)
	{
		Bf(pToken,bfTC,bfFC);
		BackPatch(bfTC,this->GetCurPFS());
		GetNextToken(token);
		if (strcmp(this->m_pWordCode[token->keycode],"and")==0)
		{
			GetNextToken(token);
			Bt(token,btTC,btFC);
			pFC=Merg(btFC,bfFC);
			pTC=btTC;
		}
		else
		{
			pTC=bfTC;
			pFC=bfFC;
			this->NoUseCurToken();
		}
	}
	else
	{
		this->AddError("條件表達式錯誤!");
		this->NoUseCurToken();
	}
}

/**
 * 生成四元式
 *
 * @param	EOP op					操作符
 * @param	PFSAG ag1				運算對象一
 * @param	PFSAG ag1				運算對象二
 * @param	PFSAG result			運算結果
 *
 */	
void CSemantic::Gencode(EOP op,PFSAG ag1,PFSAG ag2,PFSAG result)
{
	PFSymbol pFS=new FSymbol;
	pFS->next=NULL;
	pFS->ag1=NULL;
	pFS->ag2=NULL;
	pFS->result=NULL;

	m_pCurFS->op=op;
	m_pCurFS->ag1=ag1;
	m_pCurFS->ag2=ag2;
	m_pCurFS->result=result;

	this->m_pCurFS->next=pFS;
	pFS->no=this->m_pCurFS->no+1;

	this->m_pCurFS=pFS;
}

/**
 * 獲取pToken的標示名稱
 *
 * @param	PTokenNode pToken			token字
 *
 */	
char *CSemantic::GetIDName(PTokenNode pToken)
{
	if (strcmp(this->m_pWordCode[pToken->keycode],"identifier")==0)
	{
		unsigned int istart=this->m_pSymbolTable->sSubTable[pToken->strId-1].name.headp;
		unsigned int ilen=this->m_pSymbolTable->sSubTable[pToken->strId-1].name.length;
		char *str=new char[ilen+1];		
		for (int i=0;i<ilen;i++)
		{
			str[i]=this->m_pSymbolTable->stringTable[istart+i];
		}
		str[ilen]='\0';
		return str;
	}
	else return NULL;
}

/**
 * 翻譯<BF>->not<BF>
 *		   ->'('<BE>')'
 *		   ->i(rop i|e)
 *
 * @param	PTokenNode pToken			token字
 * @param	PFSymbol &pTC				真出口
 * @param	PFSymbol &pFC				假出口
 *
 */	
void CSemantic::Bf(PTokenNode pToken,PFSymbol &pTC,PFSymbol &pFC)
{
	PFSymbol bfTC=NULL,bfFC=NULL;
	PTokenNode token=NULL;
	const char *str=this->m_pWordCode[pToken->keycode];
	if (strcmp(str,"not")==0)
	{
		GetNextToken(token);
		Bf(token,bfTC,bfFC);
		pTC=bfFC;
		pFC=bfTC;
	}
	else if (strcmp(str,"(")==0)
	{
		GetNextToken(token);
		Be(token,pTC,pFC);
		GetNextToken(token);
		if (strcmp(this->m_pWordCode[token->keycode],")")!=0) 
		{
			this->AddError("缺少)");
			this->NoUseCurToken();
		}
	}
	else if (strcmp(str,"identifier")==0)
	{
		PFSAG pFSAG1=new FSAG;
		pFSAG1->type=PT;
		pFSAG1->value.token=pToken;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产清纯白嫩初高生在线观看91 | 豆国产96在线|亚洲| 亚洲免费观看高清完整版在线观看| 欧美电影一区二区三区| eeuss鲁片一区二区三区在线看| 日韩电影免费在线看| 中文字幕亚洲一区二区va在线| 欧美一级生活片| 91九色02白丝porn| 成人黄色在线看| 激情深爱一区二区| 免费久久精品视频| 亚洲无线码一区二区三区| 国产精品久久福利| 国产无人区一区二区三区| 日韩三级高清在线| 欧美一区二区三区四区五区| 在线观看不卡一区| 色成人在线视频| 波多野结衣中文字幕一区| 欧美一级免费大片| 欧美在线免费视屏| 91麻豆swag| 成人午夜免费视频| 国产精品亚洲一区二区三区妖精| 美国三级日本三级久久99| 肉色丝袜一区二区| 日本免费在线视频不卡一不卡二| 亚洲国产视频一区二区| 一区二区三区日韩欧美| 亚洲色图视频网| 国产精品成人网| 中文字幕中文在线不卡住| 国产欧美一区二区三区网站 | 亚洲一二三区视频在线观看| 亚洲精品欧美激情| 曰韩精品一区二区| 亚洲精品水蜜桃| 亚洲一区二区在线播放相泽| 亚洲一级不卡视频| 亚洲一区在线观看免费| 亚洲五月六月丁香激情| 亚洲线精品一区二区三区八戒| 一区二区欧美视频| 亚洲国产wwwccc36天堂| 日日夜夜免费精品| 捆绑变态av一区二区三区| 国内精品视频666| 国产精品自拍av| 成人免费视频一区二区| 成人黄页在线观看| 91精品办公室少妇高潮对白| 亚洲视频在线观看一区| 亚洲精品高清在线观看| 亚洲综合一区二区三区| 日本在线播放一区二区三区| 狠狠色丁香久久婷婷综| 不卡的看片网站| 欧洲精品视频在线观看| 51午夜精品国产| 精品国产不卡一区二区三区| 久久男人中文字幕资源站| 中文字幕亚洲不卡| 午夜精品久久久久久久| 久久精品国产99| www.欧美日韩| 欧美日韩三级视频| 26uuu久久天堂性欧美| 亚洲欧洲日韩综合一区二区| 亚洲国产aⅴ成人精品无吗| 精油按摩中文字幕久久| aaa国产一区| 欧美一级高清片| 亚洲国产高清aⅴ视频| 亚洲成人三级小说| 高清在线观看日韩| 欧美日韩一区在线观看| 欧美成人猛片aaaaaaa| 国产精品久久久久久久第一福利 | 欧美韩国日本一区| 亚洲精品欧美专区| 精品一区二区三区免费播放| 99在线精品观看| 日韩欧美国产一区二区三区 | 欧美日本韩国一区二区三区视频| 久久综合久久鬼色中文字| 亚洲你懂的在线视频| 另类中文字幕网| 一本大道av一区二区在线播放| 日韩视频123| 亚洲人123区| 国产一区二区成人久久免费影院 | 国产一区二区剧情av在线| 在线看日本不卡| 久久精品一区二区三区不卡 | 欧美理论片在线| 中文字幕亚洲视频| 精品一区二区三区免费毛片爱| 91美女在线观看| 久久久综合九色合综国产精品| 亚洲超丰满肉感bbw| proumb性欧美在线观看| 日韩欧美不卡在线观看视频| 亚洲国产精品一区二区久久恐怖片| 国产精品888| 精品国内片67194| 亚洲va国产天堂va久久en| 91色婷婷久久久久合中文| 久久久久国产免费免费| 免费高清成人在线| 欧美日韩国产乱码电影| 亚洲欧美日韩综合aⅴ视频| 国产精品66部| 精品国产免费久久| 日本亚洲最大的色成网站www| 色94色欧美sute亚洲13| 国产精品久久久99| 成人美女视频在线看| 国产欧美综合在线| 国产成人在线网站| 久久久另类综合| 日韩欧美中文字幕公布| 亚洲bt欧美bt精品| 欧美三片在线视频观看| 亚洲高清免费观看 | 国产成人精品综合在线观看 | 国产精品久久久久桃色tv| 国产一本一道久久香蕉| 精品日韩一区二区三区| 精品一区二区三区视频在线观看| 欧美一卡2卡3卡4卡| 热久久国产精品| 欧美mv日韩mv国产网站app| 久久精品国产一区二区三| 欧美一级欧美三级| 久久97超碰国产精品超碰| 精品国内二区三区| 国产精品资源在线看| 国产日韩影视精品| 成人免费视频免费观看| 欧美激情资源网| 94-欧美-setu| 亚洲午夜电影在线观看| 欧美一级黄色大片| 国产一区二区三区免费在线观看 | 一区二区三区精品在线观看| 91美女在线视频| 亚洲成年人网站在线观看| 7777精品伊人久久久大香线蕉最新版 | 欧美在线不卡视频| 日韩—二三区免费观看av| 欧美xxxxx牲另类人与| 国产精品99久久久久久宅男| 国产精品看片你懂得| 色噜噜夜夜夜综合网| 亚洲第一会所有码转帖| 日韩视频一区二区在线观看| 激情六月婷婷综合| 成人免费一区二区三区视频 | 成人欧美一区二区三区白人| 91福利视频网站| 麻豆91在线看| 中文字幕av资源一区| 91官网在线免费观看| 日韩国产欧美在线观看| 久久久不卡网国产精品一区| 99视频精品免费视频| 午夜影院久久久| 久久久精品国产99久久精品芒果 | 免费av网站大全久久| 久久精品一区八戒影视| 日本大香伊一区二区三区| 日韩av电影一区| 中文字幕一区av| 日韩欧美在线观看一区二区三区| 成人天堂资源www在线| 舔着乳尖日韩一区| 国产午夜久久久久| 欧美日韩中文国产| 国产成人亚洲综合a∨婷婷| 亚洲国产毛片aaaaa无费看| 精品福利二区三区| 日本精品免费观看高清观看| 国模冰冰炮一区二区| 亚洲电影在线播放| 国产精品久久毛片av大全日韩| 91精品国产色综合久久ai换脸| 高清视频一区二区| 蜜臀久久久久久久| 亚洲摸摸操操av| 久久综合色8888| 欧美日本视频在线| www.欧美精品一二区| 精品一区二区三区蜜桃| 亚洲电影一级黄| 日韩一区在线看| 国产婷婷色一区二区三区在线| 欧美日韩不卡一区| 91视频一区二区三区| 国产成人综合在线观看|