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

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

?? pascalcompiler.cpp

?? C++ mfc 源代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
// PascalSintAnalyzer.cpp: implementation of the CPascalCompiler class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "zscpascal.h"
#include "PascalCompiler.h"

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

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

CPascalCompiler::CPascalCompiler(CString str): 
CPascalLexAnalyzer(str)
{
	m_nICod = 0;
	m_nIdeplas = 0;
	m_nVAdrel = 0;
	m_nVDimv = 0;
	m_nVNivel = 0;
	m_nVNrPar = 0;
}

CPascalCompiler::~CPascalCompiler()
{

}
/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::ProgramSursa()
{
	IncreaseLevel();
	m_nVAdrel = 0;
	if (NextToken() != TT_KW_PROGRAM)
		throw error(SET_EXPECTED,CString("\"program\""));
	
	if (NextToken() != TT_WORD)
		throw error(SET_EXPECTED, CString("identifier"));
	// proceseaza nume program

	if (NextToken() != ';')
		throw error(SET_EXPECTED, CString(";"));

	Bloc();

	if (NextToken() != '.')
		throw error(SET_EXPECTED, CString("."));
	DecreaseLevel();
}
/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::Bloc()
{
	int temp = m_nVAdrel;
	m_nVAdrel = 0;
	int val;
	while  (1)
	{
		if ((val = NextToken()) == TT_KW_CONST)
			ListaDeclConst();
		else
			if (val == TT_KW_VAR)
				ListaDeclVar();
			else 
				if (val == TT_KW_PROCEDURE)
				{
					IncreaseLevel();
					ParamList lp;
					CString nume;
					AntetProc(lp,nume);
					Bloc();
					if (NextToken() != ';')
						throw error(SET_EXPECTED, CString(";"));
					Symbol simb;
					simb.m_sName = nume;
					simb.m_nClass = CT_PROCEDURE;
					simb.m_nNivel = m_nVNivel;
					simb.m_nAdrStart = -1;
					// INCDOM
					//simb.m_nIncDom = 
					simb.m_ListaPar .AddTail(&lp);
					simb.m_nNrPar = lp.GetCount ();
					// Dimensiunea variabileleor locale
					//simb.m_nDimVar 					
					DecreaseLevel();
					InsertSymbol(simb);
				}
				else 
					if (val == TT_KW_FUNCTION)
					{
						IncreaseLevel();
						int type;
						ParamList lp;
						CString nume;
						AntetFunc(lp,type,nume);
						Bloc();
						if (NextToken() != ';')
							throw error(SET_EXPECTED, CString(";"));
						Symbol simb;
						simb.m_sName = nume;
						simb.m_nClass = CT_FUNCTION;
						simb.m_nNivel = m_nVNivel;
						simb.m_nAdrStart = -1;
						simb.m_nType = type;
						// INCDOM
						//simb.m_nIncDom = 
						simb.m_ListaPar .AddTail(&lp);
						simb.m_nNrPar = lp.GetCount ();
						// Dimensiunea variabileleor locale
						//simb.m_nDimVar =
						DecreaseLevel();
						InsertSymbol(simb);
					}
					else
					{
						PushBack();
						InstrCompusa();
						break;
					}
	}
	m_nVAdrel = temp;
}

/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/


void CPascalCompiler::ListaDeclConst()
{
	while (1)
	{
		DeclConst();
		if (NextToken() != ';')
			throw error(SET_EXPECTED, CString(";"));
		if (NextToken() != TT_WORD)
		{
			PushBack();
			break;
		}
		PushBack();
	}
}

/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::DeclConst()
{
	Symbol simb;	// simbolul asociat constantei
	if (NextToken() != TT_WORD)
		throw error(SET_EXPECTED, CString("identifier"));
	simb.m_sName = GetStrValue();
	if (NextToken() != '=')
		throw error(SET_EXPECTED, CString("="));
	
	ExpStat ct;
	ExprStatica(ct);

	simb.m_nClass = CT_CONST;
	simb.m_nNivel = m_nVNivel;
	simb.m_Val = m_ListaConstante.AddHead (ct);
	InsertSymbol (simb);
}

/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::ListaDeclVar()
{
	while (1)
	{
		DeclVar();
		if (NextToken() != ';')
			throw error(SET_EXPECTED, CString(";"));
		if (NextToken() != TT_WORD)
		{
			PushBack();
			break;
		}
		PushBack();
	}
}

/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::AntetProc(ParamList &listaParam, CString &nume)
{
	if (NextToken()!= TT_WORD)
		throw error(SET_EXPECTED, CString("identifier"));	
	nume = GetStrValue();
	if (NextToken()== ';')
		return;
	PushBack();
	Parametri(listaParam);
	if (NextToken()!= ';')
		throw error(SET_EXPECTED, CString(";"));
}

/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::AntetFunc(ParamList &listaParam, int &type, CString &nume)
{
	if (NextToken()!= TT_WORD)
		throw error(SET_EXPECTED, CString("identifier"));;
	nume = GetStrValue();
	if (NextToken()!= ':')
	{
		PushBack();
		Parametri(listaParam);
		if (NextToken()!= ':')
			throw error(SET_EXPECTED, CString(":"));
	}
	TypeInfo info;
	TipSimplu(info);
	if (NextToken()!= ';')
		throw error(SET_EXPECTED, CString(";"));
	type = info.m_nType ;
}

/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::Tip(TypeInfo &info)
{
	int val = NextToken();
	if (val == TT_KW_INTEGER
		|| val == TT_KW_REAL
		|| val == TT_KW_CHAR)
	{
		PushBack();
		info.m_nClass = CT_VAR_SIMP;
		TipSimplu(info);
	}
	if (val == TT_KW_ARRAY)
	{
		PushBack();
		info.m_nClass = CT_VAR_ARRAY;
		TipTablou(info);
	}
	if (val == TT_KW_RECORD)
	{
		PushBack();
		info.m_nClass = CT_VAR_RECORD;
		TipRecord(info);
	}
}

/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::TipSimplu(TypeInfo& info)
{
	int val = NextToken();
	if (val == TT_KW_INTEGER)
	{
		info.m_nType = ST_INTEGER;
		info.m_nSize = SC_INT;
	}
	else 
		if (val == TT_KW_REAL)
		{
			info.m_nType = ST_REAL;
			info.m_nSize = SC_REAL;
		}
		else
			if (val == TT_KW_CHAR)
			{
				info.m_nType = ST_CHAR;
				info.m_nSize = SC_CHAR;
			}
			else 
				throw error(SET_EXPECTED, CString("Basic Type"));;
}

/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::Parametri(ParamList &listaParam)
{
	if (NextToken()!= '(')
		throw error(SET_EXPECTED, CString("("));;
	while (1)
	{
		DeclParam(listaParam);
		if (NextToken()!= ';')
		{
			PushBack();
			break;
		}
	}
	if (NextToken()!= ')')
		throw error(SET_EXPECTED, CString(")"));;
}

/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::DeclParam(ParamList &listaParam)
{
	int transmisie = LV_VALUE;
	StringList list;
	if (NextToken() == TT_KW_VAR)
	{
		transmisie = LV_ADDRESS;
		NextToken();
	}
	PushBack();
	while (1)
	{
		if (NextToken() != TT_WORD)
			throw error(SET_EXPECTED, CString("identifier"));;
		list.AddTail(GetStrValue());
		if (NextToken()!=',')
		{
			PushBack();
			break;
		}
	}
	
	if (NextToken() != ':')
			throw error(SET_EXPECTED, CString(":"));

	TypeInfo info;
	TipSimplu(info);

	POSITION pos = list.GetHeadPosition();
	while (pos != NULL)
	{
		CString numepar = list.GetNext(pos);
		Symbol simb;
		simb.m_sName = numepar;
		if (transmisie == LV_VALUE)
			simb.m_nClass = CT_PARAM_VAL;
		else
			simb.m_nClass = CT_PARAM_ADR;
		simb.m_nType = info.m_nType ;
		InsertSymbol(simb);
		Param par;
		par.m_nTransmisie =transmisie;
		par.m_nType = info.m_nType ;
		listaParam.AddTail (par);
	}

}

/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::InstrCompusa()
{
	if (NextToken()!= TT_KW_BEGIN)
		throw error(SET_EXPECTED, CString("begin"));;
	while (1)
	{
		Instr();
		if (NextToken()==TT_KW_END)
		{
			PushBack();
			break;
		}
		PushBack();
		if (NextToken()==';')
			if (NextToken()==TT_KW_END)
			{
				PushBack();
				break;
			}
			else PushBack();
		else throw error(SET_EXPECTED, CString("end or ;"));
	}
	if (NextToken()!=TT_KW_END)
		throw error(SET_EXPECTED, CString("end"));
}

/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::ExprStatica(ExpStat &ct)
{
	
	ExpStat cres;
	double dResult = 0;	
	CString sResult = _T("");
	int	nResult = 0;
	int type = 0;

	int c = '+';
	while (1)
	{
		TermenStatic(cres);

		switch (type)	// tipul termenului precedent
		{
		case ET_REAL:
			if (cres.m_nType !=ET_REAL)
				throw error(SET_INVALID_OP_TYPES,CString("real type expected"));
			switch (c)
			{
			case '+':
				dResult += cres.m_dVal;
				break;
			case '-':
				dResult -= cres.m_dVal;
				break;
			}

		case ET_INTEGER:
			if (cres.m_nType !=ET_INTEGER)
				throw error(SET_INVALID_OP_TYPES,CString("integer type expected"));
			switch (c)
			{
			case '+':
				nResult += cres.m_nVal;
				break;
			case '-':
				nResult -= cres.m_nVal;
				break;
			}
			break;
		case ET_STRING:
			if (cres.m_nType !=type)
				throw error(SET_INVALID_OP_TYPES,CString("String type expected"));
			switch (c)
			{
			case '+':
				sResult += cres.m_sVal;
				break;
			case '-':
				throw error(SET_INVALID_OP,CString("Can'tsubstract two strings"));
				break;
			}
			break;
		default:
			sResult = cres.m_sVal;
			dResult = cres.m_dVal;
			nResult = cres.m_nVal;
			type = cres.m_nType;
		}
		int val = NextToken();
		if (val!='+' && val != '-')
		{
			PushBack();
			break;
		}
		c = val;
	}
	ct.m_dVal = dResult;
	ct.m_sVal = sResult;
	ct.m_nVal = nResult;
	ct.m_nType = type;
}

/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::DeclVar()
{
	TypeInfo info;
	while (1)
	{
		if (NextToken() != TT_WORD)
			throw error(SET_EXPECTED, CString("identifier"));
		info.m_VarList .AddTail (GetStrValue());	// insert var name to the list
		if (NextToken()!=',')
		{
			PushBack();
			break;
		}
	}
	if (NextToken()!=':')
		throw error(SET_EXPECTED, CString(":"));
	Tip(info);
	// insert tyhe symbols in the symbol table
	POSITION pos = info.m_VarList .GetHeadPosition ();
	while (pos != NULL)
	{
		CString name = info.m_VarList .GetNext(pos);
		Symbol simb;
		simb.m_nNivel = m_nVNivel;
		simb.m_nClass = info.m_nClass ;
		simb.m_nType = info.m_nType ;
		simb.m_nIndMin = info.m_nIndMin ;
		simb.m_nIndMax = info.m_nIndMax ;
		simb.m_sName = name;
		simb.m_nAdrel = info.m_nSize ;
		m_nVAdrel += info.m_nSize ;
		InsertSymbol(simb);
	}
	// hey am I cool or what?
}

/*
***header
***name
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::TipTablou(TypeInfo& info)
{
	if (NextToken() != TT_KW_ARRAY)
		throw error(SET_EXPECTED, CString("array"));
	if (NextToken() != '[')
		throw error(SET_EXPECTED, CString("["));

	if (NextToken()	!= TT_INTEGER)	// trebuie modificat pentru numar zecimal
		throw error(SET_EXPECTED, CString("number"));
	info.m_nIndMin = (int) GetNumValue();
	if (NextToken() != '.')
		throw error(SET_EXPECTED, CString(".."));
	if (NextToken() != '.')
		throw error(SET_EXPECTED, CString(".."));
	
	if (NextToken() != TT_INTEGER)	// trebuie modificat pentru numar zecimal
		throw error(SET_EXPECTED, CString("number"));
	info.m_nIndMax = (int) GetNumValue();
	// verifica daca indicii sunt corecti (indmin<indmax)
	if (info.m_nIndMin>=info.m_nIndMax)
		throw error(SET_GENERAL,CString("The Ind MAX must be greater than Ind MIN"));
	if (NextToken() != ']')
		throw error(SET_EXPECTED, CString("]"));
	if (NextToken() != TT_KW_OF)
		throw error(SET_EXPECTED, CString("of"));
	TipSimplu(info);
	info.m_nSize *= info.m_nIndMax - info.m_nIndMin + 1;
}

/*
***header
***name

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费在线视频一区| 欧美一区二区三区小说| 1区2区3区精品视频| 国产成人欧美日韩在线电影| 久久一日本道色综合| 懂色av噜噜一区二区三区av| 国产精品嫩草久久久久| 色综合久久中文综合久久牛| 亚洲午夜精品一区二区三区他趣| 在线看不卡av| 欧美96一区二区免费视频| 日韩午夜av电影| 韩国成人在线视频| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 精品一区二区三区免费播放| 亚洲精品一区二区三区影院 | 成人免费视频app| 亚洲丝袜精品丝袜在线| 欧美视频一区二区| 免费在线观看一区二区三区| 久久久久久久久一| 色悠悠亚洲一区二区| 日日夜夜精品免费视频| 欧美成人三级电影在线| av中文字幕不卡| 洋洋成人永久网站入口| 欧美一级理论片| 懂色av一区二区三区免费观看| 亚洲精品第一国产综合野| 在线综合视频播放| 丁香激情综合国产| 图片区小说区区亚洲影院| 国产婷婷色一区二区三区四区| av亚洲产国偷v产偷v自拍| 亚洲va在线va天堂| 国产亚洲成aⅴ人片在线观看| 91福利国产精品| 老司机午夜精品99久久| 一区在线播放视频| 欧美一级电影网站| 99国产精品久久久久| 美女在线观看视频一区二区| 国产精品成人免费| 欧美一区二区播放| 91久久奴性调教| 国产一区二区电影| 亚洲成人免费看| 国产精品久久久爽爽爽麻豆色哟哟| 欧美欧美欧美欧美| 91亚洲精品久久久蜜桃网站 | 成人一区二区在线观看| 首页亚洲欧美制服丝腿| 国产精品久久久久四虎| 欧美成人国产一区二区| 欧美日韩一区二区在线观看| 丁香婷婷深情五月亚洲| 蜜桃久久av一区| 亚洲最新视频在线播放| 国产精品视频你懂的| 日韩欧美国产一区二区三区| 欧美性大战久久| 一本一本大道香蕉久在线精品| 国产一区二区导航在线播放| 日本网站在线观看一区二区三区 | 欧美极品另类videosde| 日韩午夜激情电影| 91精品在线一区二区| 欧美视频你懂的| 色综合一个色综合亚洲| 99re这里只有精品视频首页| 国产成人av电影| 国产99久久久国产精品潘金 | 99re免费视频精品全部| 国产精华液一区二区三区| 久久激情综合网| 久久综合综合久久综合| 日韩高清不卡在线| 日日夜夜一区二区| 日韩精品一二区| 肉丝袜脚交视频一区二区| 日韩精品免费视频人成| 亚洲成在线观看| 亚洲午夜私人影院| 亚洲国产精品一区二区久久| 亚洲一区欧美一区| 亚洲成人免费视频| 三级欧美在线一区| 日本va欧美va瓶| 精品一区二区国语对白| 国产一区二区三区在线观看精品| 激情小说亚洲一区| 国产精品亚洲人在线观看| 国产精品亚洲第一区在线暖暖韩国| 国产精品12区| 一本一道久久a久久精品 | 成人激情图片网| 色综合久久综合中文综合网| 欧美日韩高清一区| 日韩欧美中文字幕公布| 久久久777精品电影网影网| 国产精品国产三级国产| 亚洲一区二区精品视频| 热久久久久久久| 国产成人午夜高潮毛片| 91影院在线观看| 欧美日韩高清一区二区三区| 久久综合久久综合亚洲| 综合久久综合久久| 天天亚洲美女在线视频| 国产一区欧美日韩| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国v精品久久久网| 色婷婷一区二区| 日韩欧美中文字幕一区| 国产精品国产三级国产三级人妇 | 26uuu久久综合| 国产精品久久久久永久免费观看| 一区二区三区视频在线看| 日韩电影一区二区三区| 国产v综合v亚洲欧| 在线电影国产精品| 国产精品午夜久久| 天天综合日日夜夜精品| 成人理论电影网| 日韩欧美一级片| 亚洲精品美腿丝袜| 精品一区二区三区在线观看| 色久综合一二码| 久久先锋资源网| 五月天亚洲精品| 成人91在线观看| 精品电影一区二区三区| 亚洲高清不卡在线观看| 不卡一区二区在线| 日韩欧美久久久| 亚洲韩国一区二区三区| 成人伦理片在线| 久久这里只有精品首页| 日本网站在线观看一区二区三区| 91视频在线观看| 久久久久久影视| 蜜臀久久久久久久| 欧美亚洲日本一区| 中国av一区二区三区| 狠狠网亚洲精品| 欧美一级一区二区| 夜夜亚洲天天久久| 91在线免费视频观看| 精品福利一区二区三区免费视频| 婷婷成人综合网| 欧美日韩国产免费一区二区| 亚洲美女偷拍久久| 波多野结衣中文一区| 国产视频一区在线播放| 精品在线播放午夜| 日韩视频国产视频| 日本vs亚洲vs韩国一区三区二区| 欧美日韩国产小视频在线观看| 亚洲精品日韩综合观看成人91| 成人免费不卡视频| 中文在线一区二区| 高清不卡在线观看av| 久久精品亚洲精品国产欧美kt∨| 麻豆精品精品国产自在97香蕉| 欧美人xxxx| 香蕉影视欧美成人| 555夜色666亚洲国产免| 亚洲444eee在线观看| 欧美精品v日韩精品v韩国精品v| 一级日本不卡的影视| 欧美色视频在线观看| 亚洲国产美国国产综合一区二区| 91福利资源站| 视频一区二区三区在线| 欧美一区二区三区日韩视频| 日本女优在线视频一区二区| 91精品国产高清一区二区三区 | 亚洲欧美视频在线观看视频| 91在线免费视频观看| 亚洲天堂成人网| 在线亚洲人成电影网站色www| 一区二区三区在线视频免费观看| 在线免费观看一区| 天堂久久久久va久久久久| 91精品国产综合久久精品图片 | 99久久99精品久久久久久| 日韩理论片一区二区| 91国产精品成人| 日本不卡一区二区| 久久综合成人精品亚洲另类欧美 | 日本特黄久久久高潮| 久久夜色精品国产噜噜av| 丁香婷婷综合激情五月色| 亚洲免费在线电影| 欧美精品xxxxbbbb| 国产v综合v亚洲欧| 一区二区三区在线免费视频 | 欧美视频在线观看一区二区| 免费观看日韩电影| 国产喷白浆一区二区三区|