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

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

?? pl0.c

?? pl0編譯原理源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
/*
 * PL/0 complier program for win32 platform (implemented in C)
 *
 * The program has been test on Visual C++ 6.0, Visual C++.NET and
 * Visual C++.NET 2003, on Win98, WinNT, Win2000, WinXP and Win2003
 *
 * 使用方法:
 * 運(yùn)行后輸入PL/0源程序文件? * 回答是否輸出虛擬機(jī)代碼
 * 回答是否輸出名字表
 * fa.tmp輸出虛擬機(jī)代碼
 * fa1.tmp輸出源文件及其各行對(duì)應(yīng)的首地址
 * fa2.tmp輸出結(jié)? * fas.tmp輸出名字表
 */

#include <stdio.h>

#include "pl0.h"
#include "string.h"

/* 解釋執(zhí)行時(shí)使用的棧 */
#define stacksize 500


int main()
{
	bool nxtlev[symnum];

	printf("Input pl/0 file?   ");
	scanf("%s", fname);     /* 輸入文件名 */

	fin = fopen(fname, "r");

	if (fin)
	{
		printf("List object code?(Y/N)");   /* 是否輸出虛擬機(jī)代碼 */
		scanf("%s", fname);
		listswitch = (fname[0]=='y' || fname[0]=='Y');

		printf("List symbol table?(Y/N)");  /* 是否輸出名字表 */
		scanf("%s", fname);
		tableswitch = (fname[0]=='y' || fname[0]=='Y');

		fa1 = fopen("fa1.tmp", "w");
		fprintf(fa1,"Input pl/0 file?   ");
		fprintf(fa1,"%s\n",fname);

		init();     /* 初始化 */

		err = 0;
		cc = cx = ll = 0;
		ch = ' ';

		if(-1 != getsym())
		{
			fa = fopen("fa.tmp", "w");
			fas = fopen("fas.tmp", "w");
			addset(nxtlev, declbegsys, statbegsys, symnum);
			nxtlev[period] = true;

			if(-1 == block(0, 0, nxtlev))   /* 調(diào)用編譯程序 */
			{
				fclose(fa);
				fclose(fa1);
				fclose(fas);
				fclose(fin);
				printf("\n");
				return 0;
			}
			fclose(fa);
			fclose(fa1);
			fclose(fas);

			if (sym != period)
			{
				error(9);
			}

			if (err == 0)
			{
				fa2 = fopen("fa2.tmp", "w");
				interpret();    /* 調(diào)用解釋執(zhí)行程序 */
				fclose(fa2);
			}
			else
			{
				printf("Errors in pl/0 program");
			}
		}

		fclose(fin);
	}
	else
	{
		printf("Can't open file!\n");
	}

	printf("\n");
	return 0;
}

/*
* 初始化
*/
void init()
{
	int i;

	/* 設(shè)置單字符符號(hào) */
	for (i=0; i<=255; i++)
	{
		ssym[i] = nul;
	}
	ssym['+'] = plus;
	ssym['-'] = minus;
	ssym['*'] = times;
	ssym['/'] = slash;
	ssym['('] = lparen;
	ssym[')'] = rparen;
	ssym['='] = eql;
	ssym[','] = comma;
	ssym['.'] = period;
	ssym['#'] = neq;
	ssym[';'] = semicolon;

	/* 設(shè)置保留字名字,按照字母順序,便于折半查找 */
	strcpy(&(word[0][0]), "begin");
	strcpy(&(word[1][0]), "call");
	strcpy(&(word[2][0]), "const");
	strcpy(&(word[3][0]), "do");
	strcpy(&(word[4][0]), "end");
	strcpy(&(word[5][0]), "if");
	strcpy(&(word[6][0]), "odd");
	strcpy(&(word[7][0]), "procedure");
	strcpy(&(word[8][0]), "read");
	strcpy(&(word[9][0]), "then");
	strcpy(&(word[10][0]), "var");
	strcpy(&(word[11][0]), "while");
	strcpy(&(word[12][0]), "write");

	/* 設(shè)置保留字符號(hào) */
	wsym[0] = beginsym;
	wsym[1] = callsym;
	wsym[2] = constsym;
	wsym[3] = dosym;
	wsym[4] = endsym;
	wsym[5] = ifsym;
	wsym[6] = oddsym;
	wsym[7] = procsym;
	wsym[8] = readsym;
	wsym[9] = thensym;
	wsym[10] = varsym;
	wsym[11] = whilesym;
	wsym[12] = writesym;

	/* 設(shè)置指令名稱 */
	strcpy(&(mnemonic[lit][0]), "lit");
	strcpy(&(mnemonic[opr][0]), "opr");
	strcpy(&(mnemonic[lod][0]), "lod");
	strcpy(&(mnemonic[sto][0]), "sto");
	strcpy(&(mnemonic[cal][0]), "cal");
	strcpy(&(mnemonic[inte][0]), "int");
	strcpy(&(mnemonic[jmp][0]), "jmp");
	strcpy(&(mnemonic[jpc][0]), "jpc");

	/* 設(shè)置符號(hào)集 */
	for (i=0; i<symnum; i++)
	{
		declbegsys[i] = false;
		statbegsys[i] = false;
		facbegsys[i] = false;
	}

	/* 設(shè)置聲明開始符號(hào)集 */
	declbegsys[constsym] = true;
	declbegsys[varsym] = true;
	declbegsys[procsym] = true;

	/* 設(shè)置語句開始符號(hào)集 */
	statbegsys[beginsym] = true;
	statbegsys[callsym] = true;
	statbegsys[ifsym] = true;
	statbegsys[whilesym] = true;

	/* 設(shè)置因子開始符號(hào)集 */
	facbegsys[ident] = true;
	facbegsys[number] = true;
	facbegsys[lparen] = true;
}

/*
* 用數(shù)組實(shí)現(xiàn)集合的集合運(yùn)算
*/
int inset(int e, bool* s)
{
	return s[e];
}

int addset(bool* sr, bool* s1, bool* s2, int n)
{
	int i;
	for (i=0; i<n; i++)
	{
		sr[i] = s1[i]||s2[i];
	}
	return 0;
}

int subset(bool* sr, bool* s1, bool* s2, int n)
{
	int i;
	for (i=0; i<n; i++)
	{
		sr[i] = s1[i]&&(!s2[i]);
	}
	return 0;
}

int mulset(bool* sr, bool* s1, bool* s2, int n)
{
	int i;
	for (i=0; i<n; i++)
	{
		sr[i] = s1[i]&&s2[i];
	}
	return 0;
}

/*
*   出錯(cuò)處理,打印出錯(cuò)位置和錯(cuò)誤編碼
*/
void error(int n)
{
	char space[81];
	memset(space,32,81);

	space[cc-1]=0; //出錯(cuò)時(shí)當(dāng)前符號(hào)已經(jīng)讀完,所以cc-1

	printf("****%s!%d\n", space, n);
	fprintf(fa1,"****%s!%d\n", space, n);

	err++;
}

/*
* 漏掉空格,讀取一個(gè)字符。
*
* 每次讀一行,存入line緩沖區(qū),line被getsym取空后再讀一行
*
* 被函數(shù)getsym調(diào)用。
*/
int getch()
{
	if (cc == ll)
	{
		if (feof(fin))
		{
			printf("program incomplete");
			return -1;
		}
		ll=0;
		cc=0;
		printf("%d ", cx);
		fprintf(fa1,"%d ", cx);
		ch = ' ';
		while (ch != 10)
		{
			//fscanf(fin,"%c", &ch)
			//richard
			if (EOF == fscanf(fin,"%c", &ch))
			{
				line[ll] = 0;
				break;
			}
			//end richard
			printf("%c", ch);
			fprintf(fa1, "%c", ch);
			line[ll] = ch;
			ll++;
		}
		printf("\n");
		fprintf(fa1, "\n");
	}
	ch = line[cc];
	cc++;
	return 0;
}

/*
* 詞法分析,獲取一個(gè)符號(hào)
*/
int getsym()
{
	int i,j,k;

	/* the original version lacks "\r", thanks to foolevery */
	while (ch==' ' || ch==10 || ch==13 || ch==9)  /* 忽略空格、換行、回車和TAB */
	{
		getchdo;
	}
	if (ch>='a' && ch<='z')
	{           /* 名字或保留字以a..z開頭 */
		k = 0;
		do {
			if(k<al)
			{
				a[k] = ch;
				k++;
			}
			getchdo;
		} while (ch>='a' && ch<='z' || ch>='0' && ch<='9');
		a[k] = 0;
		strcpy(id, a);
		i = 0;
		j = norw-1;
		do {    /* 搜索當(dāng)前符號(hào)是否為保留字 */
			k = (i+j)/2;
			if (strcmp(id,word[k]) <= 0)
			{
				j = k - 1;
			}
			if (strcmp(id,word[k]) >= 0)
			{
				i = k + 1;
			}
		} while (i <= j);
		if (i-1 > j)
		{
			sym = wsym[k];
		}
		else
		{
			sym = ident; /* 搜索失敗則,是名字或數(shù)字 */
		}
	}
	else
	{
		if (ch>='0' && ch<='9')
		{           /* 檢測(cè)是否為數(shù)字:以0..9開頭 */
			k = 0;
			num = 0;
			sym = number;
			do {
				num = 10*num + ch - '0';
				k++;
				getchdo;
			} while (ch>='0' && ch<='9'); /* 獲取數(shù)字的值 */
			k--;
			if (k > nmax)
			{
				error(30);
			}
		}
		else
		{
			if (ch == ':')      /* 檢測(cè)賦值符號(hào) */
			{
				getchdo;
				if (ch == '=')
				{
					sym = becomes;
					getchdo;
				}
				else
				{
					sym = nul;  /* 不能識(shí)別的符號(hào) */
				}
			}
			else
			{
				if (ch == '<')      /* 檢測(cè)小于或小于等于符號(hào) */
				{
					getchdo;
					if (ch == '=')
					{
						sym = leq;
						getchdo;
					}
					else
					{
						sym = lss;
					}
				}
				else
				{
					if (ch=='>')        /* 檢測(cè)大于或大于等于符號(hào) */
					{
						getchdo;
						if (ch == '=')
						{
							sym = geq;
							getchdo;
						}
						else
						{
							sym = gtr;
						}
					}
					else
					{
						sym = ssym[ch];     /* 當(dāng)符號(hào)不滿足上述條件時(shí),全部按照單字符符號(hào)處理 */
						//getchdo;
						//richard
						if (sym != period)
						{
							getchdo;
						}
						//end richard
					}
				}
			}
		}
	}
	return 0;
}

/*
* 生成虛擬機(jī)代碼
*
* x: instruction.f;
* y: instruction.l;
* z: instruction.a;
*/
int gen(enum fct x, int y, int z )
{
	if (cx >= cxmax)
	{
		printf("Program too long"); /* 程序過長 */
		return -1;
	}
	code[cx].f = x;
	code[cx].l = y;
	code[cx].a = z;
	cx++;
	return 0;
}


/*
* 測(cè)試當(dāng)前符號(hào)是否合法
*
* 在某一部分(如一條語句,一個(gè)表達(dá)式)將要結(jié)束時(shí)時(shí)我們希望下一個(gè)符號(hào)屬于某集?* (該部分的后跟符號(hào)),test負(fù)責(zé)這項(xiàng)檢測(cè),并且負(fù)責(zé)當(dāng)檢測(cè)不通過時(shí)的補(bǔ)救措施,
* 程序在需要檢測(cè)時(shí)指定當(dāng)前需要的符號(hào)集合和補(bǔ)救用的集合(如之前未完成部分的后跟
* 符號(hào)),以及檢測(cè)不通過時(shí)的錯(cuò)誤號(hào)。
*
* s1:   我們需要的符號(hào)
* s2:   如果不是我們需要的,則需要一個(gè)補(bǔ)救用的集?* n:    錯(cuò)誤號(hào)
*/
int test(bool* s1, bool* s2, int n)
{
	if (!inset(sym, s1))
	{
		error(n);
		/* 當(dāng)檢測(cè)不通過時(shí),不停獲取符號(hào),直到它屬于需要的集合或補(bǔ)救的集合 */
		while ((!inset(sym,s1)) && (!inset(sym,s2)))
		{
			getsymdo;
		}
	}
	return 0;
}

/*
* 編譯程序主?*
* lev:    當(dāng)前分程序所在層
* tx:     名字表當(dāng)前尾指針
* fsys:   當(dāng)前模塊后跟符號(hào)集?*/
int block(int lev, int tx, bool* fsys)
{
	int i;

	int dx;                 /* 名字分配到的相對(duì)地址 */
	int tx0;                /* 保留初始tx */
	int cx0;                /* 保留初始cx */
	bool nxtlev[symnum];    /* 在下級(jí)函數(shù)的參數(shù)中,符號(hào)集合均為值參,但由于使用數(shù)組實(shí)現(xiàn),
							傳遞進(jìn)來的是指針,為防止下級(jí)函數(shù)改變上級(jí)函數(shù)的集合,開辟新的空?							傳遞給下級(jí)函數(shù)*/

	dx = 3;
	tx0 = tx;               /* 記錄本層名字的初始位置 */
	table[tx].adr = cx;

	gendo(jmp, 0, 0);

	if (lev > levmax)
	{
		error(32);
	}

	do {

		if (sym == constsym)    /* 收到常量聲明符號(hào),開始處理常量聲明 */
		{
			getsymdo;

			/* the original do...while(sym == ident) is problematic, thanks to calculous */
			/* do { */
			constdeclarationdo(&tx, lev, &dx);  /* dx的值會(huì)被constdeclaration改變,使用指針 */
			while (sym == comma)
			{
				getsymdo;
				constdeclarationdo(&tx, lev, &dx);
			}
			if (sym == semicolon)
			{
				getsymdo;
			}
			else
			{
				error(5);   /*漏掉了逗號(hào)或者分號(hào)*/
			}
			/* } while (sym == ident); */
		}

		if (sym == varsym)      /* 收到變量聲明符號(hào),開始處理變量聲明 */
		{
			getsymdo;

			/* the original do...while(sym == ident) is problematic, thanks to calculous */
			/* do {  */
			vardeclarationdo(&tx, lev, &dx);
			while (sym == comma)
			{
				getsymdo;
				vardeclarationdo(&tx, lev, &dx);
			}
			if (sym == semicolon)
			{
				getsymdo;
			}
			else
			{
				error(5);
			}
			/* } while (sym == ident);  */
		}

		while (sym == procsym) /* 收到過程聲明符號(hào),開始處理過程聲明 */
		{
			getsymdo;

			if (sym == ident)
			{
				enter(procedur, &tx, lev, &dx); /* 記錄過程名字 */
				getsymdo;
			}
			else
			{
				error(4);   /* procedure后應(yīng)為標(biāo)識(shí)符 */
			}

			if (sym == semicolon)
			{
				getsymdo;
			}
			else
			{
				error(5);   /* 漏掉了分號(hào) */
			}

			memcpy(nxtlev, fsys, sizeof(bool)*symnum);
			nxtlev[semicolon] = true;
			if (-1 == block(lev+1, tx, nxtlev))
			{
				return -1;  /* 遞歸調(diào)用 */
			}

			if(sym == semicolon)
			{
				getsymdo;
				memcpy(nxtlev, statbegsys, sizeof(bool)*symnum);
				nxtlev[ident] = true;
				nxtlev[procsym] = true;
				testdo(nxtlev, fsys, 6);
			}
			else
			{
				error(5);   /* 漏掉了分號(hào) */
			}
		}
		memcpy(nxtlev, statbegsys, sizeof(bool)*symnum);
		nxtlev[ident] = true;
		testdo(nxtlev, declbegsys, 7);
	} while (inset(sym, declbegsys));   /* 直到?jīng)]有聲明符號(hào) */

	code[table[tx0].adr].a = cx;    /* 開始生成當(dāng)前過程代碼 */
	table[tx0].adr = cx;            /* 當(dāng)前過程代碼地址 */
	table[tx0].size = dx;           /* 聲明部分中每增加一條聲明都會(huì)給dx增加1,聲明部分已經(jīng)結(jié)束,dx就是當(dāng)前過程數(shù)據(jù)的size */
	cx0 = cx;
	gendo(inte, 0, dx);             /* 生成分配內(nèi)存代碼 */

	if (tableswitch)        /* 輸出名字表 */
	{
		printf("TABLE:\n");
		if (tx0+1 > tx)
		{
			printf("    NULL\n");
		}
		for (i=tx0+1; i<=tx; i++)
		{
			switch (table[i].kind)
			{
			case constant:
				printf("    %d const %s ", i, table[i].name);
				printf("val=%d\n", table[i].val);
				fprintf(fas, "    %d const %s ", i, table[i].name);
				fprintf(fas, "val=%d\n", table[i].val);
				break;
			case variable:
				printf("    %d var   %s ", i, table[i].name);
				printf("lev=%d addr=%d\n", table[i].level, table[i].adr);
				fprintf(fas, "    %d var   %s ", i, table[i].name);
				fprintf(fas, "lev=%d addr=%d\n", table[i].level, table[i].adr);
				break;
			case procedur:
				printf("    %d proc  %s ", i, table[i].name);
				printf("lev=%d addr=%d size=%d\n", table[i].level, table[i].adr, table[i].size);
				fprintf(fas,"    %d proc  %s ", i, table[i].name);
				fprintf(fas,"lev=%d addr=%d size=%d\n", table[i].level, table[i].adr, table[i].size);
				break;
			}
		}
		printf("\n");
	}

	/* 語句后跟符號(hào)為分號(hào)或end */
	memcpy(nxtlev, fsys, sizeof(bool)*symnum);  /* 每個(gè)后跟符號(hào)集和都包含上層后跟符號(hào)集和,以便補(bǔ)救 */
	nxtlev[semicolon] = true;
	nxtlev[endsym] = true;
	statementdo(nxtlev, &tx, lev);
	gendo(opr, 0, 0);                       /* 每個(gè)過程出口都要使用的釋放數(shù)據(jù)段指令 */
	memset(nxtlev, 0, sizeof(bool)*symnum); /*分程序沒有補(bǔ)救集合 */
	testdo(fsys, nxtlev, 8);                /* 檢測(cè)后跟符號(hào)正確性 */
	listcode(cx0);                          /* 輸出代碼 */
	return 0;
}

/*
* 在名字表中加入一項(xiàng)
*
* k:      名字種類const,var or procedure
* ptx:    名字表尾指針的指針,為了可以改變名字表尾指針的值
* lev:    名字所在的層次,,以后所有的lev都是這樣
* pdx:    dx為當(dāng)前應(yīng)分配的變量的相對(duì)地址,分配后要增加1
*/
void enter(enum object k, int* ptx, int lev, int* pdx)
{
	(*ptx)++;
	strcpy(table[(*ptx)].name, id); /* 全局變量id中已存有當(dāng)前名字的名字 */
	table[(*ptx)].kind = k;
	switch (k)
	{
	case constant:  /* 常量名字 */
		if (num > amax)
		{
			error(31);  /* 數(shù)越界 */
			num = 0;
		}
		table[(*ptx)].val = num;
		break;
	case variable:  /* 變量名字 */
		table[(*ptx)].level = lev;
		table[(*ptx)].adr = (*pdx);
		(*pdx)++;
		break;
	case procedur:  /* 過程名字 */
		table[(*ptx)].level = lev;
		break;
	}
}

/*
* 查找名字的位置.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美大片日本大片免费观看| 欧美一a一片一级一片| 国产精品第一页第二页第三页| 欧美亚洲日本国产| 国产一区二区在线看| 亚洲国产成人av好男人在线观看| 精品国产免费一区二区三区香蕉| 在线观看免费亚洲| 不卡av免费在线观看| 麻豆国产欧美日韩综合精品二区 | 精品理论电影在线观看| 91黄色激情网站| 91精品综合久久久久久| 91小视频免费观看| 国产在线麻豆精品观看| 日韩国产高清影视| 成人中文字幕合集| 日韩一级视频免费观看在线| 99久久久久久| 国产美女在线精品| 午夜成人免费视频| 亚洲一线二线三线视频| 中文字幕亚洲一区二区va在线| 欧美成人a∨高清免费观看| 欧美三级三级三级爽爽爽| 91在线免费视频观看| 国产成人精品亚洲日本在线桃色 | 欧美一区二区福利在线| 91成人网在线| 色婷婷久久久亚洲一区二区三区 | 日韩欧美国产成人一区二区| 欧美三级电影精品| 欧美性猛片aaaaaaa做受| 91麻豆精品视频| 91亚洲精品久久久蜜桃| 99久久精品国产一区| 丁香婷婷综合网| 99国产精品久久久久久久久久| 国产一区二区三区蝌蚪| 国产一区二区三区在线看麻豆| 免费观看91视频大全| 日韩制服丝袜av| 日韩精品亚洲专区| 蜜臀99久久精品久久久久久软件| 热久久久久久久| 激情六月婷婷久久| 国产成人免费高清| 9色porny自拍视频一区二区| 99久久国产综合精品女不卡| 色综合色综合色综合色综合色综合| 一本大道久久精品懂色aⅴ| 在线看一区二区| 欧美日韩久久不卡| 日韩欧美国产电影| 日韩精品乱码av一区二区| 美日韩一区二区| 国产精品夜夜嗨| 99久久婷婷国产| 欧美日韩视频在线一区二区| 在线播放视频一区| 欧美草草影院在线视频| 国产精品素人视频| 夜夜精品视频一区二区| 最新日韩av在线| 国产欧美日本一区视频| 国产精品私人影院| 亚洲国产精品一区二区久久| 日本一不卡视频| 国产精品一级片| 欧美亚洲丝袜传媒另类| 欧美电影免费观看高清完整版 | 欧美精品xxxxbbbb| 精品国产成人系列| 国产精品久久网站| 婷婷综合五月天| 国产成人在线视频网站| 91福利区一区二区三区| 日韩午夜电影av| 国产精品久久影院| 免费观看在线色综合| 成人午夜视频福利| 91麻豆精品国产91久久久更新时间| 亚洲精品一区二区在线观看| 久久综合视频网| 欧美三级韩国三级日本一级| 欧美一区二区三区免费视频| 久久久久青草大香线综合精品| 亚洲欧美偷拍三级| 久久99国产精品久久99果冻传媒| 国产福利电影一区二区三区| 欧美亚洲日本一区| 国产欧美一区二区精品久导航| 亚洲综合免费观看高清在线观看| 激情欧美一区二区| 国产精品污网站| 午夜视频在线观看一区| 99热国产精品| 久久久美女艺术照精彩视频福利播放| 亚洲免费在线视频| 国产精品一二三四| 日韩欧美一二三| 亚洲国产一区二区三区| 成人精品gif动图一区| 日韩欧美一区二区久久婷婷| 亚洲日本丝袜连裤袜办公室| 国产一区二区三区观看| 欧美理论电影在线| 一区二区三区中文字幕精品精品 | 91久久一区二区| 久久影视一区二区| 日韩精品午夜视频| 在线视频你懂得一区二区三区| 久久精品欧美一区二区三区不卡| 日韩国产高清在线| 欧美日韩一区国产| 亚洲一区二区三区中文字幕 | 2021中文字幕一区亚洲| 日韩成人一级大片| 在线日韩一区二区| 亚洲免费电影在线| 99久久综合国产精品| 国产精品热久久久久夜色精品三区| 国产一区二区不卡老阿姨| 欧美一二区视频| 午夜精品久久久久久久蜜桃app| 色综合天天在线| 自拍偷在线精品自拍偷无码专区| 国产a视频精品免费观看| 国产午夜精品美女毛片视频| 国产麻豆成人传媒免费观看| 久久这里只有精品首页| 一区二区在线观看免费| 国产二区国产一区在线观看| 日韩欧美中文字幕精品| 日本伊人午夜精品| 日韩一区二区三区电影在线观看 | 国产盗摄一区二区| 久久久亚洲精华液精华液精华液| 国产一区二区在线电影| 久久日一线二线三线suv| 国产精品资源网| 国产精品午夜在线观看| 成人精品国产福利| 综合婷婷亚洲小说| 欧美色视频一区| 日韩不卡手机在线v区| 日韩三级av在线播放| 国精产品一区一区三区mba视频 | 丝袜国产日韩另类美女| 日韩免费在线观看| 国产99久久久精品| 中文字幕综合网| 欧美色手机在线观看| 日本亚洲免费观看| 精品久久久久久久一区二区蜜臀| 国产一区二区三区国产| 中文字幕av免费专区久久| 成人激情午夜影院| 一二三区精品福利视频| 欧美日韩电影一区| 国内成人自拍视频| 成人欧美一区二区三区在线播放| 欧美影院午夜播放| 美女网站色91| 亚洲欧洲av在线| 欧美激情中文字幕一区二区| 99久久精品国产麻豆演员表| 亚洲国产视频网站| 久久久久88色偷偷免费| 色视频成人在线观看免| 欧美aaaaaa午夜精品| 国产日韩视频一区二区三区| 色综合久久久久综合| 老司机免费视频一区二区三区| 亚洲国产岛国毛片在线| 精品视频1区2区3区| 国产成人午夜电影网| 亚洲一级在线观看| 国产亚洲精品中文字幕| 欧美性三三影院| 粉嫩av亚洲一区二区图片| 亚洲mv在线观看| 国产精品看片你懂得| 日韩一级黄色大片| 成人av资源在线| 奇米一区二区三区av| 亚洲欧美在线另类| 精品少妇一区二区三区在线视频| 国产精品天干天干在观线| 色噜噜狠狠一区二区三区果冻| 蜜桃视频在线一区| 综合色中文字幕| 久久精品一区四区| 欧美精品vⅰdeose4hd| 一本大道久久a久久综合| 精品无人区卡一卡二卡三乱码免费卡| 亚洲精品国产成人久久av盗摄 | 在线一区二区视频| 国产成人亚洲综合色影视| 日韩vs国产vs欧美|