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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? pascalcompiler.cpp

?? 袖珍型的pascal編譯器
?? CPP
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
	type = et;
}



///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 4:36:32 PM
// Function name	: CPascalCompiler::Factor
// Description	    : 
// Return type		: void 
// Argument         : ExprInfo &type
///////////////////////////////////////////////////////////////

void CPascalCompiler::Factor(ExprInfo &type)
{
	StackEntry entry;
	int val = NextToken();
	if (val == '-')
	{
		entry.m_nType = SE_INTEGER;		
		CV_INTEGER(entry.m_Info) = (INTEGER)0;
		GenerateCode(INSTR_LODI,entry);	
		Factor(type);
		GenerateCode(INSTR_SUB);	
		return;
	}
	if (val == TT_INTEGER)
	{
		type.m_nAtribLValue = LV_VALUE;
		type.m_nAtribTip = ET_INTEGER;
		
		// Generate code
		entry.m_nType = SE_INTEGER;		
		CV_INTEGER(entry.m_Info) = (INTEGER)GetNumValue ();
		GenerateCode(INSTR_LODI,entry);
		return;
	}
	if (val == TT_REAL)
	{
		type.m_nAtribLValue = LV_VALUE;
		type.m_nAtribTip = ET_REAL;

		// Generate Code
		entry.m_nType = SE_REAL;		
		CV_REAL(entry.m_Info) = (REAL)GetNumValue ();
		GenerateCode(INSTR_LODI,entry);

		return;
	}
	if (val == TT_CHAR)
	{
		type.m_nAtribLValue = LV_VALUE;
		type.m_nAtribTip = ET_CHAR;

		// Generate Code
		entry.m_nType = SE_CHAR;		
		CV_CHAR(entry.m_Info) = (CHAR)(GetStrValue()[0]);
		GenerateCode(INSTR_LODI,entry);

		return;
	}
	if (val == '(')
	{
		Expr(type);
		if (NextToken()!=')')
			throw error(SET_EXPECTED, CString(")"));
		return;
	}
	if (val == TT_WORD)
		if (IsFunc(GetStrValue()))
		{
			PushBack();
			ApelFunc(type);	// Leaves result on stack
			return;
		}
		else 
		{
			PushBack();
			Variabila(type); // Leaves result on stack
			return;
		}
	
	throw error(SET_EXPECTED, CString("number or constant or identifier or function or variable "));;
}




///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 4:36:42 PM
// Function name	: CPascalCompiler::IsFunc
// Description	    : 
// Return type		: BOOL 
// Argument         : CString &str
///////////////////////////////////////////////////////////////

BOOL CPascalCompiler::IsFunc(CString &str)
{
	Symbol *simb = NULL;
	if (!RetreaveSymbol(str,simb))
		return FALSE;
	return (simb->m_nClass == CT_FUNCTION);
}



///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 5/28/99 3:35:29 PM
// Function name	: CPascalCompiler::ApelFunc
// Description	    : Function calling
// Return type		: void 
// Argument         : ExprInfo &type
///////////////////////////////////////////////////////////////

void CPascalCompiler::ApelFunc(ExprInfo &type)
{
	if (NextToken()!=TT_WORD)
		throw error(SET_EXPECTED, CString("identifier"));
	Symbol *simb = NULL;
	CString functie = GetStrValue();
	RetreaveSymbol(functie,simb);
	AddComment("Calling: " + GetStrValue());
	// alocate the return value on the stack
	StackEntry entry;
	entry.m_nType = simb->m_nType ;
	GenerateCode(INSTR_LODI,entry);

	POSITION pos = simb->m_ListaPar.GetHeadPosition ();
	if (NextToken()=='(')
	{
		while (1)
		{
			if (pos == NULL)
				throw error(SET_GENERAL, CString("Too many parameters"));
			Param par = simb->m_ListaPar .GetNext(pos);
			
			// This part put's the entire parameters on the stack
			if (par.m_nTransmisie == LV_ADDRESS)
				VariabilaAdr(type);
			else
				Expr(type);

			if (type.m_nAtribTip != par.m_nType )
				throw error(SET_GENERAL, CString("Invalid Parameter type"));
			if (par.m_nTransmisie == LV_ADDRESS && type.m_nAtribLValue== LV_VALUE )
				throw error(SET_GENERAL, CString("Invalid Parameter, must be a variable"));
			
	


			if (NextToken()!=',')
			{
				PushBack();
				if (pos != NULL)
					throw error(SET_GENERAL, CString("Too few parameters"));
				break;
			}
		}
		if (NextToken()!=')')
			throw error(SET_EXPECTED, CString(")"));
	}
	else
	{
		PushBack();
		if (simb->m_ListaPar.GetCount () != 0)
				throw error(SET_GENERAL, CString("Some parameters expected"));
	}
	type.m_nAtribLValue = LV_VALUE;
	type.m_nAtribTip = simb->m_nType ;
	// Generate code for the call
	if (simb->m_nAdrStart == -1)
	{
		AddressPlace place;
		place.m_nPosition = m_Code->GetCurCodePos() + VM_ICSIZE;
		place.m_sSimb = functie ;
		m_AdrList.AddHead(place);
	}
	GenerateCode(INSTR_CALL,(REGISTER)simb->m_nAdrStart, simb->m_sName);
	GenerateCode(INSTR_RED,(OFFSET)simb->m_ListaPar.GetCount());
	// THe result is leaved on the stack
}




///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 4:36:53 PM
// Function name	: CPascalCompiler::InstrWhile
// Description	    : 
// Return type		: void 
///////////////////////////////////////////////////////////////

void CPascalCompiler::InstrWhile()
{
	CString label,label2;
	if (NextToken()!=TT_KW_WHILE)
		throw error(SET_EXPECTED, CString("while"));
	int ujmpAdr = m_Code->GetCurCodePos();
	label2.Format("ET%d", m_nLabelCount ++);
	InsertLabel(label2 + ":");
	Conditie();
	label.Format("ET%d",m_nLabelCount ++);
	int jumpAdr = m_Code->GetCurCodePos() + VM_ICSIZE;
	GenerateCode(INSTR_NFJP,0,label);
	if (NextToken()!=TT_KW_DO)
		throw error(SET_EXPECTED, CString("do"));
	Instr();
	GenerateCode(INSTR_UJP,ujmpAdr,label2);
	InsertLabel(label+":");
	m_Code->SetAddress(jumpAdr,m_Code->GetCurCodePos());
}



///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 6/8/99 1:16:45 PM
// Function name	: CPascalCompiler::Conditie
// Description	    : Evaluare conditie
// Return type		: void 
///////////////////////////////////////////////////////////////

void CPascalCompiler::Conditie()
{
	int val;
	BOOL first = TRUE;
	int op = TT_KW_AND;
	while (1)
	{
		if (NextToken()!=TT_KW_NOT)
			PushBack();
		ExprLogica();
		val = NextToken();
		if (!first)
			if (op == TT_KW_OR)
				GenerateCode(INSTR_OR);
			else
				GenerateCode(INSTR_AND);

		if (val != TT_KW_AND && val != TT_KW_OR)
		{
			PushBack();
			break;
		}
		op = val;
		first = FALSE;
	}
}




///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 4:37:02 PM
// Function name	: CPascalCompiler::ExprLogica
// Description	    : 
// Return type		: void 
///////////////////////////////////////////////////////////////

void CPascalCompiler::ExprLogica()
{
	ExprInfo type1, type2;
	Expr(type1);
	int val = NextToken();
	switch (val)
	{
	case '=':break;
	case '<':break;
	case '>':break;
	case TT_GTE:break;
	case TT_LWE:break;
	case TT_NE:break;
	default: throw error(SET_EXPECTED, CString("logical operator"));
	}
	Expr(type2);
	if (type1.m_nAtribTip == ET_CHAR && type2.m_nAtribTip != ET_CHAR)
		throw error(SET_EXPECTED, CString("same operand types"));
	if ((type1.m_nAtribTip == ET_INTEGER || type1.m_nAtribTip != ET_REAL) &&
		(type2.m_nAtribTip == ET_CHAR))
		throw error(SET_EXPECTED, CString("same operand types"));

	// Now generating code
	
	switch (val)
	{
	case '=':
		GenerateCode(INSTR_EQU);
		break;
	case '<':
		GenerateCode(INSTR_LES);
		break;
	case '>':break;
		GenerateCode(INSTR_GRT);
		break;
	case TT_GTE:
		GenerateCode(INSTR_GEQ);
		break;
	case TT_LWE:
		GenerateCode(INSTR_LEQ);
		break;
	case TT_NE:
		GenerateCode(INSTR_NEQ);
		break;
	}

}



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

void CPascalCompiler::InstrRepeat()
{
	if (NextToken()!=TT_KW_REPEAT)
		throw error(SET_EXPECTED, CString("repeat"));
	int jumpAdr = m_Code->GetCurCodePos();
	CString label;
	label.Format("ET%d",m_nLabelCount ++);
	InsertLabel(label + ":");
	Instr();
	if (NextToken()!=TT_KW_UNTIL)
		throw error(SET_EXPECTED, CString("until"));
	Conditie();
	GenerateCode(INSTR_NFJP,(REGISTER)jumpAdr,label);
}



///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 4:37:17 PM
// Function name	: CPascalCompiler::InstrIf
// Description	    : 
// Return type		: void 
///////////////////////////////////////////////////////////////

void CPascalCompiler::InstrIf()
{
	CString label;
	
	// unnecesary comparison, but ... :-) who cares
	if (NextToken()!=TT_KW_IF)
		throw error(SET_EXPECTED, CString("if"));

	Conditie();
	if (NextToken()!=TT_KW_THEN)
		throw error(SET_EXPECTED, CString("then"));

	// now we have the result of the condition on the stack
	int place1 = m_Code->GetCurCodePos()+VM_ICSIZE;
	label.Format("ET%d",m_nLabelCount++);
	GenerateCode(INSTR_NFJP,(REGISTER)0,label);
	Instr();
	int place2 = m_Code->GetCurCodePos()+VM_ICSIZE;
	CString label2 = label;
	label.Format("ET%d",m_nLabelCount++);
	GenerateCode(INSTR_UJP,(REGISTER)0,label);
	InsertLabel(label2+":");
	m_Code->SetAddress(place1,(REGISTER) m_Code->GetCurCodePos())	;
	if (NextToken()==TT_KW_ELSE)
	{
		Instr();
	}
	else PushBack();
	m_Code->SetAddress(place2,(REGISTER) m_Code->GetCurCodePos())	;
	InsertLabel(label + ":");
}




///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 6/1/99 2:56:22 PM
// Function name	: CPascalCompiler::InstrFor
// Description	    : This function is is version one
// Return type		: void 
///////////////////////////////////////////////////////////////

void CPascalCompiler::InstrFor()
{
	BOOL ascending;
	BOOL stepspecified = FALSE;
	if (NextToken()!=TT_KW_FOR)
		throw error(SET_EXPECTED, CString("for"));
	ExprInfo type;
	// Start Counter address generation record
	POSITION countAdr = StartNewRecord();
	VariabilaAdr(type);
	StopRecord (countAdr);
	// The address of the variable is on the stack
	

	if (type.m_nAtribLValue!=LV_ADDRESS)
		throw error(SET_GENERAL, CString("Variable expected"));
	if (type.m_nAtribTip != ET_INTEGER)
		throw error(SET_GENERAL, CString("Variable of integer type expected"));
	if (NextToken()!=TT_IS)
		throw error(SET_EXPECTED, CString(":="));
	// now putting the initial value on the stack
	Expr(type);

	// Store the initial value in the counter
	GenerateCode(INSTR_STO);

	
	if (type.m_nAtribTip != ET_INTEGER)
		throw error(SET_GENERAL, CString("The For value must be of integer type"));
	int val = NextToken();
	if (val==TT_KW_TO)
	{
		// varianta To
		ascending = TRUE;
	}
	else
		if (val==TT_KW_DOWNTO)
		{
			// varianta DownTo
			ascending = FALSE;
		}
		else throw error(SET_EXPECTED, CString("to or downto"));

	// Now redirect the code generation to a temporary code storage
	Code * oldCode = NULL;
	Code * tmpCode = new Code;
	
	oldCode = Redirect(tmpCode);
	
	// Record the target value
	
	POSITION targetValue = StartNewRecord();
	Expr(type);
	StopRecord(targetValue);

	if (type.m_nAtribTip != ET_INTEGER)
	{
		delete oldCode;
		throw error(SET_GENERAL, CString("The For value must be of integer type"));
	}
	POSITION stepValue = NULL;
	
	if (NextToken() == TT_KW_STEP)
	{
		stepValue = StartNewRecord();
		Expr(type);
		StopRecord(stepValue);
		if (type.m_nAtribTip != ET_INTEGER)
		{
			delete oldCode;
			throw error(SET_GENERAL, CString("The For value must be of integer type"));
		}
		// now we have the increment on stack
		stepspecified = TRUE;
	}
	else PushBack();
	if (NextToken()!=TT_KW_DO)
	{
		delete oldCode;
		throw error(SET_EXPECTED, CString("do"));
	}
	
	// writing code
	Redirect(oldCode);

	int et1 = m_Code->GetCurCodePos();
	InsertLabel(CString("ET1:"));

	PasteRecord(countAdr);
	GenerateCode(INSTR_USTO);
	PasteRecord(targetValue);
	if (ascending)
		GenerateCode(INSTR_GRT);
	else
		GenerateCode(INSTR_LES);
	int place = m_Code->GetCurCodePos()+VM_ICSIZE;
	GenerateCode(INSTR_FJP,(REGISTER)0,CString("ET2"));

	Instr();

	PasteRecord(countAdr);
	GenerateCode(INSTR_COPY);
	GenerateCode(INSTR_USTO);
	if (stepspecified)
		PasteRecord(stepValue);
	else
	{
		StackEntry entry;
		entry.m_nType = SE_INTEGER;
		CV_INTEGER(entry.m_Info) = 1;
		GenerateCode(INSTR_LODI,entry);
	}
	if (ascending)
		GenerateCode(INSTR_ADD);
	else
		GenerateCode(INSTR_SUB);
	GenerateCode(INSTR_STO);
	GenerateCode(INSTR_UJP,(REGISTER) et1,CString("ET1"));
	m_Code->SetAddress(place,(REGISTER) m_Code->GetCurCodePos())	;
	InsertLabel (CString("ET2:"));

	RemoveRecord(countAdr);

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久国产午夜精品| 亚洲风情在线资源站| 91丨九色丨蝌蚪富婆spa| 韩国视频一区二区| 国产在线播精品第三| 精品无码三级在线观看视频| 久久er精品视频| 精品影视av免费| 精品在线观看视频| 亚洲va在线va天堂| 天天操天天色综合| 亚洲视频一二三区| 久久久亚洲精品一区二区三区| 欧美色图天堂网| 99国产精品99久久久久久| 99精品视频在线播放观看| 色综合久久66| 欧美日韩高清一区二区不卡| 日韩一卡二卡三卡| 欧美日韩视频专区在线播放| 欧美一区二区福利在线| 欧美成人高清电影在线| 国产日韩欧美麻豆| 中文字幕日本不卡| 亚洲午夜精品在线| 麻豆久久久久久| 日本不卡一二三区黄网| 国产中文一区二区三区| 美国毛片一区二区| 日本大胆欧美人术艺术动态| 亚洲一卡二卡三卡四卡| 中文字幕一区日韩精品欧美| 国产欧美精品一区二区色综合| 亚洲欧洲精品天堂一级| 亚洲一区二区欧美激情| 亚洲免费在线视频一区 二区| 国产精品毛片无遮挡高清| 欧美激情在线一区二区| 国产日产欧美精品一区二区三区| 日韩免费高清av| 日韩午夜激情视频| 欧美成人国产一区二区| 国产精品福利一区二区三区| 丝袜诱惑亚洲看片| 国产成人午夜片在线观看高清观看| 狠狠久久亚洲欧美| 色综合天天狠狠| 欧美v日韩v国产v| 欧美精品一区二区三区蜜桃视频| 欧美国产日韩精品免费观看| 香蕉久久夜色精品国产使用方法| 午夜一区二区三区在线观看| 国产酒店精品激情| 欧美日韩一区国产| 日韩一区二区三区三四区视频在线观看| 欧美日韩国产乱码电影| 欧美肥妇毛茸茸| 日韩欧美一区二区不卡| 精品99一区二区| 日本一区二区电影| 日韩高清不卡一区二区三区| 97精品国产露脸对白| 日韩三级高清在线| 国产欧美精品一区二区三区四区 | 欧美日韩精品一区二区在线播放| 久久女同互慰一区二区三区| 午夜久久久久久久久久一区二区| 国产+成+人+亚洲欧洲自线| 成人精品国产免费网站| 91黄色激情网站| 中文字幕第一页久久| 亚洲天堂福利av| 国产精品一区二区在线看| 欧美一级视频精品观看| 国产亚洲精品资源在线26u| 亚洲欧洲精品成人久久奇米网| 久久国产福利国产秒拍| 欧美精品乱人伦久久久久久| 精品国产乱码久久| 亚洲视频一二三区| 日本不卡高清视频| 精品视频123区在线观看| 最新国产精品久久精品| 三级久久三级久久久| 国产剧情在线观看一区二区| 日韩精品一区在线| 欧美aaaaaa午夜精品| 欧美日韩国产大片| 亚洲成av人片在线| 在线观看日韩精品| 亚洲激情中文1区| 在线看不卡av| 久久九九久久九九| 国产一区 二区| 国产亚洲成aⅴ人片在线观看 | av一区二区三区| 69p69国产精品| 中文字幕第一区| 国产乱人伦偷精品视频不卡| 在线精品亚洲一区二区不卡| wwwwww.欧美系列| 亚洲成人av资源| 成人av中文字幕| 久久久久99精品国产片| 亚洲福利视频导航| 成人18精品视频| 亚洲精品在线电影| 国产原创一区二区三区| 欧美日韩免费观看一区三区| 国产精品国产三级国产| 精品在线观看免费| 国产午夜精品理论片a级大结局 | 色综合久久久久综合体| 亚洲精选视频在线| 国产大陆亚洲精品国产| 中文在线一区二区| 本田岬高潮一区二区三区| 亚洲欧洲日韩av| 欧美日韩国产片| 亚洲精品v日韩精品| 欧美精品在线一区二区三区| 蜜桃av一区二区三区电影| 久久久.com| 精品一区二区三区影院在线午夜 | 国产一级精品在线| 中文字幕精品一区二区三区精品 | 亚洲女厕所小便bbb| 国产成人亚洲综合a∨猫咪| 日韩三级高清在线| 天堂成人国产精品一区| 337p日本欧洲亚洲大胆精品| 国产风韵犹存在线视精品| 亚洲免费观看高清完整版在线| 欧美三级电影一区| 国产真实乱子伦精品视频| 亚洲欧洲日韩av| 成人av在线影院| 亚洲成人一区二区| 欧美精品一区视频| 91麻豆swag| 另类小说图片综合网| 国产精品色噜噜| 欧美三区在线观看| 国产福利不卡视频| 亚洲国产精品一区二区久久| 欧美午夜寂寞影院| 一个色综合av| 久久先锋影音av鲁色资源| 国产在线播放一区三区四| 亚洲九九爱视频| 精品视频999| 成人免费三级在线| 日韩国产精品大片| 亚洲色图制服诱惑| 欧美色欧美亚洲另类二区| 亚洲3atv精品一区二区三区| 欧美精品一区二区三区很污很色的 | 久久亚洲一区二区三区四区| 91视频免费看| 一区二区三区四区国产精品| 色综合天天综合网国产成人综合天 | 欧美日韩一区三区| 成人免费视频app| 樱花影视一区二区| 欧美二区三区91| 久久99精品久久只有精品| 亚洲人成7777| 欧美另类videos死尸| 成年人国产精品| 极品美女销魂一区二区三区| 亚洲图片欧美视频| 国产精品天干天干在观线| 亚洲精品在线观| 91在线你懂得| 国产传媒久久文化传媒| 一区二区三区蜜桃网| 中文字幕精品一区二区精品绿巨人 | 91国产丝袜在线播放| 国产成a人无v码亚洲福利| 麻豆精品一区二区综合av| 亚洲线精品一区二区三区八戒| 国产精品毛片a∨一区二区三区| 欧美mv和日韩mv国产网站| 不卡av免费在线观看| 亚洲成av人片一区二区梦乃 | 久久99精品国产.久久久久久| 亚洲一区二区不卡免费| 精品奇米国产一区二区三区| 成人理论电影网| 国产剧情在线观看一区二区| 一区二区三区成人| 精品99一区二区三区| 日韩欧美一卡二卡| 欧美一区二区私人影院日本| 欧美性xxxxx极品少妇| 狠狠色丁香九九婷婷综合五月| 日本三级韩国三级欧美三级| 国产精品国产三级国产aⅴ入口| 国产性天天综合网| 国产农村妇女毛片精品久久麻豆|