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

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

?? pascalcompiler.cpp

?? C++ mfc 源代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
***memberof
***history
1.0.0 ; 1999.1.7 ; FZ ; Creation
***description
***notes
***uses
***var_in
***var_out
***err_out
***flags
***specifications
***documents
*/

void CPascalCompiler::TipRecord(TypeInfo& info)
{
	int temp = m_nVAdrel;	// conserve relative address
	m_nVAdrel = 0;
	if (NextToken() != TT_KW_RECORD)
		throw error(SET_EXPECTED, CString("record"));;
	while (1)
	{
		DeclCamp(info);
		int val = NextToken();
		if (val != ';')
		{
			PushBack();
			break;
		}
	}
	if (NextToken() != TT_KW_END)
		throw error(SET_EXPECTED, CString("end"));
	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::DeclCamp(TypeInfo&info)
{
	StringList list;
	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 secinfo;
	TipSimplu(secinfo);
	// si acum sa introducem un simbol pentru bullshit-ul de camp de record
	POSITION pos = list.GetHeadPosition ();
	while (pos!=NULL)
	{
		CString name = list.GetNext(pos);
		Symbol simb;
		simb.m_sName = name;
		simb.m_nClass = CT_VAR_RECORD_FIELD;
		simb.m_nType  = secinfo.m_nType ;
		simb.m_nDeplRec = m_nVAdrel;
		simb.m_ListaRec .RemoveAll();
		simb.m_ListaRec .AddTail(&info.m_VarList);	// legaturile spre variabilele care sunt de tipul record
		m_nVAdrel += secinfo.m_nSize ;
		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::TermenStatic(ExpStat &ct)
{
	double dResult = 1;
	CString sResult = _T("");
	int nResult = 1;
	int type = 0;
	ExpStat cres;
	int c;
	
	while (1)
	{
		FactorStatic(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;
			default:
				throw error(SET_INVALID_OP,CString(""));
			}

		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 TT_KW_DIV:
				nResult /= cres.m_nVal;
				break;
			case TT_KW_MOD:
				nResult %= cres.m_nVal;
				break;
			default:
				throw error(SET_INVALID_OP,CString("you can't divide two integers"));
			}
			break;
		case ET_STRING:
			throw error(SET_INVALID_OP,CString("You can't do that with strings"));
			break;
		default:
			sResult = cres.m_sVal;
			dResult = cres.m_dVal;
			nResult = cres.m_nVal;
			type = cres.m_nType;
		}

		int val = NextToken();
		if (val!='*' && val != '/' && val!=TT_KW_MOD && val != TT_KW_DIV)
		{
			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::FactorStatic(ExpStat &ct)
{
	int val = NextToken();
	if (val == TT_WORD)
	{
		// search for another constant
		Symbol simb;
		if (!RetreaveSymbol(GetStrValue(),simb))
			throw error(SET_GENERAL,CString("Constant expected"));
		if (simb.m_nClass!=CT_CONST)
			throw error(SET_GENERAL,CString("Constant expected"));
		ct = m_ListaConstante.GetAt (simb.m_Val);
		return;	// this can be only a constant
	}
	if (val == TT_INTEGER)
	{
		ct.m_nVal = (int) GetNumValue ();
		ct.m_nType = ET_INTEGER;
		return;
	}
	if (val == TT_REAL)
	{
		ct.m_dVal = GetNumValue ();
		ct.m_nType = ET_REAL;
		return;
	}
	if (val == TT_STRING)
	{
		ct.m_sVal = GetStrValue ();
		ct.m_nType = ET_STRING;
		return;
	}
	if (val == '(')
	{
		ExprStatica(ct);
		if (NextToken()!=')')
			throw error(SET_EXPECTED, CString(")"));
		return;
	}
	throw error(SET_EXPECTED, CString("Identifier or number or constant"));
}

/*
***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::Instr()
{
	int val = NextToken();
	switch (val)
	{
	case TT_KW_WHILE:
		{
			PushBack();
			InstrWhile();
			break;
		}
	case TT_KW_REPEAT:
		{
			PushBack();
			InstrRepeat();
			break;
		}
	case TT_KW_FOR:
		{
			PushBack();
			InstrFor();
			break;
		}
	case TT_KW_CASE:
		{
			PushBack();
			InstrCase();
			break;
		}
	case TT_KW_BEGIN:
		{
			PushBack();
			InstrCompusa();
			break;
		}
	case TT_KW_PRINT:
		{
			PushBack();
			InstrPrint();
			break;
		}
	case TT_KW_READ:
		{
			PushBack();
			InstrRead();
			break;
		}
	case TT_KW_IF:
		{
			PushBack();
			InstrIf();
			break;
		}
	case TT_WORD:
			if (IsProc(GetStrValue()))
			{
				PushBack();
				ApelProcedura();
			}
			else
			{
				PushBack();
				Atribuire();
			}
			break;
	default:		 
			throw error(SET_EXPECTED, CString("Instruction"));
	}
}

/*
***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::InsertSymbol(Symbol &s)
{
	Symbol simb;
	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);
}

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

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

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


void CPascalCompiler::Atribuire()
{
	// Variabila
	ExprType t1;
	ExprType t2;
	Variabila(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 )
		throw error(SET_GENERAL, CString("Trying to assign between different types"));
}

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

void CPascalCompiler::Variabila(ExprType &type)
{
	if (NextToken()!=TT_WORD)
		throw error(SET_EXPECTED, CString("identifier"));
	CString numevar = GetStrValue();
	int val	= NextToken();
	if (val=='[')
	{
		Expr(type);
		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;
		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 ;
		return;
	}
	else
		if (val=='.')
		{
			if (NextToken()!=TT_WORD)
				throw error(SET_EXPECTED, CString("identifier"));
			CString numecamp = GetStrValue();
			
			Symbol simb;
			if (!RetreaveSymbol(numevar,simb))
				throw error(SET_GENERAL,CString("Undeclared variable: ")+CString(numevar));
			if (simb.m_nClass!=CT_VAR_RECORD)
				throw error(SET_GENERAL,CString("Invalid variable usage: ")+CString(numevar));

			if (!RetreaveSymbol(numecamp,simb))
				throw error(SET_GENERAL,CString("Invalid record field: ")+CString(numecamp));
			if (simb.m_nClass!=CT_VAR_RECORD_FIELD)
				throw error(SET_GENERAL,CString("Invalid record field: ")+CString(numecamp));
			if (simb.m_ListaRec.Find(numevar)==NULL)
				throw error(SET_GENERAL,CString("Invalid record field: ")+CString(numecamp));
			type.m_nAtribLValue = LV_ADDRESS;
			type.m_nAtribTip = simb.m_nType ;
			return;
		}
		else
		{
			Symbol simb;
			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));
			if (simb.m_nClass == CT_FUNCTION)
				type.m_nAtribLValue = LV_VALUE;
			else
				type.m_nAtribLValue = LV_ADDRESS;
			type.m_nAtribTip = simb.m_nType ;
			PushBack();
		}
}


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

void CPascalCompiler::Expr(ExprType& type)
{
	ExprType 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"));
			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;
			break;
		case ET_STRING:
			if (type.m_nAtribTip != ET_STRING)
				throw error(SET_GENERAL,CString("Ivalid operation between incompatible Types"));
			if (c == '-')
				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 != '-')
		{
			PushBack();
			break;
		}
		c = val;
		et.m_nAtribLValue = LV_VALUE;
	}
	type = et;
}

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


void CPascalCompiler::Termen(ExprType& type)
{
	ExprType 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 || TT_KW_MOD)
				throw error(SET_GENERAL,CString("Ivalid operation With real numbers"));
			
			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 || TT_KW_MOD)
					throw error(SET_GENERAL,CString("Ivalid operation With real numbers"));
				et.m_nAtribTip = ET_REAL;
			}
			break;
		case ET_STRING:
			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;
	}
	type = et;
}

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

void CPascalCompiler::Factor(ExprType &type)
{
	int val = NextToken();
	if (val == TT_INTEGER)
	{
		type.m_nAtribLValue = LV_VALUE;
		type.m_nAtribTip = ET_INTEGER;
		return;
	}
	if (val == TT_REAL)
	{
		type.m_nAtribLValue = LV_VALUE;
		type.m_nAtribTip = ET_REAL;
		return;
	}
	if (val == TT_STRING)
	{
		type.m_nAtribLValue = LV_VALUE;
		type.m_nAtribTip = ET_STRING;
		return;
	}
	if (val == '(')
	{
		Expr(type);
		if (NextToken()!=')')
			throw error(SET_EXPECTED, CString(")"));
		return;
	}
	if (val == TT_WORD)
		if (IsFunc(GetStrValue()))
		{
			PushBack();
			ApelFunc(type);
			return;
		}
		else 
		{
			PushBack();
			Variabila(type);
			return;
		}
	
	throw error(SET_EXPECTED, CString("number or constant or identifier or function or variable "));;
}

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


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

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

void CPascalCompiler::ApelFunc(ExprType &type)
{
	if (NextToken()!=TT_WORD)
		throw error(SET_EXPECTED, CString("identifier"));
	Symbol simb;
	RetreaveSymbol(GetStrValue(),simb);
	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);
			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;
			}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲va国产va欧美va观看| 久久久久99精品国产片| 综合电影一区二区三区| 成人综合婷婷国产精品久久免费| 久久久久久久久岛国免费| 国产一区日韩二区欧美三区| 欧美精品一区二| 国产成人精品影院| 亚洲欧洲成人自拍| 欧美日韩一区在线| 久久国产生活片100| 国产色产综合产在线视频 | 亚洲成人第一页| 日韩午夜小视频| 国产福利精品一区| 椎名由奈av一区二区三区| 欧美日韩中文字幕一区| 美日韩一区二区| 中文字幕欧美日本乱码一线二线| 91在线视频观看| 水野朝阳av一区二区三区| 精品国产成人在线影院| 成人aa视频在线观看| 亚洲无人区一区| 久久精品人人做人人爽人人| 在线观看免费成人| 久久99精品网久久| 成人欧美一区二区三区1314 | 五月天中文字幕一区二区| 日韩欧美精品在线视频| 不卡区在线中文字幕| 亚洲18女电影在线观看| 国产亚洲成年网址在线观看| 欧美中文字幕一二三区视频| 久久黄色级2电影| 亚洲精品视频一区二区| 26uuu国产电影一区二区| 色综合咪咪久久| 国产一区二区三区精品视频| 午夜一区二区三区在线观看| 中文字幕免费不卡| 日韩一区二区在线看| 91浏览器入口在线观看| 精品亚洲成av人在线观看| 一区二区三区视频在线看| 久久久美女毛片| 欧美日本韩国一区二区三区视频 | 成人污视频在线观看| 五月婷婷综合在线| 亚洲视频一二三区| 久久久久99精品一区| 91精品国产高清一区二区三区 | 成人一级黄色片| 美女视频黄久久| 一二三区精品福利视频| 国产日韩视频一区二区三区| 7777精品久久久大香线蕉| 色天天综合久久久久综合片| 国产99久久久国产精品潘金| 精品一区精品二区高清| 日韩极品在线观看| 一区二区激情视频| 亚洲视频 欧洲视频| 国产日产欧美精品一区二区三区| 日韩一本二本av| 91精品国产综合久久小美女| 在线观看不卡一区| 91久久精品一区二区三区| 91在线视频免费91| 91网站视频在线观看| av激情综合网| av影院午夜一区| av资源站一区| 97精品视频在线观看自产线路二| 国产v日产∨综合v精品视频| 国产美女一区二区| 国产一区二区三区香蕉| 久久99久久99小草精品免视看| 日本中文字幕一区二区视频| 日本亚洲电影天堂| 精品一二三四区| 国产传媒日韩欧美成人| 成人激情小说网站| 99re热这里只有精品免费视频| 成人精品一区二区三区四区| 99久久er热在这里只有精品15| 99久久99久久综合| 欧美三级韩国三级日本三斤| 日本精品视频一区二区三区| 在线观看视频一区二区欧美日韩| 欧美亚洲免费在线一区| 3d成人h动漫网站入口| 日韩精品专区在线影院重磅| 欧美一区二区大片| www成人在线观看| 中文字幕一区在线| 亚洲最大成人网4388xx| 免费三级欧美电影| 国产乱码一区二区三区| 91丨porny丨国产入口| 欧美日韩国产色站一区二区三区| 欧美成人猛片aaaaaaa| 久久久激情视频| 亚洲女爱视频在线| 日韩主播视频在线| 国产一区二三区| 91蝌蚪porny| 日韩网站在线看片你懂的| 久久久777精品电影网影网| 亚洲女与黑人做爰| 老司机精品视频在线| 99久久精品久久久久久清纯| 欧美一区二区啪啪| 亚洲欧美在线aaa| 日本欧美在线观看| 99久久久精品| 欧美mv日韩mv亚洲| 曰韩精品一区二区| 国产在线看一区| 在线一区二区三区四区五区| 日韩欧美国产小视频| 国产精品第五页| 美女视频黄免费的久久 | 欧美日韩高清影院| 337p日本欧洲亚洲大胆精品| 亚洲午夜在线视频| 丰满岳乱妇一区二区三区| 欧美巨大另类极品videosbest | 日韩一区欧美二区| 成人一道本在线| 欧美一级高清片| 亚洲青青青在线视频| 精品中文字幕一区二区小辣椒| 一本色道**综合亚洲精品蜜桃冫 | 国产三级一区二区| 日本伊人午夜精品| 在线亚洲高清视频| 国产精品三级av在线播放| 老司机午夜精品| 欧美乱妇一区二区三区不卡视频| 国产精品久久毛片av大全日韩| 久久99热狠狠色一区二区| 欧美视频自拍偷拍| 综合激情网...| 成人午夜视频在线观看| 欧美成人一区二区三区片免费| 香蕉乱码成人久久天堂爱免费| 91麻豆国产福利在线观看| 国产欧美日韩麻豆91| 精品写真视频在线观看| 91精品免费观看| 午夜精品免费在线| 欧美日韩一区二区三区免费看| 亚洲欧洲无码一区二区三区| 国产激情视频一区二区在线观看| 日韩视频一区在线观看| 五月天丁香久久| 欧美亚洲日本一区| 亚洲国产视频一区二区| 在线欧美日韩国产| 亚洲综合色视频| 色狠狠综合天天综合综合| 亚洲欧美另类小说| 成人18精品视频| 亚洲欧洲精品天堂一级| 成人久久视频在线观看| 国产精品久久久久久久第一福利 | 亚洲综合图片区| 在线一区二区视频| 亚洲一区二区三区免费视频| 色婷婷久久99综合精品jk白丝| 亚洲三级在线看| 在线观看免费视频综合| 亚洲国产欧美日韩另类综合| 日本高清不卡一区| 五月婷婷另类国产| 日韩美女视频在线| 国产麻豆成人精品| 中文字幕国产精品一区二区| 成人aaaa免费全部观看| 亚洲精品一二三四区| 91国偷自产一区二区开放时间 | av欧美精品.com| 一区二区三区国产| 91精品国产乱| 国产美女精品在线| 中文字幕一区二区三区在线不卡 | 欧洲在线/亚洲| 亚洲精品视频在线观看网站| 欧美成人精精品一区二区频| 色久综合一二码| 久久亚洲免费视频| 国产.欧美.日韩| 亚洲天堂2016| 欧美精品久久一区二区三区| 国内成人免费视频| 亚洲免费成人av| 日韩精品一区二区三区四区视频| 国产电影精品久久禁18| 久久亚洲私人国产精品va媚药|