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

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

?? pascalcompiler.cpp

?? 袖珍型的pascal編譯器
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
// PascalSintAnalyzer.cpp: implementation of the CPascalCompiler class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "zscpascal.h"
#include "PascalCompiler.h"
#include "VirtualMachine.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_nVNivel = 0;
	
	// Code Table Init Stuff
	m_nLabelCount = 1;	
	m_Code = NULL;
}


CPascalCompiler::~CPascalCompiler()
{
	POSITION pos = m_RecordList.GetHeadPosition();
	while (pos != NULL)
	{
		Record * record = m_RecordList.GetNext(pos);
		delete record;
	}
	delete m_Code;
}



///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 6/8/99 1:22:26 PM
// Function name	: CPascalCompiler::ProgramSursa
// Description	    : The main sintactic thing
// Return type		: void 
///////////////////////////////////////////////////////////////

void CPascalCompiler::ProgramSursa()
{
	// Initialize the level
	// The leveling system will be American style the base level will be 1

	m_nVNivel = 0;

	IncreaseLevel();
	if (NextToken() != TT_KW_PROGRAM)
		throw error(SET_EXPECTED,CString("\"program\""));
	
	if (NextToken() != TT_WORD)
		throw error(SET_EXPECTED, CString("identifier"));
	
	// insert a symbol for the programm

	Symbol *simb = new Symbol;
	simb->m_sName = GetStrValue();
	simb->m_nNivel = m_nVNivel;
	InsertSymbol(simb);

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

	Bloc(simb);
	m_EntryPoint = simb->m_nAdrStart ;

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


///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 5/25/99 6:18:55 PM
// Function name	: CPascalCompiler::Bloc
// Description	    : This function processes a program block
// Return type		: void 
///////////////////////////////////////////////////////////////

void CPascalCompiler::Bloc(Symbol *simbb)
{
	int val, varSize = 0;
	while  (1)
	{
		if ((val = NextToken()) == TT_KW_CONST)
			ListaDeclConst();
		else
			if (val == TT_KW_VAR)
				ListaDeclVar(varSize);
			else 
				if (val == TT_KW_PROCEDURE)
				{
					IncreaseLevel();
					ParamList lp;
					CString nume;
					AntetProc(lp,nume);

					

					Symbol *simb = new Symbol;
					simb->m_sName = nume;
					simb->m_nClass = CT_PROCEDURE;
					simb->m_nNivel = m_nVNivel;
					simb->m_nAdrStart = -1;
					simb->m_ListaPar .AddTail(&lp);
					simb->m_nNrPar = lp.GetCount ();
					InsertSymbol(simb);
					
					m_pCurentBlock = simb;
					Bloc(simb);
					m_pCurentBlock = simbb;

					Symbol *simbaux = new Symbol;
					*simbaux = *simb;
					if (NextToken() != ';')
						throw error(SET_EXPECTED, CString(";"));
					DecreaseLevel();
					InsertSymbol(simbaux);

				}
				else 
					if (val == TT_KW_FUNCTION)
					{
						IncreaseLevel();
						int type;
						ParamList lp;
						CString nume;
						AntetFunc(lp,type,nume);

						Symbol *simb = new Symbol;
						simb->m_sName = nume;
						simb->m_nClass = CT_FUNCTION;
						simb->m_nNivel = m_nVNivel;
						simb->m_nAdrStart = -1;
						simb->m_nType = type;

						simb->m_ListaPar .AddTail(&lp);
						simb->m_nNrPar = lp.GetCount ();
						InsertSymbol(simb);
						m_pCurentBlock = simb;
						Bloc(simb);
						m_pCurentBlock = simbb;
						Symbol *simbaux = new Symbol;
						*simbaux = *simb;
						if (NextToken() != ';')
							throw error(SET_EXPECTED, CString(";"));
						DecreaseLevel();
						InsertSymbol(simbaux);
					}
					else
					{
						PushBack();
						// Block code beginning generation
						AddComment(simbb->m_sName  + " code beginning");
						simbb->m_nAdrStart = m_Code->GetCurCodePos();
						// now some address relocation

						POSITION pos = m_AdrList.GetHeadPosition();
						while (pos != NULL)
						{
							POSITION prev = pos;
							AddressPlace place = m_AdrList.GetNext(pos);
							if (simbb->m_sName == place.m_sSimb)
							{
								m_Code->SetAddress(place.m_nPosition,simbb->m_nAdrStart);
								m_AdrList.RemoveAt(prev);
							}
						}

						GenerateCode(INSTR_ENTER,(BYTE)m_nVNivel,(REGISTER) varSize);
						InstrCompusa();
						GenerateCode(INSTR_LEAVE);
						GenerateCode(INSTR_RET);
						break;
					}
	}
}




///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 3:42:39 PM
// Function name	: CPascalCompiler::ListaDeclConst
// Description	    : The constant declaration list
// Return type		: void 
///////////////////////////////////////////////////////////////

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


///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 3:43:19 PM
// Function name	: CPascalCompiler::DeclConst
// Description	    : a constant declaration
// Return type		: void 
///////////////////////////////////////////////////////////////

void CPascalCompiler::DeclConst()
{
	Symbol *simb = new Symbol;	// The symbol
	
	if (NextToken() != TT_WORD)
		throw error(SET_EXPECTED, CString("identifier"));
	simb->m_sName = GetStrValue();
	if (NextToken() != '=')
		throw error(SET_EXPECTED, CString("="));
	
	ExprInfo ct;
	ExprStatica(ct);

	simb->m_nClass = CT_CONST;
	simb->m_nNivel = m_nVNivel;
	simb->m_nType = ct.m_nAtribTip ;
	switch (simb->m_nType)
	{
	case ET_INTEGER:
		CV_INTEGER(simb->m_Val) = ct.m_nAttribValue ;
		break;
	case ET_REAL:
		CV_REAL(simb->m_Val) = ct.m_dAttribValue ;
		break;
	case ET_CHAR:
		CV_CHAR(simb->m_Val) = ct.m_cAttribValue ;
		break;
	}
	InsertSymbol (simb);
}



///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 3:43:52 PM
// Function name	: CPascalCompiler::ListaDeclVar
// Description	    : The variable Declaration list
// Return type		: void 
// Argument         : int &varSize - the size of the variables
///////////////////////////////////////////////////////////////

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



///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 4:12:32 PM
// Function name	: CPascalCompiler::AntetProc
// Description	    : Procedure declaration
// Return type		: void 
// Argument         : ParamList &listaParam - parameter list
// Argument         : CString &nume -  the function name
///////////////////////////////////////////////////////////////

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, nume);
	if (NextToken()!= ';')
		throw error(SET_EXPECTED, CString(";"));
}



///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 4:16:10 PM
// Function name	: CPascalCompiler::AntetFunc
// Description	    : Function declaration
// Return type		: void 
// Argument         : ParamList &listaParam - parameters list
// Argument         : int &type - the returning value type
// Argument         : CString &nume - the name of the function
///////////////////////////////////////////////////////////////

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, nume);
		if (NextToken()!= ':')
			throw error(SET_EXPECTED, CString(":"));
	}
	TypeInfo info;
	TipSimplu(info);
	if (NextToken()!= ';')
		throw error(SET_EXPECTED, CString(";"));
	type = info.m_nType ;
}



///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 4:24:05 PM
// Function name	: CPascalCompiler::Tip
// Description	    : Type parsing
// Return type		: void 
// Argument         : TypeInfo &info - this structure is filled by the function
///////////////////////////////////////////////////////////////

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);
	}
}



///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 4:31:41 PM
// Function name	: CPascalCompiler::TipSimplu
// Description	    : Simple type parsing
// Return type		: void 
// Argument         : TypeInfo& info - the info is returned by function
///////////////////////////////////////////////////////////////

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



///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 4:33:15 PM
// Function name	: CPascalCompiler::Parametri
// Description	    : Parameter parsing
// Return type		: void 
// Argument         : ParamList &listaParam - the returned parameter list
// Argument         : CString &function - da name
///////////////////////////////////////////////////////////////

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



///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 4:34:02 PM
// Function name	: CPascalCompiler::DeclParam
// Description	    : 
// Return type		: void 
// Argument         : ParamList &listaParam
// Argument         : CString &function
///////////////////////////////////////////////////////////////

void CPascalCompiler::DeclParam(ParamList &listaParam, CString &function)
{
	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 = new Symbol;
		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 ;
		simb->m_nNivel = m_nVNivel;
		Param par;
		par.m_nTransmisie =transmisie;
		par.m_nType = info.m_nType ;
		listaParam.AddTail (par);
		simb->m_nAdrel = ((int)listaParam.GetCount());
		simb->m_sRelated = function;
		InsertSymbol(simb);
	}

}


///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 4:34:11 PM
// Function name	: CPascalCompiler::InstrCompusa
// Description	    : 
// Return type		: void 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩和欧美的一区二区| 在线播放亚洲一区| 欧美另类一区二区三区| 亚洲国产精华液网站w| 日本在线观看不卡视频| eeuss鲁片一区二区三区在线看| 91精品国产丝袜白色高跟鞋| 亚洲精品国久久99热| 紧缚奴在线一区二区三区| 欧美影院午夜播放| 国产欧美精品在线观看| 免费观看91视频大全| 欧美午夜精品久久久| 国产精品乱子久久久久| 国产一区在线看| 91精品国产麻豆国产自产在线 | 欧美一卡2卡3卡4卡| 亚洲人成网站影音先锋播放| 国精品**一区二区三区在线蜜桃| 欧美日韩高清一区二区三区| 亚洲欧美日韩国产综合在线| 国产高清一区日本| 精品盗摄一区二区三区| 日韩av电影天堂| 欧美精品色综合| 亚洲成va人在线观看| 色视频成人在线观看免| 亚洲美女在线国产| 一本一道久久a久久精品综合蜜臀| 国产精品网站在线播放| 成人午夜精品在线| 国产精品久久久久久久岛一牛影视| 国产精品18久久久久久久久久久久 | 成人精品小蝌蚪| 国产精品欧美一区喷水| 成人综合婷婷国产精品久久| 国产视频一区在线播放| 国产成人午夜99999| 中文字幕高清一区| 色偷偷一区二区三区| 亚洲精品福利视频网站| 在线视频国产一区| 亚洲妇女屁股眼交7| 91精品国产91久久综合桃花| 美女视频黄免费的久久 | 91成人在线观看喷潮| 一区二区三区国产| 欧美日韩免费一区二区三区| 亚洲成人你懂的| 日韩欧美国产不卡| 国产福利一区二区三区视频 | 精品国产91亚洲一区二区三区婷婷| 狠狠色丁香久久婷婷综合丁香| 久久人人爽爽爽人久久久| 成人一级黄色片| 亚洲激情在线播放| 日韩你懂的在线播放| 国产精品一区二区无线| 亚洲日本丝袜连裤袜办公室| 欧美午夜电影网| 国产一区二区三区精品欧美日韩一区二区三区| 久久午夜羞羞影院免费观看| 国产白丝网站精品污在线入口| 136国产福利精品导航| 欧美日韩久久久| 国产成人精品一区二区三区网站观看| 中文字幕亚洲一区二区va在线| 欧美日韩国产欧美日美国产精品| 精品一二三四在线| 一区二区三区免费看视频| 欧美人妖巨大在线| 不卡的av网站| 麻豆专区一区二区三区四区五区| 中文字幕一区二区三区在线播放| 91麻豆精品国产综合久久久久久| 国产1区2区3区精品美女| 亚洲观看高清完整版在线观看| 日韩精品一区二区三区在线播放 | 激情深爱一区二区| 最近日韩中文字幕| 久久久青草青青国产亚洲免观| 欧美亚洲尤物久久| 成年人国产精品| 国产一区二区三区精品欧美日韩一区二区三区 | 日韩欧美不卡在线观看视频| av在线不卡观看免费观看| 久久精品999| 首页欧美精品中文字幕| 国产精品免费av| 精品999在线播放| 欧美日韩精品一区二区三区| 成人国产一区二区三区精品| 另类小说视频一区二区| 视频一区国产视频| 洋洋成人永久网站入口| 国产亲近乱来精品视频| 欧美成人三级电影在线| 欧美美女网站色| 精品视频一区三区九区| 91免费精品国自产拍在线不卡| 狠狠v欧美v日韩v亚洲ⅴ| 天天综合色天天综合色h| 一区二区三区精品视频在线| 亚洲国产成人一区二区三区| 精品成人私密视频| 日韩三级av在线播放| 欧美日韩国产另类一区| 欧美综合天天夜夜久久| 色中色一区二区| 91色porny在线视频| av一本久道久久综合久久鬼色| 国产精品一区二区三区99| 国产一区二区在线电影| 久久99国产精品尤物| 久久91精品久久久久久秒播| 免费人成在线不卡| 久久精品国产精品青草| 理论电影国产精品| 韩国视频一区二区| 国产成人亚洲精品青草天美| 国产高清精品久久久久| 国产成人自拍高清视频在线免费播放| 国产主播一区二区三区| 国产美女精品人人做人人爽| 国产一区二区三区四区五区美女| 国产一区二区中文字幕| 国产成a人无v码亚洲福利| 国产.精品.日韩.另类.中文.在线.播放 | 樱桃国产成人精品视频| 亚洲综合久久av| 日韩av在线播放中文字幕| 日韩电影在线观看一区| 久久精品国产77777蜜臀| 国产一区不卡精品| 成人激情开心网| 欧美亚洲高清一区| 日韩午夜精品视频| 欧美激情资源网| 亚洲人xxxx| 午夜精品爽啪视频| 久久成人18免费观看| 成人免费三级在线| 欧美午夜一区二区| 2022国产精品视频| 最新中文字幕一区二区三区| 亚洲香肠在线观看| 国产伦精一区二区三区| 91年精品国产| 2023国产精品| 亚洲自拍偷拍网站| 国产精品一区二区三区四区| 一本大道av一区二区在线播放| 日韩视频免费观看高清完整版在线观看| 久久久久久综合| 亚洲成年人网站在线观看| 国产麻豆91精品| 在线播放亚洲一区| 国产精品黄色在线观看| 日韩在线观看一区二区| www.成人网.com| 精品999在线播放| 亚洲国产一二三| 丁香啪啪综合成人亚洲小说| 7777精品伊人久久久大香线蕉 | 不卡的看片网站| 日韩免费高清视频| 一区二区三区四区亚洲| 精品中文字幕一区二区| 欧美少妇xxx| 一区精品在线播放| 精品无码三级在线观看视频| 在线观看日韩一区| 亚洲国产精品成人综合| 日本成人中文字幕| 欧美色图12p| 亚洲精品乱码久久久久久黑人 | 久久99精品国产麻豆不卡| 欧美色倩网站大全免费| 亚洲国产高清在线| 国产久卡久卡久卡久卡视频精品| 欧美另类变人与禽xxxxx| 亚洲免费在线电影| 9i看片成人免费高清| 国产欧美视频一区二区| 韩国v欧美v日本v亚洲v| 欧美一区二区大片| 人人精品人人爱| 欧美精品乱码久久久久久| 亚洲人成精品久久久久| 成人精品国产福利| 国产午夜精品久久| 成人av资源在线观看| 国产精品素人一区二区| 国产乱人伦偷精品视频免下载| 日韩精品一区二区三区视频播放 | 午夜精品久久久久久久久久久 | 国产亚洲婷婷免费| 国产91综合一区在线观看| 久久久亚洲高清| 国产传媒欧美日韩成人|