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

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

?? pascalcompiler.cpp

?? 袖珍型的pascal編譯器
?? CPP
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
// Function name	: CPascalCompiler::InsertSymbol
// Description	    : 
// Return type		: void 
// Argument         : Symbol *s
///////////////////////////////////////////////////////////////

void CPascalCompiler::InsertSymbol(Symbol *s)
{
	Symbol *simb=NULL;
	if (m_SymbTableCollection.RetreaveSymbolCL(s->m_sName,simb))
	{
		throw error(SET_GENERAL,CString(s->m_sName)+CString(" item is already declared "));
	}
	m_SymbTableCollection.InsertSymbol (s);
}


///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 5/28/99 6:37:10 PM
// Function name	: CPascalCompiler::IsProc
// Description	    : Check if the parameter is a procedure
// Return type		: BOOL 
// Argument         : CString &str
///////////////////////////////////////////////////////////////

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




///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 8/3/99 4:35:50 PM
// Function name	: CPascalCompiler::Atribuire
// Description	    : 
// Return type		: void 
///////////////////////////////////////////////////////////////

void CPascalCompiler::Atribuire()
{
	// Variabila
	ExprInfo t1;
	ExprInfo t2;
	VariabilaAdr(t1);
	if (NextToken()!=TT_IS)
		throw error(SET_EXPECTED, CString(":="));
	Expr(t2);
	if (t1.m_nAtribLValue == LV_VALUE)
		throw error(SET_GENERAL, CString("Invalid variable"));
	if (t1.m_nAtribTip != t2.m_nAtribTip )
	{
		if (!(t1.m_nAtribTip == ET_REAL && t2.m_nAtribTip !=ET_CHAR))
			throw error(SET_GENERAL, CString("Trying to assign between incompatible types"));
	}
	GenerateCode(INSTR_STO);
}



///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 5/27/99 7:13:38 PM
// Function name	: CPascalCompiler::Variabila
// Description	    : This proceses a variable for evaluation purposes, value is put on the stack
// Return type		: void 
// Argument         : ExprInfo &type
///////////////////////////////////////////////////////////////

void CPascalCompiler::Variabila(ExprInfo &type)
{
	if (NextToken()!=TT_WORD)
		throw error(SET_EXPECTED, CString("identifier"));
	CString numevar = GetStrValue();
	int val	= NextToken();
	if (val=='[')
	{
		// Matrix
		Expr(type);	// Puts the index of the matrix on the stack

		if (NextToken()!=']')
			throw error(SET_EXPECTED, CString("]"));
		if (type.m_nAtribTip != ET_INTEGER)
			throw error(SET_GENERAL,CString("Table must have integer index"));
		Symbol *simb = NULL;
		if (!RetreaveSymbol(numevar,simb))
			throw error(SET_GENERAL,CString("Undeclared variable: ")+CString(numevar));
		if (simb->m_nClass!=CT_VAR_ARRAY)
				throw error(SET_GENERAL,CString("Invalid variable usage: ")+CString(numevar));
		type.m_nAtribLValue = LV_ADDRESS;
		type.m_nAtribTip = simb->m_nType ;
		// Generate code
		// put the variable on the stack
		// the index is on the stack Lets move it to the RX register
		GenerateCode(INSTR_MVRX);
		// Now we can try to push the value on the stack
		// let us check the level of the value with the current level
		
		if (m_nVNivel == simb->m_nNivel )
		{
			// No Frame change needed
			GenerateCode(INSTR_LODIX,(OFFSET) (simb->m_nAdrel+m_nVNivel+1));
		}
		else
		{
			// Frame Change needed
			GenerateCode(INSTR_CHGSFP,(BYTE)simb->m_nNivel);
			GenerateCode(INSTR_LODIX,(OFFSET)(simb->m_nAdrel+simb->m_nNivel+1));
			// Remake the frame
			GenerateCode(INSTR_RSTSFP);
		}


		return;
	}
	else
		if (val=='.')
		{
			if (NextToken()!=TT_WORD)
				throw error(SET_EXPECTED, CString("identifier"));
			CString numecamp = GetStrValue();
			
			Symbol *simb1 = NULL,*simb2 = NULL;
			if (!RetreaveSymbol(numevar,simb1))
				throw error(SET_GENERAL,CString("Undeclared variable: ")+CString(numevar));
			if (simb1->m_nClass!=CT_VAR_RECORD)
				throw error(SET_GENERAL,CString("Invalid variable usage: ")+CString(numevar));

			if (!RetreaveSymbol(numecamp,simb2))
				throw error(SET_GENERAL,CString("Invalid record field: ")+CString(numecamp));
			if (simb2->m_nClass!=CT_VAR_RECORD_FIELD)
				throw error(SET_GENERAL,CString("Invalid record field: ")+CString(numecamp));
			if (simb2->m_ListaRec.Find(numevar)==NULL)
				throw error(SET_GENERAL,CString("Invalid record field: ")+CString(numecamp));

			type.m_nAtribLValue = LV_ADDRESS;
			type.m_nAtribTip = simb2->m_nType ;

			// Generate code for putting the shit on the stack

			if (m_nVNivel == simb1->m_nNivel )
			{
				// No Frame change needed
				GenerateCode(INSTR_LOD,(OFFSET) (simb1->m_nAdrel+simb2->m_nDeplRec +m_nVNivel+1));
			}
			else
			{
				// Frame Change needed
				GenerateCode(INSTR_CHGSFP,(BYTE)simb1->m_nNivel);
				GenerateCode(INSTR_LOD,(OFFSET)(simb1->m_nAdrel+simb1->m_nNivel + simb2->m_nDeplRec +1 ));
				// Remake the frame
				GenerateCode(INSTR_RSTSFP);
			}

			return;
		}
		else
		{
			Symbol *simb = NULL;
			if (!RetreaveSymbol(numevar,simb))
				throw error(SET_GENERAL,CString("Undeclared variable: ")+CString(numevar));
			if (simb->m_nClass!=CT_VAR_SIMP && 
				simb->m_nClass!=CT_PARAM_VAL && 
				simb->m_nClass!=CT_PARAM_ADR &&
				simb->m_nClass!=CT_CONST)
				throw error(SET_GENERAL,CString("Invalid variable : ")+CString(numevar));

			type.m_nAtribTip = simb->m_nType ;	
			if (simb->m_nClass==CT_CONST)
				{
					type.m_nAtribLValue = LV_VALUE;
					StackEntry entry;
					entry.m_nType = simb->m_nType;
					entry.m_Info = simb->m_Val ;
					GenerateCode(INSTR_LODI,entry);
				}
			
				type.m_nAtribLValue = LV_ADDRESS;
				// Generate code for normal stuff
				
				
				if (m_nVNivel != simb->m_nNivel)
					GenerateCode(INSTR_CHGSFP,(BYTE)simb->m_nNivel);

				Symbol *auxsimb = NULL;
				int np = 0;
				if (RetreaveSymbol(simb->m_sRelated,auxsimb))
					np = auxsimb->m_ListaPar.GetCount();
				switch (simb->m_nClass)
				{
				case CT_VAR_SIMP:
					GenerateCode(INSTR_LOD,(OFFSET) (simb->m_nAdrel+simb->m_nNivel+1));
					break;
				case CT_PARAM_VAL:
					GenerateCode(INSTR_LOD,(OFFSET) (simb->m_nAdrel-np -2));
					break;
				case CT_PARAM_ADR:
					GenerateCode(INSTR_LODEA,(OFFSET) (simb->m_nAdrel-np-2));
					break;

				}
				if (m_nVNivel != simb->m_nNivel)
					GenerateCode(INSTR_RSTSFP);

			PushBack();
		}
}





///////////////////////////////////////////////////////////////
// Programmer		: Zoly Farkas
// Creation Date	: 5/27/99 7:15:53 PM
// Function name	: CPascalCompiler::Variabila
// Description	    : This variable stuff is used for addressing purposes
//					: at the left side of a assignement, put's the address to the stack
// Return type		: void 
// Argument         : ExprInfo &type
// Argument         : REGISTER & address
// Argument         : int level
///////////////////////////////////////////////////////////////

void CPascalCompiler::VariabilaAdr(ExprInfo &type)
{
	// set default value for relative stuff

	if (NextToken()!=TT_WORD)
		throw error(SET_EXPECTED, CString("identifier"));
	CString numevar = GetStrValue();
	int val	= NextToken();
	if (val=='[')
	{
		// Matrix
		Expr(type);	// Puts the index of the matrix on the stack

		if (NextToken()!=']')
			throw error(SET_EXPECTED, CString("]"));
		if (type.m_nAtribTip != ET_INTEGER)
			throw error(SET_GENERAL,CString("Table must have integer index"));
		Symbol *simb = NULL;
		if (!RetreaveSymbol(numevar,simb))
			throw error(SET_GENERAL,CString("Undeclared variable: ")+CString(numevar));
		if (simb->m_nClass!=CT_VAR_ARRAY)
				throw error(SET_GENERAL,CString("Invalid variable usage: ")+CString(numevar));
		type.m_nAtribLValue = LV_ADDRESS;
		type.m_nAtribTip = simb->m_nType ;

		// prepare the addres and the level
		// This is only for arrays, they ca only be 
		GenerateCode(INSTR_MVRX);	// put the index result in RX register
		if (m_nVNivel == simb->m_nNivel )
		{
			// No Frame change needed
			GenerateCode(INSTR_LODAX,(OFFSET) (simb->m_nAdrel+m_nVNivel+1));
		}
		else
		{
			// Frame Change needed
			GenerateCode(INSTR_CHGSFP,(BYTE)simb->m_nNivel);
			GenerateCode(INSTR_LODAX,(OFFSET)(simb->m_nAdrel+simb->m_nNivel+1));
			// Remake the frame
			GenerateCode(INSTR_RSTSFP);
		}


		
		return;
	}
	else
		if (val=='.')
		{
			// REcord
			if (NextToken()!=TT_WORD)
				throw error(SET_EXPECTED, CString("identifier"));
			CString numecamp = GetStrValue();
			
			Symbol *simb1 = NULL,*simb2 = NULL;
			if (!RetreaveSymbol(numevar,simb1))
				throw error(SET_GENERAL,CString("Undeclared variable: ")+CString(numevar));
			if (simb1->m_nClass!=CT_VAR_RECORD)
				throw error(SET_GENERAL,CString("Invalid variable usage: ")+CString(numevar));

			if (!RetreaveSymbol(numecamp,simb2))
				throw error(SET_GENERAL,CString("Invalid record field: ")+CString(numecamp));
			if (simb2->m_nClass!=CT_VAR_RECORD_FIELD)
				throw error(SET_GENERAL,CString("Invalid record field: ")+CString(numecamp));
			if (simb2->m_ListaRec.Find(numevar)==NULL)
				throw error(SET_GENERAL,CString("Invalid record field: ")+CString(numecamp));
			type.m_nAtribLValue = LV_ADDRESS;
			type.m_nAtribTip = simb2->m_nType ;

			// now generate bulshit 
			if (m_nVNivel == simb1->m_nNivel )
			{
				// No Frame change needed
				GenerateCode(INSTR_LODA,(OFFSET) (simb1->m_nAdrel+simb2->m_nDeplRec +m_nVNivel+1));
			}
			else
			{
				// Frame Change needed
				GenerateCode(INSTR_CHGSFP,(BYTE)simb1->m_nNivel);
				GenerateCode(INSTR_LODA,(OFFSET)(simb1->m_nAdrel+simb1->m_nNivel + simb2->m_nDeplRec +1 ));
				// Remake the frame
				GenerateCode(INSTR_RSTSFP);
			}		
			return;
		}
		else
		{
			Symbol *simb = NULL;
			if (!RetreaveSymbol(numevar,simb))
				throw error(SET_GENERAL,CString("Undeclared variable: ")+CString(numevar));
			if (simb->m_nClass!=CT_VAR_SIMP && 
				simb->m_nClass!=CT_PARAM_VAL && 
				simb->m_nClass!=CT_PARAM_ADR &&
				simb->m_nClass!=CT_FUNCTION)
				throw error(SET_GENERAL,CString("Invalid variable : ")+CString(numevar));
				type.m_nAtribLValue = LV_ADDRESS;
				type.m_nAtribTip = simb->m_nType ;

				if (m_nVNivel != simb->m_nNivel)
					GenerateCode(INSTR_CHGSFP,(BYTE)simb->m_nNivel);

				Symbol *auxsimb = NULL ;
				int np;
				if (RetreaveSymbol(simb->m_sRelated,auxsimb))
					np = auxsimb->m_ListaPar.GetCount();
				switch (simb->m_nClass)
				{
				case CT_VAR_SIMP:
					GenerateCode(INSTR_LODA,(OFFSET) (simb->m_nAdrel+simb->m_nNivel+1));
					break;
				case CT_PARAM_VAL:
					GenerateCode(INSTR_LODA,(OFFSET) (simb->m_nAdrel-np -2));
					break;
				case CT_PARAM_ADR:
					GenerateCode(INSTR_LOD,(OFFSET) (simb->m_nAdrel-np-2));
					break;
				case CT_FUNCTION:
					// the return value of the function
					if (m_pCurentBlock != simb)
						throw error(SET_GENERAL,CString("Invalid instruction !!!"));
					GenerateCode(INSTR_LODA,(OFFSET) (-(simb->m_ListaPar.GetCount() + 2)));
					break;

				}
				if (m_nVNivel != simb->m_nNivel)
					GenerateCode(INSTR_RSTSFP);

			PushBack();
		}
}









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

void CPascalCompiler::Expr(ExprInfo& type)
{
	ExprInfo et;
	int c='+';
	while (1)
	{
		Termen(type);
		switch (et.m_nAtribTip)	// tipul termenului precedent
		{
		case ET_REAL:
			if (type.m_nAtribTip !=ET_REAL && type.m_nAtribTip !=ET_INTEGER)
				throw error(SET_GENERAL,CString("Ivalid operation between incompatible Types"));
			// Generate code 
			if (c == '+')
				GenerateCode(INSTR_ADD);
			else 
				GenerateCode(INSTR_SUB);
			break;
		case ET_INTEGER:
			if (type.m_nAtribTip !=ET_REAL && type.m_nAtribTip !=ET_INTEGER)
				throw error(SET_GENERAL,CString("Ivalid operation between incompatible Types"));
			if (type.m_nAtribTip == ET_REAL)
				et.m_nAtribTip = ET_REAL;
			// Generate code
			if (c == '+')
				GenerateCode(INSTR_ADD);
			else 
				GenerateCode(INSTR_SUB);

			break;
		case ET_CHAR:
			if (type.m_nAtribTip != ET_CHAR)
				throw error(SET_GENERAL,CString("Ivalid operation between incompatible Types"));
			// Generate code
			if (c == '+')
				GenerateCode(INSTR_ADD);
			else 
				GenerateCode(INSTR_SUB);

			break;
		default:
			et.m_nAtribTip  = type.m_nAtribTip ;
			et.m_nAtribLValue = type.m_nAtribLValue ;
		}
		int val = NextToken();
		if (val!='+' && val != '-')
		{
			PushBack();
			break;
		}
		c = val;
		et.m_nAtribLValue = LV_VALUE;
	}
	
	type = et;
}




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

void CPascalCompiler::Termen(ExprInfo& type)
{
	ExprInfo et;
	int c ='*';

	while (1)
	{
		Factor(type);
		switch (et.m_nAtribTip)	// tipul termenului precedent
		{
		case ET_REAL:
			if (type.m_nAtribTip !=ET_REAL && type.m_nAtribTip !=ET_INTEGER)
				throw error(SET_GENERAL,CString("Ivalid operation between incompatible Types"));
			if (c == TT_KW_MOD )
				throw error(SET_GENERAL,CString("Ivalid operation With real numbers"));
			
			// Generate code
			if (c == TT_KW_MOD)
				GenerateCode(INSTR_MOD);
			if (c == TT_KW_DIV)
				GenerateCode(INSTR_DIV);
			if (c == '/')
				GenerateCode(INSTR_DIV);
			if (c == '*')
				GenerateCode(INSTR_MUL);
			
			
			break;
		case ET_INTEGER:
			if (type.m_nAtribTip !=ET_REAL && type.m_nAtribTip !=ET_INTEGER)
				throw error(SET_GENERAL,CString("Ivalid operation between incompatible Types"));
			if (type.m_nAtribTip == ET_REAL)
			{
				if (c == TT_KW_MOD)
					throw error(SET_GENERAL,CString("Ivalid operation With real numbers"));
				et.m_nAtribTip = ET_REAL;
			}
			// Generate code
			if (c == TT_KW_MOD)
				GenerateCode(INSTR_MOD);
			if (c == TT_KW_DIV)
				GenerateCode(INSTR_DIV);
			if (c == '/')
				GenerateCode(INSTR_DIV);
			if (c == '*')
				GenerateCode(INSTR_MUL);

			break;
		case ET_CHAR:
			throw error(SET_GENERAL,CString("Ivalid operation with Strings"));
			break;
		default:
			et.m_nAtribTip  = type.m_nAtribTip ;
			et.m_nAtribLValue = type.m_nAtribLValue ;
		}

		int val = NextToken();
		if (val!='*' && val != '/' && val!=TT_KW_MOD && val != TT_KW_DIV)
		{
			PushBack();
			break;
		}
		et.m_nAtribLValue = LV_VALUE;
		c = val;
	}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产天堂| 一区视频在线播放| 日韩精品中文字幕一区| 欧美精品123区| 5858s免费视频成人| 欧美区视频在线观看| 欧美日韩视频一区二区| 欧美人狂配大交3d怪物一区| 欧美丝袜自拍制服另类| 欧美精品三级日韩久久| 欧美一区二区三区免费大片 | 一本大道综合伊人精品热热| 国产宾馆实践打屁股91| 成人午夜激情影院| 不卡av在线网| 欧美视频一区二区在线观看| 欧美浪妇xxxx高跟鞋交| 欧美一级黄色录像| 国产亚洲污的网站| 日韩一区有码在线| 亚洲成av人片在线| 裸体健美xxxx欧美裸体表演| 国产在线一区观看| 成人小视频免费观看| 91丨国产丨九色丨pron| 欧美性感一类影片在线播放| 日韩欧美国产精品| 国产欧美一区二区精品性色超碰 | 精品一区二区三区香蕉蜜桃 | 国产精品18久久久久久久久久久久 | 亚洲午夜日本在线观看| 日本最新不卡在线| 国产精品一区免费视频| 99精品热视频| 欧美精品 日韩| 2020日本不卡一区二区视频| 国产精品久久二区二区| 亚洲一区二区三区四区五区中文| 五月天婷婷综合| 国产精品一二三四五| 一本色道久久综合亚洲aⅴ蜜桃| 在线播放国产精品二区一二区四区 | 欧美午夜寂寞影院| 欧美精品一区二区在线观看| 国产精品久久久久久一区二区三区| 不卡欧美aaaaa| 91精品国产综合久久蜜臀| 久久精品人人做| 午夜精品久久久久久久久久久| 久久99精品久久久久婷婷| 一本到一区二区三区| 精品国产青草久久久久福利| 亚洲精品成人在线| 国产在线观看一区二区| 欧美网站一区二区| 国产欧美日韩亚州综合| 偷拍亚洲欧洲综合| www.日韩av| 精品久久久久久久久久久久久久久 | 日韩电影在线免费观看| 成人丝袜18视频在线观看| 欧美一级午夜免费电影| 亚洲三级视频在线观看| 国产一区二区三区精品欧美日韩一区二区三区 | 99精品欧美一区二区三区小说 | 91精品久久久久久久99蜜桃| 中文字幕中文字幕一区二区| 精品制服美女丁香| 欧美写真视频网站| 国产精品久久网站| 激情深爱一区二区| 欧美高清视频一二三区 | 国产盗摄一区二区三区| 欧美日韩高清在线| 亚洲色图欧美在线| 福利一区二区在线| 欧美mv和日韩mv国产网站| 午夜一区二区三区视频| 99久久国产综合精品色伊| 久久久蜜臀国产一区二区| 日韩激情一二三区| 欧美午夜不卡视频| 亚洲黄色片在线观看| k8久久久一区二区三区| 国产亚洲欧美在线| 国内久久精品视频| 日韩欧美美女一区二区三区| 亚洲高清不卡在线| 在线免费观看日本一区| 成人免费视频视频| 久久综合五月天婷婷伊人| 蜜桃免费网站一区二区三区| 欧美日韩成人在线| 亚洲成国产人片在线观看| 在线观看视频一区二区| 亚洲精品老司机| 欧美在线999| 亚洲国产一区二区a毛片| 91精品办公室少妇高潮对白| 亚洲欧美电影一区二区| 91蝌蚪porny| 亚洲男人的天堂av| 欧美系列在线观看| 日韩精品亚洲一区二区三区免费| 欧美日韩黄色影视| 日韩av在线发布| 日韩欧美三级在线| 国产精品一区免费视频| 国产午夜精品一区二区三区嫩草 | 欧洲国产伦久久久久久久| 亚洲精品乱码久久久久久| 欧洲另类一二三四区| 亚洲第一精品在线| 日韩欧美国产午夜精品| 黄色小说综合网站| 中文字幕av一区 二区| av男人天堂一区| 一区二区三区四区精品在线视频 | 亚洲欧美日韩成人高清在线一区| 91麻豆国产香蕉久久精品| 亚洲图片一区二区| 日韩欧美高清dvd碟片| 国产一区二区三区免费| 中文字幕欧美日韩一区| 色婷婷狠狠综合| 图片区小说区国产精品视频| 精品国内片67194| 成人深夜福利app| 亚洲香蕉伊在人在线观| 欧美一级片在线| 国产成人啪午夜精品网站男同| 中文字幕一区二区三区不卡| 欧美日韩中文国产| 国产一区二区三区久久悠悠色av| 国产精品久久久久久久久快鸭 | 亚洲国产精品影院| 精品国产乱子伦一区| 99国产精品国产精品久久| 午夜欧美一区二区三区在线播放| 欧美成人精品福利| 97久久久精品综合88久久| 三级成人在线视频| 国产精品日韩精品欧美在线| 欧美在线影院一区二区| 韩日精品视频一区| 亚洲摸摸操操av| 日韩免费电影一区| 色综合中文综合网| 欧美丰满一区二区免费视频| 国产一区福利在线| 亚洲综合视频网| 久久久亚洲综合| 欧美日韩大陆一区二区| 粉嫩嫩av羞羞动漫久久久| 午夜精品影院在线观看| 久久网站最新地址| 亚洲精品视频在线观看网站| 日韩精品一区国产麻豆| 日本久久一区二区| 国产在线麻豆精品观看| 亚洲一区二区在线观看视频| 国产亚洲精久久久久久| 欧美色国产精品| 懂色av中文一区二区三区| 日韩成人免费电影| 亚洲精品国产成人久久av盗摄| 亚洲精品一区二区在线观看| 欧美图区在线视频| 99久久婷婷国产综合精品| 久久精品国产一区二区| 亚洲成人免费av| 亚洲欧美综合在线精品| 国产夜色精品一区二区av| 日韩一区二区三区av| 欧美这里有精品| 91美女片黄在线观看91美女| 国产麻豆日韩欧美久久| 麻豆91在线播放| 日本中文字幕一区二区视频 | 美女国产一区二区| 亚洲国产精品久久人人爱蜜臀| 日本一区二区成人| 久久久国产精华| 亚洲精品在线观看网站| 欧美二区三区91| 在线观看亚洲一区| 91在线国产观看| 成人app下载| 成人国产一区二区三区精品| 国产一区二区电影| 国产一区二区调教| 激情图区综合网| 国产美女一区二区三区| 精品在线免费观看| 久88久久88久久久| 另类小说欧美激情| 狠狠久久亚洲欧美| 国产酒店精品激情| 国产高清精品久久久久| 国产成人在线网站|