亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > 綜合 > 正文

深入探究Lua中的解析表達(dá)式

2024-07-21 23:04:57
字體:
供稿:網(wǎng)友

 使用一個(gè)模式

這個(gè)例子顯示了一個(gè)建立和使用模式的程序,它非常簡(jiǎn)單但很完整:

 

復(fù)制代碼 代碼如下:
local lpeg = require "lpeg"

 

-- matches a word followed by end-of-string
p = lpeg.R"az"^1 * -1

print(p:match("hello"))        --> 6
print(lpeg.match(p, "hello"))  --> 6
print(p:match("1 hello"))      --> nil

 

模式是簡(jiǎn)單的一個(gè)或多個(gè)小寫字符并在尾端以(-1)結(jié)束的序列。該程序調(diào)用match來當(dāng)作一個(gè)方法和函數(shù)。在以上成功案例,匹配函數(shù)返回成功 匹配的第一個(gè)字符的索引,為其字符串長度加1。

 

復(fù)制代碼 代碼如下:
Name-value lists

 

這個(gè)例子解析一個(gè)名稱 - 值配對(duì)的列表,并返回那些配對(duì)的表:

 

復(fù)制代碼 代碼如下:
lpeg.locale(lpeg)   -- adds locale entries into 'lpeg' table

 

local space = lpeg.space^0
local name = lpeg.C(lpeg.alpha^1) * space
local sep = lpeg.S(",;") * space
local pair = lpeg.Cg(name * "=" * space * name) * sep^-1
local list = lpeg.Cf(lpeg.Ct("") * pair^0, rawset)
t = list:match("a=b, c = hi; next = pi")  --> { a = "b", c = "hi", next = "pi" }

 

每一配對(duì)都有  formatname =namefollowed 的一個(gè)可選的分離器(用逗號(hào)或分號(hào))。  配對(duì)模式(Thepairpattern)在一個(gè)組模式里形成閉包,那么那些名稱就可以成為單個(gè)捕獲的值。 列表模式 (Thelistpattern)然后折疊這些捕獲。 它以空列表開始,通過創(chuàng)建列表捕獲匹配一個(gè)空字符串,然后為每個(gè)捕獲(一名稱對(duì))appliesrawsetover累加器(表)和捕捉值(對(duì)名稱)。rawsetreturns((未初始化的集合)返回表本身,所以累加器總是表中執(zhí)行。


以下代碼創(chuàng)建了一個(gè)模式,該模式使用給定的分隔模式sep作為分隔器來來拆分字符串:

 

復(fù)制代碼 代碼如下:
function split (s, sep)
  sep = lpeg.P(sep)
  local elem = lpeg.C((1 - sep)^0)
  local p = elem * (sep * elem)^0
  return lpeg.match(p, s)
end

 

首先,該函數(shù)確保sep一個(gè)合適的模式。只要沒有匹配分隔器,該模式的elem 是重復(fù)的零個(gè)或多個(gè)任意字符。它還捕捉其匹配值。模式p匹配由sep拆分的一組元素.

如果拆分產(chǎn)生的結(jié)果值太多,可能會(huì)溢出由一個(gè)Lua函數(shù)返回的最大數(shù)目的值。在這種情況下,我們可以將這些值放到一個(gè)表中:

 

復(fù)制代碼 代碼如下:
function split (s, sep)
  sep = lpeg.P(sep)
  local elem = lpeg.C((1 - sep)^0)
  local p = lpeg.Ct(elem * (sep * elem)^0)   -- make a table capture
  return lpeg.match(p, s)
end

 

模式搜索

基本的匹配僅僅工作在錨定模式下。如果我們打算查找匹配字符串中任何地方的模式,那么我們必須寫一個(gè)匹配任何地方的模式。

因?yàn)槟J绞强梢跃帉懙?,所以我們可以編寫一個(gè)函數(shù),它給定一個(gè)任意的模式p,返回一個(gè)搜索p的新模式,以匹配字符串的任何位置。執(zhí)行這種搜索有幾種方法。一種方法如下:

 

復(fù)制代碼 代碼如下:
function anywhere (p)
  return lpeg.P{ p + 1 * lpeg.V(1) }
end

 

這個(gè)語法的直接解讀:匹配p或者跳過一個(gè)字符,然后試圖再次匹配。

如果我們想知道這個(gè)模式在字符串的所有匹配位置(而不僅僅知道它在字符串的某個(gè)位置),那么我們可以給這個(gè)模式添加位置捕捉:

 

復(fù)制代碼 代碼如下:
local I = lpeg.Cp()
function anywhere (p)
  return lpeg.P{ I * p * I + 1 * lpeg.V(1) }
end

 

print(anywhere("world"):match("hello world!"))   -> 7   12

這種搜索的另一個(gè)方法如下:

 

復(fù)制代碼 代碼如下:
local I = lpeg.Cp()
function anywhere (p)
  return (1 - lpeg.P(p))^0 * I * p * I
end

 

再次說明,這個(gè)模式的直接解讀:當(dāng)不匹配p時(shí),它跳過盡可能多的字符,然后對(duì)p進(jìn)行匹配(外加正確的位置捕捉)。

如果我們打算查找僅僅匹配單詞邊界的模式的話,那么我們可以使用以下轉(zhuǎn)換:

 

復(fù)制代碼 代碼如下:
local t = lpeg.locale()

 

function atwordboundary (p)
  return lpeg.P{
    [1] = p + t.alpha^0 * (1 - t.alpha)^1 * lpeg.V(1)
  }
end

 

平衡的括號(hào)

以下模式只匹配帶有平衡括號(hào)的字符串::

 

復(fù)制代碼 代碼如下:
b = lpeg.P{ "(" * ((1 - lpeg.S"()") + lpeg.V(1))^0 * ")" }

 

閱讀第一個(gè)(也是唯一的)所給語法規(guī)則,所謂平衡字符串,就是一個(gè)開括號(hào),后跟零個(gè)或多個(gè)非括號(hào)字符或者平衡字符串(LPFG.V(1)),最后跟著與開括號(hào)能夠閉合的結(jié)束括號(hào)。
全局替換

下面的例子和tostring.gsub所做工作類似。它接收一個(gè)母串和一個(gè)模式以及一個(gè)替換值,然后替代所傳入的母串中所有與指定模式匹配的子串為指定的替換值::

 

復(fù)制代碼 代碼如下:
function gsub (s, patt, repl)
  patt = lpeg.P(patt)
  patt = lpeg.Cs((patt / repl + 1)^0)
  return lpeg.match(patt, s)
end

 

作為instring.gsub,替換值可以是一個(gè)字串、函數(shù),或者一個(gè)表.

逗號(hào)分隔值(CSV)

下面的例子將字符串轉(zhuǎn)換成逗號(hào)分隔的值,并返回所有的字段:

 

復(fù)制代碼 代碼如下:
local field = '"' * lpeg.Cs(((lpeg.P(1) - '"') + lpeg.P'""' / '"')^0) * '"' +
                    lpeg.C((1 - lpeg.S',/n"')^0)

 

local record = field * (',' * field)^0 * (lpeg.P'/n' + -1)

function csv (s)
  return lpeg.match(record, s)
end

 

一個(gè)字段或是一個(gè)引用的字段(一族可能包含任何字符除單引號(hào),或雙引號(hào))或是一個(gè)未被引用的字段(不包含逗號(hào),換行符或引號(hào))。一個(gè)記錄就是一個(gè)用逗號(hào)分隔的字段列表(以換行符或以字符串結(jié)尾)。

就像這樣,前面的匹配返回的每個(gè)字段都是獨(dú)立返回的。若我們添加一個(gè)列表截取定義的記錄。返回的將不再是一個(gè)獨(dú)立的包含所有字段的列表。

 

local record = lpeg.Ct(field * (',' * field)^0) * (lpeg.P'/n' + -1)

 


UTF-8 和 Latin 1

使用LPeg來將一字符串從UTF-8編碼轉(zhuǎn)換成Latin 1(ISO 88590-1),這并不困難:

 

復(fù)制代碼 代碼如下:
-- convert a two-byte UTF-8 sequence to a Latin 1 character
local function f2 (s)
  local c1, c2 = string.byte(s, 1, 2)
  return string.char(c1 * 64 + c2 - 12416)
end

 

local utf8 = lpeg.R("/0/127")
           + lpeg.R("/194/195") * lpeg.R("/128/191") / f2

local decode_pattern = lpeg.Cs(utf8^0) * -1

 

這些代碼中,UTF-8定義已經(jīng)為Latin 1的編碼范圍(從0到255)。所有不在該范圍內(nèi)的編碼(以及任何無效的編碼)將不匹配該模式。

正如decode_pattern所要求的,這個(gè)模式匹配所有的輸入(因?yàn)?1在它的結(jié)尾處),任何無效字符串會(huì)匹配失敗,而無任何關(guān)于此問題的有用信息。我們可以通過重定義如下decode_pattern來改善這種情況:

 

復(fù)制代碼 代碼如下:
local function er (_, i) error("invalid encoding at position " .. i) end

 

local decode_pattern = lpeg.Cs(utf8^0) * (-1 + lpeg.P(er))

 

現(xiàn)在,如果模式utf8^0  在字符串尾部之前停止,會(huì)調(diào)用一個(gè)適用的出錯(cuò)函數(shù)。

UTF-8 和 Unicode

我們可以擴(kuò)展以前的模式來處理所有的Unicdoe代碼片段,當(dāng)然, 我們不能把它們翻譯阿拉伯?dāng)?shù)字1或其他任何一個(gè)字節(jié)編碼。相反,我們的翻譯序列結(jié)果中的數(shù)字表示的代碼片段。這里完整的代碼:
 

復(fù)制代碼 代碼如下:
-- decode a two-byte UTF-8 sequence
local function f2 (s)
  local c1, c2 = string.byte(s, 1, 2)
  return c1 * 64 + c2 - 12416
end
 
-- decode a three-byte UTF-8 sequence
local function f3 (s)
  local c1, c2, c3 = string.byte(s, 1, 3)
  return (c1 * 64 + c2) * 64 + c3 - 925824
end
 
-- decode a four-byte UTF-8 sequence
local function f4 (s)
  local c1, c2, c3, c4 = string.byte(s, 1, 4)
  return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168
end
 
local cont = lpeg.R("/128/191")   -- continuation byte
 
local utf8 = lpeg.R("/0/127") / string.byte
           + lpeg.R("/194/223") * cont / f2

 

 
-- decode a two-byte UTF-8 sequence
local function f2 (s)
  local c1, c2 = string.byte(s, 1, 2)
  return c1 * 64 + c2 - 12416
end
 
-- decode a three-byte UTF-8 sequence
local function f3 (s)
  local c1, c2, c3 = string.byte(s, 1, 3)
  return (c1 * 64 + c2) * 64 + c3 - 925824
end
 
-- decode a four-byte UTF-8 sequence
local function f4 (s)
  local c1, c2, c3, c4 = string.byte(s, 1, 4)
  return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168
end
 
local cont = lpeg.R("/128/191")   -- continuation byte
 
local utf8 = lpeg.R("/0/127") / string.byte
           + lpeg.R("/194/223") * cont / f2

 

Lua的長字符串

Lua中的長字符串由模式 [= *[ 開始,到第一次出現(xiàn)的帶有完全相同數(shù)量的等號(hào)的 ] =*] 結(jié)束。如果開括號(hào)后跟一個(gè)換行符,換行符將被丟棄(即,不會(huì)把它當(dāng)作字符串的一部分)。

在Lua中想要匹配一個(gè)長字符串,模式必須捕捉第一次重復(fù)的等號(hào),然后,只需找到有關(guān)閉字符串的候選項(xiàng),檢查其是否具有相同數(shù)量的等號(hào)。

 

復(fù)制代碼 代碼如下:
equals = lpeg.P"="^0
open = "[" * lpeg.Cg(equals, "init") * "[" * lpeg.P"/n"^-1
close = "]" * lpeg.C(equals) * "]"
closeeq = lpeg.Cmt(close * lpeg.Cb("init"), function (s, i, a, b) return a == b end)
string = open * lpeg.C((lpeg.P(1) - closeeq)^0) * close / 1

 

open 模式匹配 [=*[,在一個(gè)名為 init 的組中捕獲重復(fù)的等號(hào);它也會(huì)丟棄一個(gè)可選的換行符(如果它存在的話)。close 模式匹配 ]= *],也是捕捉重復(fù)的等號(hào)。closeeq模式首先匹配 close,然后它采用逆向捕捉來恢復(fù)先前由 open 捕捉并命名為 init 的內(nèi)容,最后,用 match-time 捕捉來檢查兩個(gè)捕獲是否相同。字符串模式從 open 開始之后,它會(huì)一直包含到匹配了 closeeq 為止,然后匹配最終的 close。最后的數(shù)字捕獲簡(jiǎn)單地丟棄由 close 產(chǎn)生的捕獲。

算術(shù)表達(dá)式

本例對(duì)簡(jiǎn)單的算術(shù)表達(dá)式進(jìn)行完整的解析和求值。而且我們用兩種風(fēng)格來書寫。

第一種途徑首先建立一個(gè)語法樹,然后遍歷這棵樹來計(jì)算表達(dá)式的值:

 

復(fù)制代碼 代碼如下:
-- 詞典元素
[code]local Space = lpeg.S(" /n/t")^0
local Number = lpeg.C(lpeg.P"-"^-1 * lpeg.R("09")^1) * Space
local TermOp = lpeg.C(lpeg.S("+-")) * Space
local FactorOp = lpeg.C(lpeg.S("*/")) * Space
local Open = "(" * Space
local Close = ")" * Space

 

-- 語法
local Exp, Term, Factor = lpeg.V"Exp", lpeg.V"Term", lpeg.V"Factor"
G = lpeg.P{ Exp,
  Exp = lpeg.Ct(Term * (TermOp * Term)^0);
  Term = lpeg.Ct(Factor * (FactorOp * Factor)^0);
  Factor = Number + Open * Exp * Close;
}

G = Space * G * -1

-- 求值器
function eval (x)
  if type(x) == "string" then
    return tonumber(x)
  else
    local op1 = eval(x[1])
    for i = 2, #x, 2 do
      local op = x[i]
      local op2 = eval(x[i + 1])
      if (op == "+") then op1 = op1 + op2
      elseif (op == "-") then op1 = op1 - op2
      elseif (op == "*") then op1 = op1 * op2
      elseif (op == "/") then op1 = op1 / op2
      end
    end
    return op1
  end
end

-- 解析/求值
function evalExp (s)
  local t = lpeg.match(G, s)
  if not t then error("syntax error", 2) end
  return eval(t)
end

-- 使用例子
print(evalExp"3 + 5*9 / (1+1) - 12")   --> 13.5

 

第二種風(fēng)格不用建立語法樹,直接求值。下面代碼就按此種途徑(假定和上面有相同的詞典元素):

 

復(fù)制代碼 代碼如下:
-- 輔助函數(shù)
function eval (v1, op, v2)
  if (op == "+") then return v1 + v2
  elseif (op == "-") then return v1 - v2
  elseif (op == "*") then return v1 * v2
  elseif (op == "/") then return v1 / v2
  end
end

 

-- 語法
local V = lpeg.V
G = lpeg.P{ "Exp",
  Exp = lpeg.Cf(V"Term" * lpeg.Cg(TermOp * V"Term")^0, eval);
  Term = lpeg.Cf(V"Factor" * lpeg.Cg(FactorOp * V"Factor")^0, eval);
  Factor = Number / tonumber + Open * V"Exp" * Close;
}

-- 使用例子
print(lpeg.match(G, "3 + 5*9 / (1+1) - 12"))   --> 13.5

 

注意 fold (收集器) 捕獲的用法。 要計(jì)算一個(gè)表達(dá)式的值,收集器從第一個(gè)術(shù)語的值開始,為每個(gè)副本應(yīng)用進(jìn)化收集器,操作符,和新術(shù)語。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
日韩在线观看视频一区| 大地资源网3页在线观看| 伊人色综合久久天天五月婷| 久久国产精品毛片| 这里只有精品国产| 天堂网免费视频| 日本在线视频免费观看| 日韩精品一区二区三区av| 国产成人一区二区在线| 日韩在线精品一区| 国产精品自拍毛片| 国内精品小视频在线观看| 欧美大香线蕉线伊人久久国产精品| 国产精品yjizz视频网一二区| 亚洲片区在线| 亚洲精品v亚洲精品v日韩精品| 国产国语老龄妇女a片| 亚洲亚洲人成综合网络| 妖精视频一区二区三区免费观看| 国内露脸中年夫妇交换精品| 蜜桃久久影院| 黄无遮挡免费网站| 写真福利精品福利在线观看| 在线播放高清视频www| 2019男人天堂| 日本高清视频一区二区三区| 在线观看wwwxxxx| 欧美日韩国产一级片| 国产一级在线视频| 国产又粗又猛又爽又| 一区二区电影| 欧洲亚洲在线| 精品成av人一区二区三区| 日韩精品中文字幕在线| 国产电影一区二区三区爱妃记| 欧州一区二区三区| 一本大道av一区二区在线播放| 风间由美一区二区三区| 日本久久精品视频| 日韩在线观看你懂的| 五月激激激综合网色播| 黄页视频在线观看| 狠狠色狠狠色合久久伊人| 日韩精品亚洲元码| 国产偷v国产偷v亚洲高清| 疯狂做受xxxx欧美肥白少妇| 在线免费看黄色| 久久黄色片网站| 久久久国产精华液999999| 天天天干夜夜夜操| 日皮视频在线免费观看| 一区二区三区四区在线| 精品国产视频在线观看| 五月天婷婷激情视频| 欧美精选一区二区| 亚洲一区二区3| 国产一级精品视频| 国产精品亚洲综合天堂夜夜| 日韩精品久久久毛片一区二区| 桃乃木香奈av在线| 久久久久国产一区二区三区| 国产成人免费看| 69av自拍偷拍| 免费看av大片| 精品伦精品一区二区三区视频| 91精品在线播放| 国产婷婷色一区二区三区| 欧美日韩不卡在线| 国内成+人亚洲+欧美+综合在线| 亚洲在线免费视频| 久久在线视频精品| www.91在线| 三级全黄视频| 国产又大又黄又粗的视频| 日本亚洲欧洲无免费码在线| 亚洲AV成人无码精电影在线| 一本大道av一区二区在线播放| 国产69久久| 婷婷中文字幕综合| 蜜桃av噜噜一区| 欧美一区二区三区四区在线观看地址| 日本簧片在线观看| tube国产麻豆| 国产999精品| 污的视频网站| 国产三级精品三级在线| 亚洲国产综合视频在线观看| av电影免费在线| 少妇伦子伦精品无吗| 精精国产xxxx视频在线中文版| 成人亲热视频网站| 青青草原在线免费观看视频| 日本二区三区视频| 亚洲午夜未删减在线观看| 中文字幕在线观看日韩| 日本免费一区二区视频| 日韩美女啊v在线免费观看| 亚洲成人一区二区| 日本韩国欧美超级黄在线观看| 中文字幕91视频| 国产欧美在线一区二区| 美女又爽又黄| 国内精品卡一卡二卡三新区| 人人妻人人澡人人爽人人欧美一区| 亚洲国产精品久久人人爱| 国产欧美在线一区二区| 中文字幕 国产| 国内小视频在线看| 制服.丝袜.亚洲.中文.综合| 91丨porny丨最新| 嫩草影院一区二区三区| 高清一级毛片视频| 日韩欧美三级在线观看| 黑人巨大精品欧美| 国产www精品| 亚洲国产日韩在线| 亚洲图区欧美| 久久久三级国产网站| 日本深夜福利视频| 欧美一级片久久久久久久| 亚洲人成色777777老人头| 少妇久久久久久| 国产a级免费视频| 国产影视一区| 欧美视频一区在线| 视频一区在线视频| 欧美激情欧美激情| 天天操天天摸天天爽| 国产情侣在线播放| 粉嫩av一区二区三区粉嫩| 日本xxx免费| 亚洲国产精品久久久久秋霞蜜臀| 国产精品无码久久av| 成人免费视频视频在| 第九色区aⅴ天堂久久香| 黄色视屏网站在线免费观看| 超污网站在线观看| 日本免费在线播放| 中文字幕亚洲视频| 欧美精品久久久久久| 少妇精品在线| 久久精品国产精品亚洲色婷婷| 亚洲免费观看视频| 欧美激情在线一区二区| 国产日韩在线| 日本xxx在线播放| 国产美女久久久久久| 刘亦菲一区二区三区免费看| 成人av免费观看| 另类视频一区二区三区| 中文字幕理伦片免费看| 美女18一级毛片一品久道久久综合| 99久久精品免费精品国产| 在线视频国产一区| 日本理论片午伦夜理片在线观看| 日本另类视频| 天天色天天操天天| 天天操夜夜操国产精品| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美一级高清免费播放| 国产成人无码一区二区在线观看| 一区二区在线免费视频| 亚洲欧美日韩久久| 欧美日韩亚洲一区| 国产小视频免费| 久久久久久网站| 成人性生交大片免费看网站| 国产精品福利视频| 国产精品一卡二卡在线观看| 亚洲成色最大综合在线| 欧美风情第一页| 国产视频一区在线观看一区免费| 成人欧美一区二区三区黑人一| 日韩黄色三级在线观看| 亚洲激情女人| 久久国际精品| 色视频免费在线观看| 成人污版视频| 日日噜噜夜夜狠狠| 自拍视频在线网| 国产女人18水真多毛片18精品| 加勒比婷婷色综合久久| 国产精品白丝喷水在线观看| 青青草在线免费观看| 调教一区二区| 色哟哟精品观看| 中文字幕一区二区三区四区五区六区| 日本精品一区二区三区在线播放| 久久久久久久久久久久网站| 亚洲成av人乱码色午夜| 日韩人妻无码一区二区三区| 最新久久zyz资源站| 天天干天天操天天做| 久久大香伊蕉在人线观看热2| 一级久久久久久| 国产成人在线观看免费网站| 亚洲午夜精品一区二区国产| 久久久久久久网站| 亚洲国产精品传媒在线观看| 色欲无码人妻久久精品| 日韩av免费电影| 国产精品色一区二区三区| 国产无套内射又大又猛又粗又爽| 香蕉久久a毛片| 一区二区高清在线| 美女视频久久| 欧美日一区二区三区在线观看国产免| 无码aⅴ精品一区二区三区| 日韩和的一区二在线| 免费看国产片在线观看| 国产一区二区在线观| 激情国产一区二区| 在线电影一区| 国产日产精品一区二区三区四区的观看方式| 亚洲 自拍 另类 欧美 丝袜| 欧美精品视频www在线观看| 国产黄色麻豆视频| 在线日韩电影| av网站免费| 国产伦精一区二区三区| 一本到12不卡视频在线dvd| 亚洲女同中文字幕| 国产米奇在线777精品观看| 国产精品传媒在线观看| 免费高清视频日韩| 欧美国产视频一区二区| 国产日韩久久| 亚洲欧美成aⅴ人在线观看| 国产伦理精品不卡| 九色porny在线| 精品视频一二三| 欧美a级大片在线| av小说在线观看| 成人av电影在线观看| 调教驯服丰满美艳麻麻在线视频| 免费网站免费进入在线| 91小视频在线免费看| 韩国av一区二区三区| 五月婷婷免费视频| 精品爽片免费看久久| 自拍一级黄色片| 一区二区三区四区五区精品视频| 免费aⅴ网站| 韩国三级大全久久网站| av资源免费观看| 少妇视频在线播放| eeuss网址直达入口| 国产亚洲欧美一区| 日韩欧美中文字幕视频| 国产三级精品视频| 国产欧美日韩免费看aⅴ视频| 91午夜精品亚洲一区二区三区| 中文字幕在线不卡一区二区三区| 日本熟妇人妻xxxx| 欧美一级大片视频| 久久久之久亚州精品露出| 中文字幕日韩在线视频| 天堂аⅴ在线地址8| 久久久久久久久久久影院| 性色av无码久久一区二区三区| 色狠狠一区二区三区香蕉| 精品久久香蕉国产线看观看亚洲| 美国一区二区| 欧美亚洲综合色| 在线精品观看国产| 欧美激情一级欧美精品| 天堂久久久久久| 欧洲美女和动交zoz0z| 国产精品乱码人人做人人爱| 第一页在线观看| 中文字幕无人区二| 中文字幕视频在线免费| 国内一区二区在线视频观看| 欧美黑人一级爽快片淫片高清| 国产精品99久久不卡二区| 欧美视频一区在线观看| 成r视频免费观看在线播放| 99在线免费视频| 亚洲欧美日韩国产手机在线| 一二三四视频免费观看在线看| 手机在线视频一区| 欧美成人精品高清在线播放| 国产午夜精品视频| 亚洲人成电影在线观看天堂色| 欧美一区1区三区3区公司| 超污网站在线观看| 亚洲自拍欧美另类| 色综合久久久无码中文字幕波多| 亚洲一区中文在线| 男人的天堂a在线| 亚洲欧洲另类| 国产精品一区二区视频| 亚洲黄色成人网| 国产午夜精品一区理论片飘花| 在线看日韩av| 天天槽夜夜槽| 欧美三区免费完整视频在线观看| 久久一卡二卡| 成人免费xxxxx在线观看| wwwxx欧美| 亚洲成人最新网站| 欧美xxxx做受欧美.88| 日韩成人精品一区| 日本亚洲三级在线| 波多野结衣影院| 成人av网站在线播放| 99久久夜色精品国产亚洲狼| 国产欧美一区二区白浆黑人| 无码人妻精品一区二区50| 国产成人+综合亚洲+天堂| 日本午夜精品电影| 欧美多人野外伦交| av欧美精品.com| 性少妇videosexfreexxx片| 欧美xxxxxbb| 亚洲成人天堂| 国产成人精品视频在线观看| 欧美日韩综合在线免费观看| 欧美精品一区二区三区在线| 成人爽a毛片| 亚洲一区制服诱惑| 制服丝袜中文字幕在线观看| 97香蕉超级碰碰久久免费软件| 精品少妇一区二区三区在线| 国产精品无码免费播放| 欧美人成在线观看网站高清| 激情图片在线观看高清国产| 精品视频在线一区|