精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用Go構(gòu)建一個(gè)SQL解析器

開(kāi)發(fā) 開(kāi)發(fā)工具
在本文中,小編將向大家簡(jiǎn)單介紹如何在 Go 中構(gòu)造 LL(1) 解析器,并應(yīng)用于解析SQL查詢。希望大家能用 Go 對(duì)簡(jiǎn)單的解析器算法有一個(gè)了解和簡(jiǎn)單應(yīng)用

摘要

本文旨在簡(jiǎn)單介紹如何在 Go 中構(gòu)造 LL(1) 解析器,在本例中用于解析SQL查詢。

為了簡(jiǎn)單起見(jiàn),我們將處理子選擇、函數(shù)、復(fù)雜嵌套表達(dá)式和所有 SQL 風(fēng)格都支持的其他特性。這些特性與我們將要使用的策略緊密相關(guān)。

1分鐘理論

一個(gè)解析器包含兩個(gè)部分:

  • 詞法分析:也就是“Tokeniser”
  • 語(yǔ)法分析:AST 的創(chuàng)建

詞法分析

讓我們用例子來(lái)定義一下。“Tokenising”以下查詢:

  1. SELECT id, name FROM 'users.csv' 

表示提取構(gòu)成此查詢的“tokens”。tokeniser 的結(jié)果像這樣:

  1. []string{"SELECT", "id", ",", "name", "FROM", "'users.csv'"} 

語(yǔ)法分析

這部分實(shí)際上是我們查看 tokens 的地方,確保它們有意義并解析它們來(lái)構(gòu)造出一些結(jié)構(gòu)體,以一種對(duì)將要使用它的應(yīng)用程序更方便的方式表示查詢(例如,用于執(zhí)行查詢,用顏色高亮顯示它)。在這一步之后,我們會(huì)得到這樣的結(jié)果:

  1. query{ 
  2.     Type: "Select", 
  3.     TableName: "users.csv", 
  4.     Fields: ["id", "name"], 

有很多原因可能會(huì)導(dǎo)致解析失敗,所以同時(shí)執(zhí)行這兩個(gè)步驟可能會(huì)比較方便,并在出現(xiàn)錯(cuò)誤時(shí)可以立即停止。

策略

我們將定義一個(gè)像這樣的解析器:

  1. type parser struct { 
  2.   sql             string        // The query to parse 
  3.   i               int           // Where we are in the query 
  4.   query           query.Query   // The "query struct" we'll build 
  5.   step            step          // What's this? Read on... 
  6.  
  7. // Main function that returns the "query struct" or an error 
  8. func (p *parser) Parse() (query.Query, error) {} 
  9.  
  10. // A "look-ahead" function that returns the next token to parse 
  11. func (p *parser) peek() (string) {} 
  12.  
  13. // same as peek(), but advancing our "i" index 
  14. func (p *parser) pop() (string) {} 

直觀地說(shuō),我們首先要做的是“peek() ***個(gè) token”。在基礎(chǔ)的SQL語(yǔ)法中,只有幾個(gè)有效的初始 token:SELECT、UPDATE、DELETE等;其他的都是錯(cuò)誤的。代碼像這樣:

  1. switch strings.ToUpper(parser.peek()) { 
  2.  
  3. case "SELECT": 
  4.   parser.query.type = "SELECT" // start building the "query struct" 
  5.   parser.pop() 
  6.   // TODO continue with SELECT query parsing... 
  7.  
  8. case "UPDATE": 
  9.   // TODO handle UPDATE 
  10.  
  11. // TODO other cases... 
  12.  
  13. default: 
  14.   return parser.query, fmt.Errorf("invalid query type") 
  15.  

我們基本上可以填寫(xiě) TODO 和讓它跑起來(lái)!然而,聰明的讀者會(huì)發(fā)現(xiàn),解析整個(gè) SELECT 查詢的代碼很快會(huì)變得混亂,而且我們有許多類型的查詢需要解析。所以我們需要一些結(jié)構(gòu)。

有限狀態(tài)機(jī)

FSMs 是一個(gè)非常有趣的話題,但我們來(lái)這里不是為了講這個(gè),所以不會(huì)深入介紹。讓我們只關(guān)注我們需要什么。

在我們的解析過(guò)程中,在任何給定的點(diǎn)(與其說(shuō)“點(diǎn)”,不如稱其稱為“節(jié)點(diǎn)”),只有少數(shù) token 是有效的,在找到這些 token 之后,我們將進(jìn)入新的節(jié)點(diǎn),其中不同的 token 是有效的,以此類推,直到完成對(duì)查詢的解析。我們可以將這些節(jié)點(diǎn)關(guān)系可視化為有向圖:

點(diǎn)轉(zhuǎn)換可以用一個(gè)更簡(jiǎn)單的表來(lái)定義,但是:

我們可以直接將這個(gè)表轉(zhuǎn)換成一個(gè)非常大的 switch 語(yǔ)句。我們將使用那個(gè)我們之前定義過(guò)的 parser.step 屬性:

  1. func (p *parser) Parse() (query.Query, error) { 
  2.   parser.step = stepType // initial step 
  3.  
  4.   for parser.i < len(parser.sql) { 
  5.     nextToken :parser.peek() 
  6.  
  7.     switch parser.step { 
  8.     case stepType: 
  9.       switch nextToken { 
  10.       case UPDATE: 
  11.         parser.query.type = "UPDATE" 
  12.         parser.step = stepUpdateTable 
  13.  
  14.       // TODO cases of other query types 
  15.       } 
  16.     case stepUpdateSet: 
  17.       // ... 
  18.     case stepUpdateField: 
  19.       // ... 
  20.     case stepUpdateComma: 
  21.       // ... 
  22.     } 
  23.  
  24.     parser.pop() 
  25.   } 
  26.  
  27.   return parser.query, nil 

好了!注意,有些步驟可能會(huì)有條件地循環(huán)回以前的步驟,比如 SELECT 字段定義上的逗號(hào)。這種策略對(duì)于基本的解析器非常適用。然而,隨著語(yǔ)法變得復(fù)雜,狀態(tài)的數(shù)量將急劇增加,因此編寫(xiě)起來(lái)可能會(huì)變得單調(diào)乏味。我建議在編寫(xiě)代碼時(shí)進(jìn)行測(cè)試;更多信息請(qǐng)見(jiàn)下文。

Peek() 實(shí)現(xiàn)

記住,我們需要同時(shí)實(shí)現(xiàn) peek() 和 pop() 。因?yàn)樗鼈儙缀跏且粯拥模晕覀冇靡粋€(gè)輔助函數(shù)來(lái)保持代碼整潔。此外,pop() 應(yīng)該進(jìn)一步推進(jìn)索引,以避免取到空格。

  1. func (p *parser) peek() string { 
  2.   peeked, _ :p.peekWithLength() 
  3.   return peeked 
  4.  
  5. func (p *parser) pop() string { 
  6.   peeked, len :p.peekWithLength() 
  7.   p.i += len 
  8.   p.popWhitespace() 
  9.   return peeked 
  10.  
  11. func (p *parser) popWhitespace() { 
  12.   for ; p.i < len(p.sql) && p.sql[p.i] == ' '; p.i++ { 
  13.   } 

下面是我們可能想要得到的令牌列表:

  1. var reservedWords = []string{ 
  2.   "(", ")", ">=", "<=", "!=", ",", "=", ">", "<", 
  3.   "SELECT", "INSERT INTO", "VALUES", "UPDATE", 
  4.   "DELETE FROM", "WHERE", "FROM", "SET", 

除此之外,我們可能會(huì)遇到帶引號(hào)的字符串或純標(biāo)識(shí)符(例如字段名)。下面是一個(gè)完整的 peekWithLength() 實(shí)現(xiàn):

  1. func (p *parser) peekWithLength() (string, int) { 
  2.   if p.i >= len(p.sql) { 
  3.     return "", 0 
  4.   } 
  5.   for _, rWord :range reservedWords { 
  6.     token :p.sql[p.i:min(len(p.sql), p.i+len(rWord))] 
  7.     upToken :strings.ToUpper(token) 
  8.     if upToken == rWord { 
  9.       return upToken, len(upToken) 
  10.     } 
  11.   } 
  12.   if p.sql[p.i] == '\'' { // Quoted string 
  13.     return p.peekQuotedStringWithLength() 
  14.   } 
  15.   return p.peekIdentifierWithLength() 

其余的函數(shù)都很簡(jiǎn)單,留給讀者作為練習(xí)。如果您感興趣,可以查看 github 的鏈接,其中包含完整的源代碼實(shí)現(xiàn)。

最終驗(yàn)證

解析器可能會(huì)在得到完整的查詢定義之前找到字符串的末尾。實(shí)現(xiàn)一個(gè) parser.validate() 函數(shù)可能是一個(gè)好主意,該函數(shù)查看生成的“query”結(jié)構(gòu),如果它不完整或錯(cuò)誤,則返回一個(gè)錯(cuò)誤。

測(cè)試Go的表格驅(qū)動(dòng)測(cè)試模式非常適合我們的情況:

  1. type testCase struct { 
  2.   Name     string         // description of the test 
  3.   SQL      string         // input sql e.g. "SELECT a FROM 'b'" 
  4.   Expected query.Query    // expected resulting "query" struct 
  5.   Err      error          // expected error result 

測(cè)試實(shí)例:

  1. ts := []testCase{ 
  2.     { 
  3.       Name:     "empty query fails", 
  4.       SQL:      "", 
  5.       Expected: query.Query{}, 
  6.       Err:      fmt.Errorf("query type cannot be empty"), 
  7.     }, 
  8.     { 
  9.       Name:     "SELECT without FROM fails", 
  10.       SQL:      "SELECT", 
  11.       Expected: query.Query{Type: query.Select}, 
  12.       Err:      fmt.Errorf("table name cannot be empty"), 
  13.     }, 
  14.     ... 

像這樣測(cè)試測(cè)試用例:

  1. for _, tc :range ts { 
  2.     t.Run(tc.Name, func(t *testing.T) { 
  3.       actual, err :Parse(tc.SQL) 
  4.       if tc.Err != nil && err == nil { 
  5.         t.Errorf("Error should have been %v", tc.Err) 
  6.       } 
  7.       if tc.Err == nil && err != nil { 
  8.         t.Errorf("Error should have been nil but was %v", err) 
  9.       } 
  10.       if tc.Err != nil && err != nil { 
  11.         require.Equal(t, tc.Err, err, "Unexpected error") 
  12.       } 
  13.       if len(actual) > 0 { 
  14.         require.Equal(t, tc.Expected, actual[0], 
  15.           "Query didn't match expectation") 
  16.       } 
  17.     }) 
  18.   } 

我使用 verify 是因?yàn)楫?dāng)查詢結(jié)構(gòu)不匹配時(shí),它提供了一個(gè) diff 輸出。

深入理解

這個(gè)實(shí)驗(yàn)非常適合:

  • 學(xué)習(xí) LL(1) 解析器算法
  • 自定義解析無(wú)依賴關(guān)系的簡(jiǎn)單語(yǔ)法

然而,這種方法可能會(huì)變得單調(diào)乏味,而且有一定的局限性。考慮一下如何解析任意復(fù)雜的復(fù)合表達(dá)式(例如 sqrt(a) =(1 *(2 + 3)))。

要獲得更強(qiáng)大的解析模型,請(qǐng)查看解析器組合符。goyacc 是一個(gè)流行的Go實(shí)現(xiàn)。

下面是完整的解析器地址(或點(diǎn)擊閱讀原文查看):http://github.com/marianogappa/sqlparser

 

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2022-10-20 11:00:52

SQL解析器

2017-02-14 10:20:43

Java Class解析器

2023-12-30 13:33:36

Python解析器JSON

2014-05-15 09:45:58

Python解析器

2022-06-28 08:17:10

JSON性能反射

2011-11-28 15:40:52

wiresharkRDP解析器

2015-02-10 14:32:37

XSS漏洞XSS

2023-07-25 14:24:33

元素JSX解析器

2023-05-10 08:05:41

GoWeb應(yīng)用

2024-01-08 08:36:29

HTTPGo代理服務(wù)器

2014-10-15 11:01:02

Web應(yīng)用測(cè)試應(yīng)用

2022-09-20 08:43:37

Go編程語(yǔ)言Web

2009-06-19 11:42:09

Scala計(jì)算器解析

2009-03-19 09:26:05

RSS解析器MagpieRSS

2011-04-01 16:16:27

JavaScript

2018-03-19 17:40:10

Python區(qū)塊鏈

2021-08-27 12:16:34

fastjarJAR文件Java

2018-04-12 12:45:02

數(shù)據(jù)庫(kù)MySQL構(gòu)建架構(gòu)

2014-04-14 15:54:00

print()Web服務(wù)器

2021-04-25 08:58:00

Go拍照云盤(pán)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

天堂av资源在线观看| 亚洲AV成人无码精电影在线| 羞羞网站在线看| www.欧美.com| 国产精品福利在线观看网址| 亚洲男人天堂2023| 亚洲精品在线观看91| 久久午夜电影网| 国产精品第10页| 日本午夜在线观看| 黄色一级二级三级| 99久久国产精| 日韩av一级| 亚洲男人天堂av| 免费试看一区| 精品国产无码一区二区| 午夜在线a亚洲v天堂网2018| 日韩视频第一页| av2014天堂网| 国产一区二区三区免费观看在线| 天天综合色天天| 永久久久久久| 三级av在线播放| 国产精品一区二区久久不卡| 日韩av理论片| 国产精品第九页| 欧美激情偷拍自拍| 亚洲毛片在线观看| 色悠悠在线视频| 欧美videos粗暴| 一本久久a久久精品亚洲| 在线观看日本一区| 国产女人在线观看| 99久久精品情趣| 91久久久一线二线三线品牌| 中文字幕乱码一区二区| 亚洲免费综合| 欧美精品videosex性欧美| 日本视频在线免费| 禁果av一区二区三区| 亚洲精品久久7777777| 青娱乐国产精品视频| 亚洲精品一区三区三区在线观看| 偷拍与自拍一区| 国产精品自拍合集| 97caopor国产在线视频| 1000精品久久久久久久久| 少妇精品久久久久久久久久| 你懂的在线观看视频网站| 波多野结衣91| 韩国精品一区二区三区六区色诱| 亚洲第一大网站| 国产精品亚洲一区二区三区在线 | 精品动漫一区| 欧美精品在线看| 91在线播放观看| 91精品久久久久久久久久不卡| 在线观看国产精品淫| 影音先锋制服丝袜| 成人羞羞视频播放网站| 国产亚洲欧美日韩精品| 亚洲а∨天堂久久精品2021| 欧美少妇xxxx| 最近的2019中文字幕免费一页| 9.1片黄在线观看| 天天做综合网| 欧美xxxx综合视频| 国产污视频在线观看| 日韩视频免费| 欧美在线一区二区视频| 欧美黄色一级大片| 久久精品免费观看| 91九色偷拍| 婷婷综合激情网| 久久久影视传媒| 先锋影音日韩| www国产在线观看| 亚洲综合激情小说| 国产99久久九九精品无码| 欧美成人性网| 欧美精品日韩精品| 欧美性生交xxxxx| 猛男gaygay欧美视频| 在线亚洲午夜片av大片| 国产福利视频网站| 91久久夜色精品国产九色| 午夜欧美不卡精品aaaaa| 天天干,天天干| 久久电影网站中文字幕| 国产精品美女黄网| 国产一级在线| 亚洲精品高清在线| 成年人免费在线播放| 色999韩欧美国产综合俺来也| 欧美精品 日韩| 亚洲天堂美女视频| 色爱综合网欧美| 久久噜噜噜精品国产亚洲综合 | 国产福利一区二区三区在线观看| 无码国产精品一区二区免费16| 欧美韩国日本不卡| 国产真人做爰毛片视频直播 | 日韩欧美黄色动漫| 欧美精品 - 色网| 亚洲精华一区二区三区| 久久久91精品国产| 波多野结衣视频网站| 久久电影网站中文字幕 | 欧美又黄又嫩大片a级| 无码日韩精品一区二区免费| 日韩一中文字幕| 日韩黄色在线播放| 国产精品一区在线观看你懂的| 欧美高清性xxxxhd| 亚洲h片在线看| 精品视频在线免费观看| aaaaaav| 91成人超碰| 国产精品成人免费电影| 成人精品在线播放| 亚洲色欲色欲www在线观看| 日本精品一区二区三区四区| 试看120秒一区二区三区| 伊人一区二区三区久久精品 | 国产精品久久麻豆| 色综合中文字幕| 性活交片大全免费看| 欧美wwwww| 国产精品福利观看| 欧美18xxxxx| 亚洲风情在线资源站| www.桃色.com| 久久理论电影| 国产精品国产自产拍高清av水多| 天堂在线资源8| 亚洲风情在线资源站| 精人妻一区二区三区| 亚洲电影影音先锋| 成人精品一区二区三区电影免费 | 红桃av在线播放| 精品国产乱子伦一区二区| 欧美日本精品在线| www.com欧美| 最新国产成人在线观看| 尤物国产在线观看| 99视频精品全国免费| 国产精品一区专区欧美日韩| 成人av一区| 欧美午夜一区二区三区免费大片| 国产精品扒开腿做爽爽| 男女精品网站| 日韩国产精品一区二区| 亚洲成人不卡| 在线亚洲欧美视频| 国产一区二区在线视频聊天 | 日本少妇久久久| 成人福利电影精品一区二区在线观看| 青青青青在线视频| 国产女人18毛片水真多18精品| 高清一区二区三区四区五区| 欧美一级视频免费| 欧美日韩色婷婷| 这里只有久久精品| 青青草精品视频| 一区二区三区四区视频在线| 欧美一区二区三区婷婷| 久久成人精品一区二区三区| 99久久夜色精品国产亚洲| 亚洲另类在线视频| www日本在线观看| 国产午夜久久| 日韩欧美三级一区二区| 亚洲二区av| 精品综合久久久久久97| 手机看片国产1024| 欧美在线综合视频| 亚洲av无码一区二区三区在线| 国产精品 欧美精品| 可以在线看的av网站| 国产一区二区观看| 亚洲jizzjizz日本少妇| 波多野结依一区| 国产亚洲视频在线| 国产熟女一区二区三区五月婷| 亚洲一级在线观看| 日本成人午夜影院| 国产传媒日韩欧美成人| 久久久久久久激情| 天天揉久久久久亚洲精品| 高清不卡日本v二区在线| 欧美大电影免费观看| 久久成人18免费网站| 欧美挠脚心网站| 7777精品伊人久久久大香线蕉的 | 美日韩一区二区三区| 国产911在线观看| 亚洲免费毛片| 亚洲淫片在线视频| 欧美日韩国产v| 欧美精品在线免费播放| 国产一级片在线播放| 亚洲爱爱爱爱爱| 国产又大又粗又硬| 欧美日韩中文在线观看| 999精品视频在线观看播放| 99久久99久久精品免费看蜜桃| 在线观看亚洲色图| 国产欧美不卡| 超碰10000| 日韩久久精品| 蜜桃在线一区二区三区精品| youjizz欧美| 成人免费午夜电影| 色综合一本到久久亚洲91| 久久久久久久国产| 黄色免费网站在线观看| 国产亚洲精品91在线| 亚洲精品无码专区| 91精品国产综合久久国产大片| 日韩在线播放中文字幕| 亚洲一区二区欧美| 91porn在线视频| 国产精品久久久久久久久快鸭 | 午夜福利一区二区三区| 日韩一区二区电影在线| 亚洲无码精品在线播放| 日本乱人伦一区| 久久久久久久久久影院| 亚洲国产精品视频| 欧美日韩成人免费观看| 一区在线中文字幕| 中文乱码字幕高清一区二区| 欧美激情一区三区| 90岁老太婆乱淫| 久久亚洲精华国产精华液 | 国产视频一区免费看| 欧美福利一区二区三区| 美女一区2区| 国产成人免费观看| 亚洲91网站| 97视频中文字幕| 欧美区一区二区| 91社区国产高清| 国产精品麻豆| 成人情趣片在线观看免费| 成人亚洲免费| 国产日韩精品电影| 四虎视频在线精品免费网址| 国产精品情侣自拍| 成人黄色免费网站| 国产在线一区二区三区| 欧美视频免费看| 成人福利网站在线观看| а天堂中文最新一区二区三区| 国产精品亚洲精品| 成人av在线播放| 2019国产精品视频| 国产精品jk白丝蜜臀av小说| 国产伦精品一区二区三区免费视频 | 在线日韩一区| 色爱区成人综合网| 久久中文字幕av| 女女百合国产免费网站| 欧美日韩国产亚洲一区| 黄色片网址在线观看| 亚洲欧美日韩综合国产aⅴ| 91av俱乐部| 麻豆视频一区二区| 日韩欧美中文在线视频| 丁香天五香天堂综合| 亚洲成人av免费在线观看| 91看片淫黄大片一级在线观看| 国产人妻大战黑人20p| 中文字幕不卡在线观看| 亚洲国产美女视频| 午夜激情综合网| 免费av中文字幕| 91精品国产综合久久久久久| www黄色网址| 亚洲精品自拍视频| 日本美女高清在线观看免费| 欧美成人午夜激情视频| 女人让男人操自己视频在线观看| 国产精品1区2区在线观看| 亚洲ww精品| 久久精品国产一区二区三区日韩| 欧美午夜精彩| 国产xxxx振车| 日本欧美在线看| 蜜桃色一区二区三区| 91亚洲精品久久久蜜桃| 三级黄色片在线观看| 亚洲韩国精品一区| 波多野结衣一区二区三区在线| 3d动漫精品啪啪一区二区竹菊| 免费看国产片在线观看| 中文字幕亚洲天堂| bbw在线视频| 国产日韩欧美自拍| 日韩美女国产精品| 欧美少妇在线观看| 久久深夜福利| 国产人成视频在线观看| 欧美国产精品一区| 中日韩精品视频在线观看| 欧美男人的天堂一二区| 香蕉视频免费看| 久热精品视频在线观看| 色8久久影院午夜场| 国内精品**久久毛片app| 久久久久电影| 国产精彩免费视频| 91麻豆成人久久精品二区三区| 在线观看美女av| 欧美亚洲精品一区| 亚洲欧美综合一区二区| 久久99国产精品自在自在app | 国产精品www.| 在线观看日本一区二区| 久久欧美中文字幕| 国产精品白浆一区二小说| 欧美一级片在线看| 三区四区在线视频| 国产精品69久久久久| 国产欧美自拍一区| 日本福利视频在线观看| 国内成+人亚洲+欧美+综合在线| 国产国语性生话播放| 午夜激情久久久| 日本成人动漫在线观看| 久久91精品国产| 欧美经典一区| 99精品视频网站| 久久国产夜色精品鲁鲁99| 色综合99久久久无码国产精品| 天天综合网 天天综合色| 神马一区二区三区| 国外视频精品毛片| 成人福利一区| bt天堂新版中文在线地址| 国产精品中文字幕日韩精品| 国产一区二区精彩视频| 欧美日韩二区三区| 日本www在线| 成人xxxxx| 中文字幕免费一区二区| 亚洲综合在线一区二区| 亚洲天堂a在线| 国产欧美综合视频| 免费成人高清视频| 9999久久久久| 日韩国产一级片| 久久亚洲影视婷婷| 一级特黄免费视频| 中文字幕日韩欧美| 亚洲ww精品| 国产玉足脚交久久欧美| av午夜精品一区二区三区| www.av麻豆| 亚洲人精品午夜在线观看| 香蕉成人影院| 国产一区一区三区| 国产成人免费视| 好吊操这里只有精品| 亚洲美女动态图120秒| 成人日韩av| 男人j进女人j| www.久久久久久久久| 波多野结衣影片| 久久国产视频网站| 久9re热视频这里只有精品| 天天摸天天碰天天添| 国产精品欧美精品| 精品人妻伦一区二区三区久久| 午夜精品一区二区三区在线播放| 欧美美女在线观看| 亚洲18在线看污www麻豆 | xxx欧美精品| 国产精品对白| 手机在线免费观看毛片| 亚洲摸摸操操av| 亚洲三级黄色片| 国产精品欧美日韩久久| 欧美特黄视频| 国产又粗又猛又爽又黄av| 欧美一级黄色录像| 亚洲欧洲日本韩国| 黑人巨大国产9丨视频| av一区二区三区黑人| 一级黄色片视频| 97久久精品人人澡人人爽缅北| 成人嫩草影院| 色悠悠在线视频| 欧美裸体一区二区三区| 成人bbav| 影音欧美亚洲| 久久久蜜桃精品| www.超碰在线.com| 国产精品视频区| 亚洲欧美网站|