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

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

?? sql.c

?? ctags的最新版5.7,可以比較5.6版看看,免費下載
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* *	$Id: sql.c 574 2007-06-26 23:05:27Z dfishburn $ * *	Copyright (c) 2002-2003, Darren Hiebert * *	This source code is released for free distribution under the terms of the *	GNU General Public License. * *	This module contains functions for generating tags for PL/SQL language *	files. *//* *	 INCLUDE FILES */#include "general.h"	/* must always come first */#include <ctype.h>	/* to define isalpha () */#include <setjmp.h>#ifdef DEBUG#include <stdio.h>#endif#include "debug.h"#include "entry.h"#include "keyword.h"#include "parse.h"#include "read.h"#include "routines.h"#include "vstring.h"/* *	On-line PL/SQL Reference Guide: *	http://info-it.umsystem.edu/oradocs/doc/server/doc/PLS23/toc.htm * *	Sample PL/SQL code is available from: *	http://www.orafaq.com/faqscrpt.htm#GENPLSQL * *	On-line SQL Anywhere Documentation *	http://www.ianywhere.com/developer/product_manuals/sqlanywhere/index.html *//* *	 MACROS */#define isType(token,t)		(boolean) ((token)->type == (t))#define isKeyword(token,k)	(boolean) ((token)->keyword == (k))/* *	 DATA DECLARATIONS */typedef enum eException { ExceptionNone, ExceptionEOF } exception_t;/* * Used to specify type of keyword. */typedef enum eKeywordId {	KEYWORD_NONE = -1,	KEYWORD_is,	KEYWORD_begin,	KEYWORD_body,	KEYWORD_cursor,	KEYWORD_declare,	KEYWORD_end,	KEYWORD_function,	KEYWORD_if,	KEYWORD_loop,	KEYWORD_case,	KEYWORD_for,	KEYWORD_call,	KEYWORD_package,	KEYWORD_pragma,	KEYWORD_procedure,	KEYWORD_record,	KEYWORD_object,	KEYWORD_ref,	KEYWORD_rem,	KEYWORD_return,	KEYWORD_returns,	KEYWORD_subtype,	KEYWORD_table,	KEYWORD_trigger,	KEYWORD_type,	KEYWORD_index,	KEYWORD_event,	KEYWORD_publication,	KEYWORD_service,	KEYWORD_domain,	KEYWORD_datatype,	KEYWORD_result,	KEYWORD_when,	KEYWORD_then,	KEYWORD_variable,	KEYWORD_exception,	KEYWORD_at,	KEYWORD_on,	KEYWORD_primary,	KEYWORD_references,	KEYWORD_unique,	KEYWORD_check,	KEYWORD_constraint,	KEYWORD_foreign,	KEYWORD_ml_table,	KEYWORD_ml_table_lang,	KEYWORD_ml_table_dnet,	KEYWORD_ml_table_java,	KEYWORD_ml_table_chk,	KEYWORD_ml_conn,	KEYWORD_ml_conn_lang,	KEYWORD_ml_conn_dnet,	KEYWORD_ml_conn_java,	KEYWORD_ml_conn_chk,	KEYWORD_local,	KEYWORD_temporary,	KEYWORD_drop,	KEYWORD_view,	KEYWORD_synonym,	KEYWORD_handler,	KEYWORD_comment,	KEYWORD_go} keywordId;/* * Used to determine whether keyword is valid for the token language and *	what its ID is. */typedef struct sKeywordDesc {	const char *name;	keywordId id;} keywordDesc;typedef enum eTokenType {	TOKEN_UNDEFINED,	TOKEN_BLOCK_LABEL_BEGIN,	TOKEN_BLOCK_LABEL_END,	TOKEN_CHARACTER,	TOKEN_CLOSE_PAREN,	TOKEN_SEMICOLON,	TOKEN_COMMA,	TOKEN_IDENTIFIER,	TOKEN_KEYWORD,	TOKEN_OPEN_PAREN,	TOKEN_OPERATOR,	TOKEN_OTHER,	TOKEN_STRING,	TOKEN_PERIOD,	TOKEN_OPEN_CURLY,	TOKEN_CLOSE_CURLY,	TOKEN_TILDE,	TOKEN_FORWARD_SLASH} tokenType;typedef struct sTokenInfo {	tokenType	type;	keywordId	keyword;	vString *	string;	vString *	scope;	unsigned long lineNumber;	fpos_t filePosition;} tokenInfo;/* *	DATA DEFINITIONS */static langType Lang_sql;static jmp_buf Exception;typedef enum {	SQLTAG_CURSOR,	SQLTAG_PROTOTYPE,	SQLTAG_FUNCTION,	SQLTAG_FIELD,	SQLTAG_LOCAL_VARIABLE,	SQLTAG_BLOCK_LABEL,	SQLTAG_PACKAGE,	SQLTAG_PROCEDURE,	SQLTAG_RECORD,	SQLTAG_SUBTYPE,	SQLTAG_TABLE,	SQLTAG_TRIGGER,	SQLTAG_VARIABLE,	SQLTAG_INDEX,	SQLTAG_EVENT,	SQLTAG_PUBLICATION,	SQLTAG_SERVICE,	SQLTAG_DOMAIN,	SQLTAG_VIEW,	SQLTAG_SYNONYM,	SQLTAG_MLTABLE,	SQLTAG_MLCONN,	SQLTAG_COUNT} sqlKind;static kindOption SqlKinds [] = {	{ TRUE,  'c', "cursor",		  "cursors"				   },	{ FALSE, 'd', "prototype",	  "prototypes"			   },	{ TRUE,  'f', "function",	  "functions"			   },	{ TRUE,  'F', "field",		  "record fields"		   },	{ FALSE, 'l', "local",		  "local variables"		   },	{ TRUE,  'L', "label",		  "block label"			   },	{ TRUE,  'P', "package",	  "packages"			   },	{ TRUE,  'p', "procedure",	  "procedures"			   },	{ FALSE, 'r', "record",		  "records"				   },	{ TRUE,  's', "subtype",	  "subtypes"			   },	{ TRUE,  't', "table",		  "tables"				   },	{ TRUE,  'T', "trigger",	  "triggers"			   },	{ TRUE,  'v', "variable",	  "variables"			   },	{ TRUE,  'i', "index",		  "indexes"				   },	{ TRUE,  'e', "event",		  "events"				   },	{ TRUE,  'U', "publication",  "publications"		   },	{ TRUE,  'R', "service",	  "services"			   },	{ TRUE,  'D', "domain",		  "domains"				   },	{ TRUE,  'V', "view",		  "views"				   },	{ TRUE,  'n', "synonym",	  "synonyms"			   },	{ TRUE,  'x', "mltable",	  "MobiLink Table Scripts" },	{ TRUE,  'y', "mlconn",		  "MobiLink Conn Scripts"  }};static const keywordDesc SqlKeywordTable [] = {	/* keyword		keyword ID */	{ "as",								KEYWORD_is				      },	{ "begin",							KEYWORD_begin			      },	{ "body",							KEYWORD_body			      },	{ "cursor",							KEYWORD_cursor			      },	{ "declare",						KEYWORD_declare			      },	{ "end",							KEYWORD_end				      },	{ "function",						KEYWORD_function		      },	{ "if",								KEYWORD_if				      },	{ "is",								KEYWORD_is				      },	{ "loop",							KEYWORD_loop			      },	{ "case",							KEYWORD_case			      },	{ "for",							KEYWORD_for				      },	{ "call",							KEYWORD_call			      },	{ "package",						KEYWORD_package			      },	{ "pragma",							KEYWORD_pragma			      },	{ "procedure",						KEYWORD_procedure		      },	{ "record",							KEYWORD_record			      },	{ "object",							KEYWORD_object			      },	{ "ref",							KEYWORD_ref				      },	{ "rem",							KEYWORD_rem				      },	{ "return",							KEYWORD_return			      },	{ "returns",						KEYWORD_returns			      },	{ "subtype",						KEYWORD_subtype			      },	{ "table",							KEYWORD_table			      },	{ "trigger",						KEYWORD_trigger			      },	{ "type",							KEYWORD_type			      },	{ "index",							KEYWORD_index			      },	{ "event",							KEYWORD_event			      },	{ "publication",					KEYWORD_publication		      },	{ "service",						KEYWORD_service			      },	{ "result",							KEYWORD_result			      },	{ "when",							KEYWORD_when			      },	{ "then",							KEYWORD_then			      },	{ "variable",						KEYWORD_variable		      },	{ "exception",						KEYWORD_exception		      },	{ "at",								KEYWORD_at				      },	{ "on",								KEYWORD_on				      },	{ "primary",						KEYWORD_primary			      },	{ "references",						KEYWORD_references		      },	{ "unique",							KEYWORD_unique			      },	{ "check",							KEYWORD_check			      },	{ "constraint",						KEYWORD_constraint		      },	{ "foreign",						KEYWORD_foreign			      },	{ "ml_add_table_script",			KEYWORD_ml_table		      },	{ "ml_add_lang_table_script",		KEYWORD_ml_table_lang	      },	{ "ml_add_dnet_table_script",		KEYWORD_ml_table_dnet	      },	{ "ml_add_java_table_script",		KEYWORD_ml_table_java	      },	{ "ml_add_lang_table_script_chk",	KEYWORD_ml_table_chk	      },	{ "ml_add_connection_script",		KEYWORD_ml_conn			      },	{ "ml_add_lang_connection_script",	KEYWORD_ml_conn_lang	      },	{ "ml_add_dnet_connection_script",	KEYWORD_ml_conn_dnet	      },	{ "ml_add_java_connection_script",	KEYWORD_ml_conn_java	      },	{ "ml_add_lang_conn_script_chk",	KEYWORD_ml_conn_chk 	      },	{ "local",							KEYWORD_local			      },	{ "temporary",						KEYWORD_temporary		      },	{ "drop",							KEYWORD_drop			      },	{ "view",							KEYWORD_view			      },	{ "synonym",						KEYWORD_synonym			      },	{ "handler",						KEYWORD_handler			      },	{ "comment",						KEYWORD_comment			      },	{ "go",								KEYWORD_go				      }};/* *	 FUNCTION DECLARATIONS *//* Recursive calls */static void parseBlock (tokenInfo *const token, const boolean local);/* *	 FUNCTION DEFINITIONS */static boolean isIdentChar1 (const int c){	/*	 * Other databases are less restrictive on the first character of	 * an identifier.	 * isIdentChar1 is used to identify the first character of an 	 * identifier, so we are removing some restrictions.	 */	return (boolean)		(isalpha (c) || c == '@' || c == '_' );}static boolean isIdentChar (const int c){	return (boolean)		(isalpha (c) || isdigit (c) || c == '$' || 		 c == '@' || c == '_' || c == '#');}static boolean isCmdTerm (tokenInfo *const token){#ifdef DEBUGed	printf( "\n isCmdTerm: token same  tt:%d  tk:%d\n"			, token->type			, token->keyword		  );#endif	/*	 * Based on the various customer sites I have been at	 * the most common command delimiters are	 *	   ;	 *	   ~	 *	   /	 *	   go	 * This routine will check for any of these, more	 * can easily be added by modifying readToken and	 * either adding the character to:	 *	   enum eTokenType	 *	   enum eTokenType	 */	return ( isType (token, TOKEN_SEMICOLON) || 			isType (token, TOKEN_TILDE) || 			isType (token, TOKEN_FORWARD_SLASH) || 			isKeyword (token, KEYWORD_go) );}static void buildSqlKeywordHash (void){	const size_t count = sizeof (SqlKeywordTable) /		sizeof (SqlKeywordTable [0]);	size_t i;	for (i = 0	;  i < count  ;  ++i)	{		const keywordDesc* const p = &SqlKeywordTable [i];		addKeyword (p->name, Lang_sql, (int) p->id);	}}static tokenInfo *newToken (void){	tokenInfo *const token = xMalloc (1, tokenInfo);	token->type			= TOKEN_UNDEFINED;	token->keyword		= KEYWORD_NONE;	token->string		= vStringNew ();	token->scope		= vStringNew ();	return token;}static void deleteToken (tokenInfo *const token){	vStringDelete (token->string);	vStringDelete (token->scope);	eFree (token);}/* *	 Tag generation functions */static void makeConstTag (tokenInfo *const token, const sqlKind kind){	if (SqlKinds [kind].enabled)	{		const char *const name = vStringValue (token->string);		tagEntryInfo e;		initTagEntry (&e, name);		e.lineNumber   = token->lineNumber;		e.filePosition = token->filePosition;		e.kindName	   = SqlKinds [kind].name;		e.kind		   = SqlKinds [kind].letter;		makeTagEntry (&e);	}}static void makeSqlTag (tokenInfo *const token, const sqlKind kind){	vString *	fulltag;	if (SqlKinds [kind].enabled)	{		/*		 * If a scope has been added to the token, change the token		 * string to include the scope when making the tag.		 */		if ( vStringLength(token->scope) > 0 )		{			fulltag = vStringNew ();			vStringCopy(fulltag, token->scope);			vStringCatS (fulltag, ".");			vStringCatS (fulltag, vStringValue(token->string));			vStringTerminate(fulltag);			vStringCopy(token->string, fulltag);			vStringDelete (fulltag);		}		makeConstTag (token, kind);	}}/* *	 Parsing functions */static int skipToCharacter (const int c){	int d;	do	{		d = fileGetc ();	} while (d != EOF  &&  d != c);	return d;}static void parseString (vString *const string, const int delimiter){	boolean end = FALSE;	int c;	while (! end)	{		c = fileGetc ();		if (c == EOF)			end = TRUE;		else if (c == delimiter)			end = TRUE;		else			vStringPut (string, c);	}	vStringTerminate (string);}/*	Read a C identifier beginning with "firstChar" and places it into "name".*/static void parseIdentifier (vString *const string, const int firstChar){	int c = firstChar;	Assert (isIdentChar1 (c));	do	{		vStringPut (string, c);		c = fileGetc ();	} while (isIdentChar (c));	vStringTerminate (string);	if (!isspace (c))		fileUngetc (c);		/* unget non-identifier character */}static keywordId analyzeToken (vString *const name){	vString *keyword = vStringNew ();	keywordId result;	vStringCopyToLower (keyword, name);	result = (keywordId) lookupKeyword (vStringValue (keyword), Lang_sql);	vStringDelete (keyword);	return result;}static void readToken (tokenInfo *const token){	int c;	token->type			= TOKEN_UNDEFINED;	token->keyword		= KEYWORD_NONE;	vStringClear (token->string);getNextChar:	do	{		c = fileGetc ();		/* 		 * Added " to the list of ignores, not sure what this 		 * might break but it gets by this issue:		 *	  create table "t1" (...)		 *		 * Darren, the code passes all my tests for both 		 * Oracle and SQL Anywhere, but maybe you can tell me		 * what this may effect.		 */	}	while (c == '\t'  ||  c == ' ' ||  c == '\n');	switch (c)	{		case EOF: longjmp (Exception, (int)ExceptionEOF);	break;		case '(': token->type = TOKEN_OPEN_PAREN;		break;		case ')': token->type = TOKEN_CLOSE_PAREN;		break;		case ';': token->type = TOKEN_SEMICOLON;		break;		case '.': token->type = TOKEN_PERIOD;				break;		case ',': token->type = TOKEN_COMMA;			break;		case '{': token->type = TOKEN_OPEN_CURLY;		break;		case '}': token->type = TOKEN_CLOSE_CURLY;		break;		case '~': token->type = TOKEN_TILDE;			break;		case '\'':		case '"':				  token->type = TOKEN_STRING;				  parseString (token->string, c);				  token->lineNumber = getSourceLineNumber ();				  token->filePosition = getInputFilePosition ();				  break;		case '-':				  c = fileGetc ();				  if (c == '-')		/* -- is this the start of a comment? */				  {					  skipToCharacter ('\n');					  goto getNextChar;				  }				  else				  {					  if (!isspace (c))						  fileUngetc (c);					  token->type = TOKEN_OPERATOR;				  }				  break;		case '<':		case '>':				  {					  const int initial = c;					  int d = fileGetc ();					  if (d == initial)					  {						  if (initial == '<')							  token->type = TOKEN_BLOCK_LABEL_BEGIN;						  else							  token->type = TOKEN_BLOCK_LABEL_END;					  }					  else					  {						  fileUngetc (d);						  token->type = TOKEN_UNDEFINED;					  }					  break;				  }		case '/':				  {					  int d = fileGetc ();					  if ( (d != '*') &&		/* is this the start of a comment? */							  (d != '/') )			/* is a one line comment? */					  {						  token->type = TOKEN_FORWARD_SLASH;						  fileUngetc (d);					  }					  else					  {						  if (d == '*')						  {							  do							  {								  skipToCharacter ('*');								  c = fileGetc ();								  if (c == '/')									  break;								  else									  fileUngetc (c);							  } while (c != EOF && c != '\0');							  goto getNextChar;						  }						  else if (d == '/')	/* is this the start of a comment?  */						  {							  skipToCharacter ('\n');							  goto getNextChar;						  }					  }					  break;				  }		default:				  if (! isIdentChar1 (c))					  token->type = TOKEN_UNDEFINED;				  else				  {					  parseIdentifier (token->string, c);					  token->lineNumber = getSourceLineNumber ();					  token->filePosition = getInputFilePosition ();					  token->keyword = analyzeToken (token->string);					  if (isKeyword (token, KEYWORD_rem))					  {						  vStringClear (token->string);						  skipToCharacter ('\n');						  goto getNextChar;					  }					  else if (isKeyword (token, KEYWORD_NONE))						  token->type = TOKEN_IDENTIFIER;					  else						  token->type = TOKEN_KEYWORD;				  }				  break;	}}/* *	 Token parsing functions */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美精品一区二区三区四区| www.欧美日韩| 香蕉成人伊视频在线观看| 亚洲成人777| 亚洲精品水蜜桃| 亚洲精品国产无套在线观| 日韩毛片高清在线播放| 国产亚洲人成网站| 国产精品美女久久久久久久久 | 欧美成人三级电影在线| 日韩亚洲欧美一区二区三区| 欧美变态凌虐bdsm| 国产日韩v精品一区二区| 国产亚洲一区二区三区在线观看| 国产欧美精品日韩区二区麻豆天美| 国产日韩精品一区二区三区| 欧美日韩视频在线观看一区二区三区 | 久久精品欧美一区二区三区麻豆 | 免费成人在线播放| 国产精品亚洲专一区二区三区 | 久久久欧美精品sm网站| 久久亚洲一级片| 国产欧美一区二区精品仙草咪| 一级做a爱片久久| 国产精品一卡二卡在线观看| 在线欧美一区二区| 国产网红主播福利一区二区| 午夜婷婷国产麻豆精品| 国产大片一区二区| 欧美美女喷水视频| 亚洲欧美在线视频| 国产91精品精华液一区二区三区| 欧美日韩国产电影| 亚洲精品成人a在线观看| 粉嫩aⅴ一区二区三区四区| 欧美色爱综合网| 亚洲一二三四在线观看| 国产成人综合自拍| www成人在线观看| 91丨九色丨尤物| 国产精品网友自拍| 国产一区二区三区高清播放| 国产亚洲一区二区三区在线观看| 亚洲愉拍自拍另类高清精品| 91丝袜国产在线播放| 亚洲人午夜精品天堂一二香蕉| 高清不卡一区二区在线| 日本一区二区免费在线观看视频| 久久99久久精品欧美| 综合中文字幕亚洲| 九色|91porny| 91精品国产91热久久久做人人| 亚洲丝袜精品丝袜在线| 色视频一区二区| 国产一区二区三区高清播放| 91视视频在线观看入口直接观看www | 91在线无精精品入口| 亚洲欧洲制服丝袜| 欧美日韩在线观看一区二区 | 日韩一区二区三区三四区视频在线观看 | 久久精品国产免费| 中文字幕成人av| 欧美亚洲禁片免费| 国产在线一区观看| 亚洲一区二区成人在线观看| 日韩一区二区不卡| 91麻豆精品在线观看| 久久国产综合精品| 亚洲蜜臀av乱码久久精品蜜桃| 欧美日本在线观看| 99久久精品情趣| 国产久卡久卡久卡久卡视频精品| 亚洲品质自拍视频| 26uuu久久天堂性欧美| 在线亚洲一区二区| www.久久久久久久久| 亚洲精品一区二区在线观看| 国产精品一区不卡| 久久不见久久见中文字幕免费| 亚洲在线中文字幕| 一区二区三区精品视频| 欧美韩日一区二区三区| 日韩欧美激情在线| 日韩精品中文字幕在线一区| 9191久久久久久久久久久| 欧美色男人天堂| 91精品国产91久久久久久一区二区| 色综合久久中文字幕综合网| 91麻豆国产精品久久| 91最新地址在线播放| 色妹子一区二区| 欧美日韩精品一区二区三区蜜桃| 69成人精品免费视频| 欧美一区二区成人| 国产精品视频第一区| 亚洲自拍偷拍九九九| 久久福利视频一区二区| 国产黄色成人av| 99久久久国产精品免费蜜臀| 欧美视频中文一区二区三区在线观看| 欧美亚洲自拍偷拍| 久久久久成人黄色影片| 玉足女爽爽91| 国产精品一区二区三区四区| 99精品久久久久久| wwwwww.欧美系列| 中文字幕一区二区三区乱码在线 | 成人黄色av网站在线| 欧美精品在线观看播放| 亚洲欧洲性图库| 日韩电影在线观看电影| 不卡免费追剧大全电视剧网站| 欧美高清视频一二三区 | 国产九色sp调教91| 日韩一区二区免费高清| 一区二区三区国产豹纹内裤在线| 蜜臀av一级做a爰片久久| 91久久精品国产91性色tv| 久久精品视频一区二区| 韩国v欧美v亚洲v日本v| 日韩视频免费直播| 亚洲国产欧美在线人成| 日本道在线观看一区二区| 国产精品国产三级国产三级人妇| 国产一区二区网址| 久久综合九色综合欧美98| 看片的网站亚洲| 日韩欧美国产精品| 久久精品理论片| 久久天天做天天爱综合色| 日本成人在线视频网站| 日韩精品一区在线观看| 激情五月激情综合网| 精品国产区一区| 国产精品一区久久久久| 国产精品久久久久久亚洲毛片| 不卡视频在线看| 亚洲一区二区欧美| 欧美日本乱大交xxxxx| 男女性色大片免费观看一区二区 | 美女视频一区二区三区| 欧美大片一区二区三区| 成人免费看的视频| 亚洲免费av高清| 欧美一区二区播放| 国产福利91精品一区二区三区| 国产亚洲婷婷免费| 欧美剧在线免费观看网站| 奇米色一区二区三区四区| 欧美日韩1区2区| 日日欢夜夜爽一区| 91影院在线观看| 亚洲日本在线观看| 色88888久久久久久影院按摩| 精品国产一区a| 亚洲香肠在线观看| 91精品综合久久久久久| 久久er99热精品一区二区| 日韩激情av在线| 成人一区二区三区在线观看| 欧美日韩国产精品自在自线| 国产日韩欧美精品一区| 日韩电影在线免费观看| 欧美探花视频资源| 国产精品嫩草99a| 亚洲成人先锋电影| 一区二区三区蜜桃| 欧美三级电影一区| 亚洲欧美日韩中文字幕一区二区三区| 成人免费视频caoporn| 国产精品国产成人国产三级| 91在线观看视频| 成人一区二区三区中文字幕| 亚洲gay无套男同| 欧美刺激午夜性久久久久久久| 国产精品18久久久久| 一区二区三区四区高清精品免费观看 | 国产一区二区三区| 一区二区三区四区在线免费观看| 久久久亚洲国产美女国产盗摄 | 在线一区二区观看| 国产不卡视频一区二区三区| 91丨porny丨国产| 在线日韩av片| 日本精品裸体写真集在线观看| 色婷婷综合激情| 色狠狠一区二区| 日韩一级高清毛片| 欧美国产成人精品| 亚洲在线观看免费视频| 久久精品理论片| 99re66热这里只有精品3直播| 91国产福利在线| 欧美成人一区二区三区在线观看| 国产精品免费丝袜| 亚洲成人资源网| 风间由美一区二区三区在线观看| 欧美日韩亚洲综合一区| 欧美不卡一二三| 亚洲精品一二三区|