国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

基于 js 實(shí)現(xiàn)一個(gè)小型編譯器

共 10462字,需瀏覽 21分鐘

 ·

2022-04-19 12:07

本文內(nèi)容基于?https://github.com/jamiebuilds/the-super-tiny-compiler?倉庫源碼進(jìn)行學(xué)習(xí)

最近在研究一些構(gòu)建側(cè)的東西,在翻 babel 官網(wǎng)的時(shí)候看到了這樣一段話:

For an awesome tutorial on compilers, check out?the-super-tiny-compiler, which also explains how Babel itself works on a high level.

出于學(xué)習(xí)的心態(tài),去翻了一下這個(gè)倉庫源碼,以下是筆者的一些學(xué)習(xí)的記錄,希望看完之后能對你理解 babel 的工作原理有一些幫助~

前言

the-super-tiny-compiler是一個(gè)代碼行數(shù)只有不到 200 行的超級小型的 compiler,但通過這個(gè) compiler 能學(xué)習(xí)到最基礎(chǔ)的 compile 原理,包括 babel 也是基于這樣的原理來進(jìn)行開發(fā)的。
倉庫本身的例子是將一組 lisp 風(fēng)格的函數(shù)語法編譯成了 C 風(fēng)格的函數(shù)語法,舉例子來說:


LISP 風(fēng)格C 風(fēng)格
2+2(add 2 2)add(2,2)
4-2(subtract 4 2)substract(4, 2)
2 + (4 - 2)(add 2 (substract 4 2))add(2, (substract(4, 2)))

這就大概是這次 compiler 需要完成的事情,可能看上去語法不是很完整,但是也能夠演示現(xiàn)代編譯器的主要部分思想了。

大多數(shù)的 Compilers 都會把編譯過程分成三個(gè)主要的過程: parse、transform 以及 code generate:

  1. parse 主要是將源碼轉(zhuǎn)換成一種更抽象的代碼表達(dá)

  2. transform 則是將上面抽象的表達(dá)進(jìn)行任意 compiler 想進(jìn)行的操作

  3. code generate 將 transform 處理之后的代碼生成一種新的代碼

Parse

parse 主要分為兩個(gè)步驟: 詞法分析以及語法分析。

  1. 詞法分析將源碼根據(jù)表達(dá)切分一個(gè)個(gè)的 tokens,tokens 是一組用來描述單獨(dú)語法的對象,可以是 numbers、labels、punctuation、operators 等

  2. 語法分析則是將詞法分析生成的 tokens 進(jìn)行重新編排得到一個(gè)叫做抽象語法(AST)的結(jié)構(gòu),AST 是一種易于使用且能展示完整信息的嵌套樹狀結(jié)構(gòu)。

例如前面提到的?add 2 (subtract 4 2)表達(dá)式被詞法分析處理之后生成的 tokens 大概是:

[
{ type: 'paren', value: '(' },
{ type: 'name', value: 'add' },
{ type: 'number', value: '2' },
{ type: 'paren', value: '(' },
{ type: 'name', value: 'subtract' },
{ type: 'number', value: '4' },
{ type: 'number', value: '2' },
{ type: 'paren', value: ')' },
{ type: 'paren', value: ')' }
]

語法分析處理出來的 AST 結(jié)構(gòu)為:


{
type: 'Program',
body: [
{
type: 'CallExpression',
name: 'add',
params: [
{
type: 'NumberLiteral',
value: '2',
},
{
type: 'CallExpression',
name: 'subtract',
params: [
{
type: 'NumberLiteral',
value: '4',
},
{
type: 'NumberLiteral',
value: '2',
}
]
}]
}]
}

Transform

transform 主要就是拿到 parse 得到的抽象語法樹,并基于此做出一些修改。tranform 這個(gè)過程既可以基于當(dāng)前語言的風(fēng)格去修改 ast 也可以使用一種新的語言風(fēng)格。
下面基于前面的 ast 結(jié)構(gòu)來展示 transform 這個(gè)過程的工作流程。
可以看到,ast 里面的元素看起來都很相似,這些元素組成了 ast 的子結(jié)點(diǎn),這些子結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)類型描述了代碼中的一個(gè)單獨(dú)的部分(例如變量、聲明語句,表達(dá)式等等)。
例如上面提到的類型是?NumberLiteral的節(jié)點(diǎn):

{
type: 'NumberLiteral',
value: '2',
}

或者更復(fù)雜一點(diǎn)的子節(jié)點(diǎn)類型:

{
type: 'CallExpression',
name: 'substract',
params: [...nested nodes here ...],
}

在 transfrom 這個(gè)過程中,我們可以通過增/刪/改來操作抽象語法樹結(jié)點(diǎn),或者可以直接基于當(dāng)前的抽象語法樹創(chuàng)建一個(gè)新的出來。
既然這里我們的目標(biāo)是將輸入的代碼轉(zhuǎn)換成一種新的語言風(fēng)格的代碼(Lisp -> C),所以這里會創(chuàng)建一個(gè)針對新語言的全新 AST 出來。
因此這里我們需要明確一下修改 AST 的操作:

Traversal(遍歷)

為了能處理所有的結(jié)點(diǎn),我們可以用深度優(yōu)先搜索對其進(jìn)行遍歷:

{
type: 'Program',
body: [{
type: 'CallExpression',
name: 'add',
params: [{
type: 'NumberLiteral',
value: '2'
}, {
type: 'CallExpression',
name: 'subtract',
params: [{
type: 'NumberLiteral',
value: '4'
}, {
type: 'NumberLiteral',
value: '2'
}]
}]
}]
}

遍歷流程是這樣的:

  • Program - 從 AST 的頂結(jié)點(diǎn)開始

  • CallExpression (add) - Program 的第一個(gè)子元素

  • NumberLiteral (2) - CallExpression (add) 的第一個(gè)子元素

  • CallExpression (subtract) - CallExpression (add) 的第二個(gè)子元素

  • NumberLiteral (4) - CallExpression (subtract) 的第一個(gè)子元素

  • NumberLiteral (2) - CallExpression (subtract) 的第二個(gè)子元素

如果直接在 ast 內(nèi)部操作而不是產(chǎn)生一個(gè)新的 ast,可能就需要介紹所有的種類的抽象。但目前來看,訪問所有結(jié)點(diǎn)的方法已經(jīng)足夠了。
訪問(visiting) 這個(gè)詞代表一種在對象結(jié)構(gòu)內(nèi)對元素進(jìn)行操作的模式。

Visitors(訪問)

這里我們可以創(chuàng)建一個(gè) visitor 對象,這個(gè)對象包括一些方法用于接收不同的結(jié)點(diǎn)。
例如:

var visitor = {
NumberLiteral() {},
CallExpression() {}
};

因此當(dāng)我們遍歷 ast 的時(shí)候,如果匹配到了對應(yīng) type 的結(jié)點(diǎn),可以調(diào)用 visitor 中的方法來處理。

Code generate

Compiler 的最后一個(gè)階段就是 generate, 這個(gè)階段做的事情可能會和 transformation 重疊,但是代碼生成最主要的部分還是根據(jù) AST 來輸出代碼。
Generate 有幾種不同的工作方式,有些 Compilers 會重用之前生成的 token,有些則會創(chuàng)建獨(dú)立的代碼表示,以便于線性輸出代碼,但接下來我們還是著重于使用之前生成好的 AST。
我們的生成器需要知道如何打印 AST 中的所有類型結(jié)點(diǎn),然后遞歸調(diào)用自身,知道所有的代碼都被打印到一個(gè)很長的字符串中。

代碼實(shí)現(xiàn)

以上就是 Compiler 所有的部分了,但并不是所有的 Compiler 都是這樣,不同的 compiler 目的不同,所以也可能需要不同的步驟。
接下來就開始代碼的編寫:

詞法分析器(tokenizer)

按照前面的理論分析,我們一步先進(jìn)行 parser 這個(gè)階段里面的詞法分析器(tokenizer)。
這個(gè)函數(shù)接收一個(gè)字符串,然后將其分割成由 token 組成的數(shù)組:
ex:
(add 2 (substract 4 2))?=>[{ type: 'paren', value: '('}, ...]

因此可以編寫這樣的一個(gè)函數(shù):


const tokenizer = (input) => {
const tokens = [];
let current = 0;
while (current < input.length) {
let char = input[current];
if (char === '(') {
tokens.push({
type: 'paren',
value: '(',
})

current++;
continue;
}

if (char === ')') {
tokens.push({
type: 'paren',
value: ')',
})
current ++;
continue;
}

// 空格目前不需要處理
if (/\s/.test(char)) {
current++;
continue;
}

// 處理數(shù)字
if (/[0-9]/.test(char)) {
let value = '';
// 一直遍歷直到遇到非數(shù)字的字符
while (/[0-9]/.test(char)) {
value += char;
char = input[++current];
}
tokens.push({
type: 'number',
value,
})
continue;
}

// 處理字符串
if(/[a-z]/i.test(char)) {
let value = '';

while(/[a-z]/i.test(char)) {
value += char;
char = input[++current];
}
tokens.push({
type: 'name',
value,
});

continue;
}

// 如果存在匹配不上的 token 就拋錯
throw new Error(`Unknown token: ${char}`);
}
return tokens;
}


語法分析器(parser)

詞法分析器接收語法分析得到的 token 數(shù)組,然后將其轉(zhuǎn)換成 AST 結(jié)構(gòu)。
例如:
[{ type: 'paren', value: '(' }, ...]?=>?{ type: 'Program', body: [...] }

const parser = (tokens) => {
let current = 0;

const walk = () => {
const token = tokens[current];
// 如果是 number 類型的結(jié)點(diǎn),返回一個(gè)新的 ast 節(jié)點(diǎn)即可
if (token.type === 'number') {
current++;
return {
type: 'NumberLiteral',
value: token.value,
}
}

// 接下來檢查 CallExpression 類型,先從左圓括號開始
if (
token.type === 'paren' &&
token.value === '('
) {
// 跳過左圓括號
token = tokens[++current];
// 首先會創(chuàng)建一個(gè) CallExpression 的根節(jié)點(diǎn),然后 name 設(shè)置成當(dāng)前的 token.value
// 因?yàn)樽髨A括號后的 token 一定是函數(shù)名稱
const node = {
type: 'CallExpression',
name: token.value,
params: [],
};

// 這里再跳一次函數(shù)名稱
token = tokens[++current];

// 通過循環(huán)遍歷接下來的每個(gè) token,直到遇到右圓括號
// 這些 token 會成為 `CallExpression` 的 `params`

// 以 lisp 風(fēng)格的代碼來說: (add 2 (substract 4 2))
/**
* token 中會有很多圓括號
* [
{ type: 'paren', value: '(' },
{ type: 'name', value: 'add' },
{ type: 'number', value: '2' },
{ type: 'paren', value: '(' },
{ type: 'name', value: 'subtract' },
{ type: 'number', value: '4' },
{ type: 'number', value: '2' },
{ type: 'paren', value: ')' }, <<< 右圓括號
{ type: 'paren', value: ')' } <<< 右圓括號
]
遇到嵌套的 CallExpressions 的時(shí)候,會通過 walk 函數(shù)來處理
*
*/

while (
token.type !== 'paren' ||
(token.value !== ')' && token.type === 'paren')
) {
node.params.push(walk());
token = tokens[current];
}
current++;
return node;
}
throw new Error(`Unknown token type: ${token.type}`);
}

const ast = {
type: 'Program',
body: [],
}

/**
* 使用遞歸函數(shù)將結(jié)點(diǎn)處理進(jìn) ast.body 中
*/

while (current < tokens.length) {
ast.body.push(walk());
}

return ast;
}

遍歷器(visitors)

通過語法分析得到 ast 之后,接下來需要一個(gè)遍歷器 (visitors) 去遍歷結(jié)點(diǎn)。然后當(dāng)遇到某個(gè)類型的結(jié)點(diǎn)的時(shí)候,可以調(diào)用 visitors 中對應(yīng)的類型處理函數(shù):

traverse(ast, {
Program(node, parent) {
// ...
},

CallExpression(node, parent) {
// ...
},

NumberLiteral(node, parent) {
// ...
},
});

因此我們的代碼可以這樣寫:

const traverser = (ast, visitor) => {

// 用于對數(shù)組中的每個(gè)元素都調(diào)用 traverseNode 函數(shù)
const traverseArray = (array, parent) => {
array.forEach((child) => {
traverseNode(child, parent);
});
}

// 函數(shù)接收一個(gè) node 以及其父結(jié)點(diǎn)作為參數(shù)
// 這個(gè)結(jié)點(diǎn)會被傳入到 visitor 中相應(yīng)的處理函數(shù)那里
const traverseNode = (node, parent) => {
const method = visitor[node.type];
if (method) {
method(node, parent);
}
// 對不同的結(jié)點(diǎn)分開處理
switch (node.type) {
case 'Program':
traverseArray(node.body, node);
break;

case 'CallExpression':
traverseArray(node.params, node);
break;

// 這種情況下就沒有子節(jié)點(diǎn)了,直接 break 出去
case 'NumberLiteral':
break;

default:
throw new Error(`Unknown node type: ${node.type}`);
}
}

traverseNode(ast, null);
}

轉(zhuǎn)換器(transformer)

轉(zhuǎn)換器配合上面的遍歷器來一起使用,它接收之前構(gòu)建好的 ast,然后將其和 visitor 一起傳入遍歷器中,從而得到一個(gè)全新的 AST 出來。
原始的 AST 結(jié)構(gòu)為(add 2 (subtract 4 2)):

{
type: 'Program',
body: [{
type: 'CallExpression',
name: 'add',
params: [{
type: 'NumberLiteral',
value: '2'
}, {
type: 'CallExpression',
name: 'subtract',
params: [{
type: 'NumberLiteral',
value: '4'
}, {
type: 'NumberLiteral',
value: '2'
}]
}]
}]
}

轉(zhuǎn)換之后生成的 AST 結(jié)構(gòu)為(add(2, subtract(4, 2))):

{
type: 'Program',
body: [{
type: 'ExpressionStatement',
expression: {
type: 'CallExpression',
callee: {
type: 'Identifier',
name: 'add',
},
arguments: [{
type: 'NumberLiteral',
value: '2',
}, {
type: 'CallExpression',
callee: {
type: 'Identifier',
name: 'subtract',
},
arguments: [{
type: 'NumberLiteral',
value: '4',
}, {
type: 'NumberLiteral',
value: '2',
}]
}]
}
}
}

接下來我們可以這樣編寫對應(yīng)的轉(zhuǎn)換器代碼:

const transformer = (ast) => {
const newAst = {
type: 'Program',
body: [],
}

ast._context = newAst.body;

traverser(ast, {
// 處理 NumberLiteral 類型
NumberLiteral: (node, parent) => {
parent._context.push({
type: 'NumberLiteral',
value: node.value,
});
},

// 處理 CallExpression 類型
CallExpression: (node, parent) => {

// 初始化一個(gè) CallExpression 的新節(jié)點(diǎn)
// 里面放個(gè)嵌套的 Identifier 節(jié)點(diǎn)
const expression = {
type: 'CallExpression',
callee: {
type: 'Identifier',
name: node.name
},
arguments: [],
};

node._context = expression.arguments;

// 看看父節(jié)點(diǎn)是不是 CallExpression
if (parent.type !== 'CallExpression') {

// 如果不是的話,就將 CallExpression 節(jié)點(diǎn)包在一個(gè)叫 `ExpressionStatement` 的語句節(jié)點(diǎn)里
// 這么做是因?yàn)?top level 的 CallExpression 在 JavaScript 中也可以被當(dāng)成是聲明語句
expression = {
type: 'ExpressionStatement',
expression,
};
}

// 最后我們把 CallExpression 放入父結(jié)點(diǎn)的 context 中
parent._context.push(expression);
}
});

return newAst;
}

代碼生成器(code generator)

代碼生成器同樣是個(gè)遞歸函數(shù),最后會將 AST 中的每個(gè)結(jié)點(diǎn)打印到一個(gè)大的字符串中:

const codeGenerator = (node) => {
switch (node.type) {
// 如果是 Program,則會遍歷 'body' 屬性中的每個(gè)結(jié)點(diǎn)
// 并且對這些結(jié)點(diǎn)進(jìn)行遞歸 codeGenerator,再把結(jié)果打印進(jìn)新的一行里面
case 'Program':
return node.body.map(codeGenerator).join('\n');

// 對于 ExpressionStatement 對 expression 屬性進(jìn)行遞歸調(diào)用,并加個(gè)分號
case 'ExpressionStatement':
return `${codeGenerator(node.expression)};`;

// 對于 CallExpression 對 callee 屬性進(jìn)行遞歸調(diào)用,接著加上(括號
// 然后對 arguments 屬性進(jìn)行遞歸調(diào)用,并加上)括號
case 'CallExpression':
return `${codeGenerator(node.callee)}(${node.arguments.map(codeGenerator).join(', ')})`;

// 對于 Identifier,直接返回 name
case 'Identifier':
return node.name;

// 對于 NumberLiteral,直接返回 value
case 'NumberLiteral':
return node.value;

default:
throw new Error(`Unknown node type: ${node.type}`);
}
}

編譯器(Compiler)

到這一步,基本上所有的流程就已經(jīng)完成了,我們可以創(chuàng)建一個(gè) compiler 函數(shù),通過調(diào)用上面的函數(shù)就可以完成整個(gè) compiler 的工作了:

  1. input => tokenizer => tokens

  2. tokens => parser => ast

  3. ast => transformer => newAst

  4. newAst => generator => output

代碼只需要以下簡單幾步即可:

const compiler = (input) => {
const tokens = tokenizer(input);
const ast = parser(tokens);
const newAst = transformer(ast);

return codeGenerator(newAst);
}

我們可以輸入前面的幾組測試?yán)?,能保證得到的結(jié)果是正確的。

總結(jié)

至此一個(gè) tiny-compiler 就被造出來了,babel 的編譯流程也是基于此來完成,因?yàn)?babel 本身是個(gè) source to source 的 compiler,整個(gè)流程也是分為 parser -> transform -> code generate 這三個(gè)步驟完成,具體可以參考?https://babeljs.io/docs/en/#babel-is-a-javascript-compiler

希望本文能幫助讀者理解相關(guān)編譯工具的編譯流程。

瀏覽 45
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評論
圖片
表情
推薦
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 国产又猛又黄又爽| 人妻无码免费视频| 亚洲精品无码中文字幕| 中文久久久| 凸凹翔田千里无码| 91热99| 欧美日韩小视频| 亚洲精品人妻在线| 天天干天天射天天爽| 揄拍成人国产精品视频| 日本高清版色视频| 偷拍一区| 久久免费视频观看| 能看的av| 色色五月丁香婷婷| 欧美AAAAAAAA| 中文字幕天堂网| 亚洲无码成人电影| 亚洲一区在线播放| 亚洲精品成人视频| 91在线无码精品秘入口男同| 天天插天天拍| 黄色性爱网址| 国产色婷婷一区二区| 黄色成人18| 人人操在线观看| 高清无码二区| 污视频网站在线观看| 俺也去网av| 蜜桃视频欧美| 精品无码免费看专区| 草久久| 国产福利精品视频| 亚洲欧洲成人在线| 激情人妻AV| 91性爱视频在线观看| 欧美成人综合色| 囯产伦精一区二区三区四区| 欧美精品A级片| 中文字幕有码在线观看| 无码人妻一区二区三区线花季传件| 午夜性爱网站| 欧美国产三级| 亚洲精品秘一区二区三区在线观看| 亚洲熟妇在线观看一区二区| 亚洲AV无码高清| 五月天婷婷AV| 香蕉婷婷亚洲丁香| 一区二区视频免费| 日韩A片在线观看| 性V天堂| 婷婷色AV| 亚洲精品久久久久久久久久久| 欧美伊人久久| 日韩色逼| 国产乱╳╳AⅤ毛片| 色噜噜狠狠一区二区三区| A片免费的| 国产av探花| 精品成人| 人人妻人人干| 99热亚洲| 99人妻人人爽人人添人人精品| 蜜桃视频一区二区| 亚洲AV无码| 中国一级黄色毛片| 国产男女视频| 欧美在线中文| 久久人妻精品| 翔田千里中文字幕无码| 久久a视频| a片网站在线观看| 亚洲国产成人精品女人久久| 成人黄网站在线观看| 国产寡妇亲子伦一区二区三区四区 | 黄色性爱网址| 超碰97观看| 天天色小说| 国产吃奶| 最近中文字幕在线视频| 亚洲在线高清视频| 思思久久高颜值| 无码高清视频| 欧亚无码| 91熟女丰满原味| 国产天天操| 日韩免费AV| 日韩在线视频免费观看| 日韩人妻中文字幕| www.啪啪| 黄色视频日本| 国产一级a| 91在线看| 午夜成人福利| 日韩A片| 四川少妇BBw搡BBBB槡BBBB| 伊人毛片| 成人视频网| 亚洲成人无码在线观看| 成人视频网站18| 大香蕉国产视频| 青娱乐青青草| 黄色视频| 自慰喷水流白浆中文字幕| 日韩成人精品| 亚洲欧美日韩黑料吃瓜在线观看| 插进去综合图| 成人免费视频性爱| 韩国三级中文字幕HD久久精品| 最新国产激情视频| 少妇无码中文| 麻豆精品传媒国产剧的特点| 色99在线视频| 激情二区| 亚洲电影免费观看| 国产三级性爱视频| 国产精品久久久大香蕉| 宅男噜噜噜66一区二区| 91在线不卡| 成人性爱在线视频| 人妻无码不卡| 亚洲av毛片| 色综合天天综合成人网| 久久精品国产精品| 成人精品久久| 国产小骚逼| 97操碰| 特级西西WWW888| 成人福利在线| 超碰人人干| 日韩性爱视频| 天天插在线视频| 亚洲人妻免费视频| 亚洲中文无码在线观看| 天堂中文资源在线观看| 日本中文字幕在线观看视频| 国产精品XXX视频| 国产又爽又黄免费网站在| 中文字幕日本精品5| 激情视频免费在线观看| 免费在线观看a片| 久久这里只有精品99| 亚洲无aV在线中文字幕| 亚洲免费视频在线播放| 操老女人逼| 996热| 亚洲国产97| 狠狠撸狠狠撸| 操逼手机视频| 伊人久久无码| 艹逼在线观看| 无码av一区| 337p大胆色噜噜噜噜噜| 91蜜桃在线| 国产无码自拍| 国产成人AV免费观看| 中文在线最新版天堂8| 久久精品国产AV| 无码人妻AⅤ一区二区三区| 宅男噜噜噜66一区二区| 成人黄色视频网站在线观看| 日本伊人大香蕉| 人人操在线播放| 欧美日韩精品一区二区三区钱| 国产三级网站| 三级片日本在线| 性欧美xxxx| 亚洲无码乱码av| 一区二区三区四区五区| 国产尤物视频| 国产小骚逼| 免费黄色毛片| 日本女优婷婷青青草原| 黑人AV在线播放| 国产精品欧美日韩| 91成人久久| 久久综合伊人777777| 97视频在线观看免费| 中文天堂网| 九九热九九| 日韩av中文在线| 午夜精品在线观看| 亚洲69v久久久无码精品| 一本色道无码道| 国产精品视频福利| 久久久性爱视频| 久久夜色精品噜噜亚洲AV| 激情乱伦网站| 国产亚洲精品午夜福利巨大软件| 日本高清视频免费观看| 2025AV天堂| 江苏妇搡BBBB搡BBB| 午夜性爽视频男人的天堂| 中文亚洲精品字幕电影| 国产精品1区2区3区| av777777| 日本操逼电影| 黄网站免费观看| 欧美精品无码久久久精品酒店| 欧美色图色就是色| 精品国产A片| 91蝌蚪视频在线观看| 久久精品成人电影| 韩国高清无码60.70.80| 视频一区在线播放| 一插菊花网| 国产免费a片| 亚洲天堂无码视频| 亚洲吹箫| 在线看毛片网站| jlzzzjlzzz国产免费观看| 国产AV无码成人精品区| 中文视频在线观看| 性欧美成人播放77777| 在线亚洲观看| 在线中文字幕视频| 毛片自拍| 美女91小视频| 在线观看黄色网| www.yw尤物| 99热9| 亚洲av高清| 熟女人妻在线| 亚洲欧美日韩综合| 日韩一级无码| 激情青青草| 色综合999| 成人a片在线观看| 久久人妻中文字幕| 久久无码影院| 亚洲秘无码一区二区三区电影| 神马午夜秋霞不卡| 操逼视频国产| 欧美成人性色欲影院| 成人黄色录像| 国产一级女婬乱免费看| 一区二区不卡视频| 男女啪啪啪| 久草电影在线观看| 国产高清无码一区二区三区| 无码人妻AⅤ一区二区三区A片一| 亚洲日韩精品欧美一区二区yw| 国产女人18毛片水真多成人如厕| 国产熟妇婬乱A片免费看牛牛 | 国产精品自拍三级| 亚洲成人性爱网| 2019中文字幕在线免费观看| 4388亚洲最大| 亚洲精品久久久蜜桃| 大鸡巴在线观看| 国产成人高清在线| 午夜乱伦福利| 国产精品久久精品| 欧美色成人免费在线视频| 久久五月天综合| 日韩av在线电影| 毛片福利| 国偷自产视频一区二区久| 蜜桃av无码一区三区| 日本十八禁网站| 热热毛片| 开心黄色网| 欧美成人精品激情在线视频 | 亚洲美女网站在线观看| 无码电影免费观看| 91免费视频观看| 亚洲精品一区二区三区蜜桃| 在线黄色视频网站| 黄a在线观看| 91就要爱爱视频| 国产一级片无码| 日本五十路熟女视频| 天天操夜夜骑| 欧美wwwww| 国产成人无码免费| 国产色情性黄片Av网站| 啪啪视频m3u8| 国产熟女| 精品视频一区二区| 国产人成视频| 成人a视频| 91一区二区| 黄色综合网站| 男女69视频| 爆操约了良家| 国产在线播放av| 色欲一区| 亚洲精品字幕久久久久| 国产粉嫩在线观看| 一级黄色视频网站| 免费无遮挡视频网站视频| 少妇bbb搡bbbb搡bbbb| 日韩av免费| 西西人体BBBBBB| 国产精品久久久久久久久久久久久| AV在线免费播放| 国产又粗又大又爽| 国产无遮挡A片又黄又爽小直播 | 亚洲成人精品视频| 久久婷视频| 91黑人丨人妻丨国产丨| 制服丝袜乱伦| 嫩草A片www在线观看| 国产免费高清| 熟女一区| 无码六区| 一区二区三区四区无码视频| 午夜福利sw| 久久男人| 日韩无码免费| 日本一级特级毛片视频| 大香蕉官网| 97综合久久| 欧美成人性爱图片| 高清无码在线视频| 欧美三级无码| 久热精品视频在线观看| 亚洲视频在线免费| 色婷婷亚洲婷婷| 国产91探花系列在线观看| 欧美黄色性爱| 国产免费无码一区二区| 国产精品人妻无码久久久郑州天气网| 欧美日韩一区在线| 尤物视频网站在线观看| 成年女人免费视频| 日本三级片视频不卡| 四川美人搡BBw搡BBw| 综合天堂AV久久久久久久| AV国产在线观看| 成人无码人妻| 婷婷成人五月天| 亚洲无码1区| 免费在线观看黄片| 爱草在线| 午夜国产视频| 蜜桃传媒在线播放| 豆花成人社区,视频| 东北老女人性爱视频| 成片免费观看视频大全| 欧美日韩伊人| 蜜桃91在线| 午夜福利久久| 人妻无码高清| 午夜亚洲国产一区视频网站| 久久精品导航| 午夜日韩| 黑人无码AV| 黄色网页在线免费观看| 亚洲AVwww| 中文字幕精品一区| 中文字幕精品视频| 成人在线黄片| 色播婷婷五月天| 精品国产精品国产精品国产网站| 免费观看黄色一级片| 久久午夜无码人妻精品蜜桃冫| 久久亚洲国产| 天天干天天射天天| 翔田千里无码在线| 豆花成人在线| a级毛片在线观看| AV在线不卡中文| 日本理论片一道本| 人人爽人人操| 国产精品精品精品| 日本色综合| 超碰九色| 手机看片久久| 免费在线观看Av| www.插插插| 99热精品2| 日韩一级黄色| 北条麻妃成人视频| 日韩一级免费视频| 五月天操逼网站| 成人做爰黄A片免费看陈冠| 91国在线视频| 操逼网站免费观看| 爱爱亚洲| 一区二区黄色| 波多野结衣AV在线观看| jizz在线观看视频| 久久群交| 亚洲色图15P| 日韩精品成人免费观看视频| 丁香六月婷婷久久综合| 亚洲精品成人无码AV在线| 天天操嫩逼无套视频| 无码V| 国产美女操逼网站| 久久一二三区| 色99在线| www.97色色| 69国产成人综合久久精品欧美 | 丁香激情视频| 91精品国产偷窥一区二区| 五月天啪啪视频| 欧美一级婬片免费视频黄| 粉嫩99精品99久久久久久特污| 亚洲视频第一页| 韩国一区二区三区| 香蕉婷婷亚洲丁香| 日韩成人一区二区| 亚洲在线观看网站| 无码人妻丰满熟妇区毛片视频| 国产精品福利在线播放| 精品福利在线观看| 青青草原网站在线观看| 啪啪视频国产| 国产成人午夜福利在线| 亚洲熟妇在线观看一区二区| 春色激情| 婷婷综合素质二区| 超碰在线日韩| 骚逼AV| 最近日本中文字幕中文翻译歌词| 一本一道久久综合狠狠躁牛牛影视 | 黄色激情视频网站| 91无码精品国产AⅤ| 97精品人妻| av在线免费观看网站| 伊人在线综合| 特级西西WWW888| 成人一级a片| 日日干天天日| 人人干人人摸人人操| 亚洲天堂在线看| 色色com| 91乱子伦国产乱子伦海的味道| a免费在线| 青草社区在线观看| 久久久成人免费电影| 欧美成人国产| 国产av高清| 国产四区| 欧美性爱XXXX黑人XYX性爽| 黄色影视不卡| 国产精品综合激情| 粉嫩99精品99久久久久| 热久久综合网站| 成年人黄色网址| 黄色片视频免费| 国产成人精品片| 日韩视频免费在线观看| 黄色国产AV| 无码精品黑人| 亚洲精品乱码久久久久久按摩观| 国产成人无码免费看片| 日韩欧美中文字幕公布| 国产卡一卡二在线观看| 亚洲日韩视频在线观看| 成人短视频在线观看| 人妻少妇综合| 亚洲日操| 亚洲精品自拍| 亚洲人妻一区二区| 成人综合在线观看| 麻豆一区视频| 91av在线看| 国产AV日韩AV| 亚洲成人av无码| 亚洲三级国产| 日韩无码成人| 操小骚逼视频| 蜜桃视频网址| 日本中文字幕视频| WWW.豆花视频精品| 强伦轩农村人妻| 337p西西人体大胆瓣开下部| 久久久久久久伊人| 99久久人妻精品免费二区| 在线播放中文字幕| 91麻豆精品传媒国产| 亚洲日韩视频在线播放| 3D动漫操逼视频| 就去色色五月天| 丁香六月| 成人自拍视频在线观看| 强伦轩人妻一区二区三区四区| 久久久高清无码视频| 特猛特黄AAAAAA片| 蜜桃传媒一区二区| 翔田千里无码XXXXXX| 无码看片| 四虎麻豆| 日韩欧美人妻无码精品| 俺也来俺也去WWW色| 亚洲三级视频| 日韩免费一级片| 日B视频在线观看| 亚洲一级a片| 大香蕉在线99| 色色色色色色网站| 久操久操| 午夜影音| 亚洲欧洲精品在线| 色婷婷影音| 亚洲AV无码成人精品区在线欢看| 97爱视频| 日韩精品毛片一区二区视频免费| 乳揉みま痴汉电车羽月希免费观看 | 麻豆videos| 欧美一级黄色片| 中文字幕av久久久久久欧洲尺码 | 日逼一级| 久久黄色视频| av解说| 国产suv精品一区二区| 奇米狠狠色| 操比在线| 日韩欧美成人在线视频| 国产精品无码激情| 欧美三级欧美三级三级| 梁祝艳谭A级毛片| 大香蕉在线视频观看| 国产乱码在线| 国产熟女一区二区久久| 日韩视频在线播放| 骚逼影院| 四虎在线观看| 国内自拍偷拍| 亚洲精品蜜桃| 色色热| 黄片高清无码| 成人国产精品视频| 久操无码| 97欧美| 欧美精品日韩在线观看| 欧美成人免费电影| 欧美成人精品在线观看| 国产精品久久久久无码| 自拍偷拍网址| 伊人综合大香蕉| 午夜天堂精品久久久| 成人做爰黄A片免费看| 国产精品无码激情| 一区二区三区不卡在线| 九九热视频在线| 香蕉午夜视频| 日本黄色色情视频| 国产高清小视频| AV高清无码在线| 久久黄色成人视频| 亚洲av大片| 久久2| 国产a片免费观看| 人妻无码中文字幕蜜桃| 亚洲第一色播| 超碰国产97| 日日搔AV一区二区三区| 欧性猛交ⅩXXX乱大交| 成人毛片AV无码| 草草视频在线观看| 在线观看黄色网| 亚洲成人无码av| 日批免费视频| AV不卡在线| 黄片高清无码| 大黑鸡巴视频| 操操操操操| 九九热精品| 午夜亚洲国产一区视频网站| 中文字幕韩日| 午夜三级视频| 天天做天天爱夜夜爽| www激情| AV高清无码在线| 懂色AV一区二区三区国产中文在线| 成人网站免费视频| 亚洲偷拍网| 91久久久久久| 久久久久网站| 91精品国产综合久久久久久| 色婷婷av| 蜜桃视频网站在线观看| 嗯啊在线视频| 中文字幕第一页av| AV在线免费网站| 婷婷精品国产一区二区三区日韩 | 日韩亚洲天堂| 伊人成人小说| 大鸡巴久久| www黄片| 国产91白浆四溢| 亚洲天堂AV2025| 日韩欧美高清在线| 日韩一区不卡| xxxxx日韩| 亚洲精品午夜精品| 亚洲日韩电影| 欧美婷婷五月| 亚洲熟妇在线观看| 精品亚洲一区二区三区四区五区 | 精品国产A片| 中文字幕四区| 99er热精品视频| 天天日天天爽| 中文字幕视频在线免费观看| 色国产视频| 国产黄色视频免费看| 国产一级二级在线观看| 91色婷婷综合久久中文字幕二区 | 97视频网站| 成人无码日韩精品| 日韩性爱视频网站| 亚洲第一视频| 91久久久精品| 日韩無码专区| 国产在线毛片| 涩久久| 无码秘蜜桃一区二区| 国内免费毛片| www.豆花福利视频| 亚洲午夜久久久久久久久红桃 | 星空AV| 精品国产A片| 亚洲熟女视频| 亚洲久久久| 中国熟女视频| 色哟哟一中文字慕| 成人网站毛片| 人妻少妇精品视频| 亚洲日韩一区二区三区| 黄色国产网站| 无码人妻中文字幕| 一区二区三区在线观看| 国产在线观看黄| 黄色在线视频观看| 久久久亚洲熟妇熟女| 在线人妻| 波多野结衣无码网站| 日韩在线视频免费播放| 国产性爱在线观看| 欧洲毛片基地c区| 1000部毛片A片免费视频| 大香蕉超碰在线| 91精品无码| 伦理无码| 永久免费无码中文字幕| 污视频在线免费观看| 欧美日韩AV| 亚洲插菊花综合网| a在线免费观看| 婷婷九月色| 日本一区二区视频在线| 一级大片| 中文无码日韩| 91热爆TS人妖系列| 日韩精品中文字幕无码| 91熟女丰满原味| 免费视频亚洲| 欧美特黄AAAAAAAAA片| 亚洲日韩中文字幕| 3D动漫操逼视频| 亚洲欧美日韩综合| 国产一级婬片A片免费妖精视频| 中文字幕国产一区| 狠狠干干| 尤物一区二区| 欧美亚洲成人电影| 日韩在线视频播放| 日本色五月| 成人久久久久| 99精品视频在线| 国产白浆一区二区三区| 精品成人A片久久久久久不卡三区| 男女日皮视频| 国产h在线播放| 黄色一级片网站| 中文在线最新版天堂8| 思思热思思操| 亚洲综合婷婷| 黄色生活片| 婷婷免费视频| 99久久综合国产精品二区| 老妇槡BBBB槡BBBB槡| 久久V| 亚洲成人在线观看视频| 91成人精品视频| 黄色网页免费观看| 亚洲二级片| 北条麻妃在线播放一区| 小明看台湾成人永久免费视频网站| 四川w搡BBB搡wBBB搡| 国产精品人人人人| 免费黄色视频观看| 国产一区免费观看| 激情人妻AV| 色图在线观看| 99热国产在线观看| 亚洲无码中文字幕在线观看| www.豆花福利视频| 亚洲日韩精品中文字幕在线| 秋霞欧美在线| 老司机免费视频| AV成人无码| 婷婷五月天在线播放| 精品视频导航| 日本A级毛片| 五月丁香婷婷开心| 免费看18禁| 91丨豆花丨国产极品| 视频在线观看一区| 操大逼视频免费国产| 天天干天天日| 中文字幕乱伦| 人妻精品无码| 国产黄色视频在线观看| 色色综合视频| 2025AV中文字幕| 人人色人人看| 国产91探花系列在线观看| 超碰人人在线观看| 亚洲天堂av在线免费观看| 天堂网2014| 精品精品视频| 无码AV大香线蕉伊人| 欧美wwwww| 大黑鸡巴视频| 天天综合网久久| 六月丁香激情| 精品尤物在线| 色五月丁香婷婷| 日韩成人免费观看| 国产激情都市一区二区三区欧美 | 热久久免费视频| 成年片| 老女人操逼网| 久久韩国| 久久私拍视频| 91人人澡人人爽人人看| 一个人看的www日本高清视频| 青青草原亚洲| 亚洲激情一区| 女人的天堂网| 亚洲日韩中文无码| 加勒比一区二区三区| av在线天堂| 亚洲av自拍| 大地资源第三页在线观看免费播放最新 | 人人干视频| 欧美色性乐汇操日本娘们| 中文字幕在线视频免费观看| 我要操视频| 婷婷一区二区三区| 竹菊传媒一区二区三区| 一本到在线观看午夜剧场| AV无码观看| 美女被操面费网站| 日韩操逼片| 天天插一插| 十八禁福利网站| 成人欧美在线| 国产丝袜人妖TS系列| 色色丁香五月天| 日本不卡一区二区三区| 免费操逼电影| 麻豆一区视频| 污污污www精品国产网站| 五月丁香婷婷基地| 国产欧美一级片| 西西人体大胆ww4444| 自拍偷拍图区| 亚洲A网站| 国产激情无码视频| 黄色天堂| 成人一区二区在线| 成人无码中文字幕| 中文字幕在线免费看线人| 色99在线| 亚洲福利视频电影精| 一本一道AV| 麻豆成人精品| 国产精品特级毛片| www.久久99| 亚洲日产专区| 高潮91PORN蝌蚪九色| 人人爽人人爽| 国产免费a| 日本成人电影一区二区三区| 日本乱码视频| 国产精品一二三区| 亚洲视频免费在线播放| 国产AV剧情| 日韩三级在线免费观看| 国产一区免费| 国产乱伦对白| 五月婷在线视频| 啪啪视频国产| 日韩国产一区| 亚洲精品一级二级三级| 三级毛片在线| 十八禁福利网站| 日本东京热视频| www.超碰在线| 亚洲日韩AV无码| 亚洲欧洲日本在线| 影视先锋久久| 无码日逼| 免费的操逼视频| 2019人人操| 国产中文字字幕乱码无限| 欧美激情视频在线| 色婷婷久久综合久色| 懂色av粉嫩av蜜臀av| 国产主播中文字幕| 日本中文不卡| 欧美亚洲成人网站| 欧美视频在线观看| 九色影院| 黄页网址在线观看| 欧美群交videotv群交| 欧洲在线观看| 久久99精品国产.久久久久| 日韩视频第一页| 天天干天天日天天| 国产香蕉av| 国产免费www| 人妻日日| 国产AV大香蕉| 高清无码一区二区三区| 国产丨熟女丨国产熟女视频| 天天拍天天操| 啪啪网站免费观看| 亚洲精品在线视频观看| 欧美日韩V| 菊花插综合网| 热热毛片| 中文字幕毛片| 国产黃色AAA片| 成人免费在线| 强伦轩人妻一区二区三区四区| 亚洲精品久久久久毛片A级绿茶| 日韩一区二区三区四区久久久精品有吗 | 欧美日在线观看| 中国操逼电影| 六月婷婷五月天| 亚洲草比视频网| 亚洲中文av| 亚洲精品黄色| 五月婷婷激情网| 日韩国产中文字幕| 99热青青草| 激情深爱五月| 国产嫩苞又嫩又紧AV在线| 黄色在线视频观看| 99在线精品视频观看| 一区二区免费在线观看| 污污污污污www在线观看优势 | 成人黄色在线| 免费看a| 欧美性爱一区二区| 午夜福利欧美| 日本一区二区三区在线视频| 青草无码视频| 日韩a级片| 日韩成人一区二区| 国产AV| 影音先锋av资源在线| 蜜桃av秘无码一区三| 男人天堂网av| 成人福利视频在线| 免费看黄视频| 怡红院在线观看| www.黄色在线| 国产高潮视频在线观看| 免费一级欧美片在线观看| 国产麻豆精品ThePorn| 久久亚洲Aⅴ成人无码国产丝袜| 九九草在线视频| 无码精品黄色片| 激情日逼| 亚洲精品成人片在线观看精品字幕| 亚洲天堂天天| 91在线91| 国产成人无码毛片| 激情另类| 欧美成人色| 亚洲日韩精品在线视频| 国产一级a毛一级a做免费的视频 | 久久人操| 国产一级性爱视频| 亚洲精品国产成人| 干干影院| 在线播放毛片| 人妻黄色| 丰满熟妇高潮呻吟无码| 一区二区三区四区av| 欧美色图另类图片| 日本狠狠干| 91无码秘蜜桃一区二区三区-百度 精品人妻一区二区三区在线视频不卡 | 欧美国产日韩欧美亚洲国产| 女BBBBBB女BBB| 国产精品爽爽久久久| 久久久精品999| 成人在线日韩| 欧美性生交18XXXXX无码| 婷婷五月天大香蕉| 9热精品|