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

從零開始構(gòu)建編程語言的挑戰(zhàn)與樂趣

譯文 精選
開發(fā)
大約 15 年前,當(dāng)我剛開始職業(yè)生涯并偶然踏入編譯器構(gòu)建領(lǐng)域時,我的團(tuán)隊(duì)架構(gòu)師遞給我一本 《龍書》,并強(qiáng)調(diào)這是一部經(jīng)典之作,需要倍加珍惜。不過不幸的是,有一天晚上我閱讀時不慎睡著,書本從手中滑落,重重地落在地板上。還書的時候,我非常希望他沒注意到封面上的那個小凹痕。

譯者 | 劉汪洋

審校 | 重樓

“這本書是經(jīng)典之作,要好好拜讀。”

大約 15 年前,當(dāng)我剛開始職業(yè)生涯并偶然踏入編譯器構(gòu)建領(lǐng)域時,我的團(tuán)隊(duì)架構(gòu)師遞給我一本 《龍書》,并強(qiáng)調(diào)這是一部經(jīng)典之作,需要倍加珍惜。不過不幸的是,有一天晚上我閱讀時不慎睡著,書本從手中滑落,重重地落在地板上。還書的時候,我非常希望他沒注意到封面上的那個小凹痕。

《龍書》首版發(fā)行于 1986 年,那時構(gòu)建編譯器是一項(xiàng)極具挑戰(zhàn)性的任務(wù),它集計(jì)算機(jī)科學(xué)和編程技術(shù)、藝術(shù)之大成。近四十年后,我再次面對這一挑戰(zhàn)。如今,這項(xiàng)任務(wù)的難度又是怎樣的呢?接下來,讓我們深入探討創(chuàng)建一種新語言所涉及的內(nèi)容,以及現(xiàn)代工具如何簡化這一過程。

目標(biāo)語言

為了更明確我們的目標(biāo),我們會構(gòu)建一個具體的語言。我發(fā)現(xiàn)用實(shí)際案例來說明,比理論模型更有效。因此,我選擇了我們在  ZenStack 開發(fā)的 ZModel 語言作為例子。ZModel 是一種用于建模數(shù)據(jù)庫表和訪問控制規(guī)則的領(lǐng)域特定語言(DSL)。為了保持文章的簡潔,我只展示其中的部分功能。我們的目標(biāo)是編譯下面的代碼:

model User {
  id Int
  name String
  posts Post[]
}

model Post {
  id Int
  title String
  author User
  published Boolean

  @@allow('read', published == true)
}

這里簡要說明幾點(diǎn):

  • model 關(guān)鍵字用于定義一個數(shù)據(jù)庫表,其字段對應(yīng)表中的列。
  • 模型可以相互引用,構(gòu)建關(guān)系。在此例中,User 和 Post 模型構(gòu)成了一對多關(guān)系。
  • @@allow 關(guān)鍵字用于定義訪問控制規(guī)則。它接受兩個參數(shù):一個是訪問類型(“create”、“read”、“update”、“delete” 或 “all”),另一個是布爾表達(dá)式,用于判定是否允許該操作。

讓我們開始動手編譯這段代碼吧!

注:ZModel 是  Prisma Schema Language 的擴(kuò)展版本。

六個步驟構(gòu)建編程語言

第 1 步:從文本到語法樹

盡管多年來編譯器的構(gòu)建步驟基本保持不變,但一些高級語言構(gòu)建工具已經(jīng)能夠簡化這些步驟。這些工具可以直接將文本轉(zhuǎn)換成語法樹。構(gòu)建過程首先需要一個詞法分析器(lexer),它將文本分解成標(biāo)記(tokens)。然后,解析器(parser)會將這些標(biāo)記組織成解析樹(parse tree)?,F(xiàn)代工具往往可以將這兩個步驟整合,直接從文本生成語法樹。

我們采用了 Langium,這是一個基于 TypeScript 的開源軟件工具包,專門用于語言構(gòu)建。Langium 提供了直觀的領(lǐng)域特定語言(DSL),讓我們能夠定義詞法和解析規(guī)則。

值得一提的是,Langium DSL 本身也是用 Langium 構(gòu)建的。這種自我遞歸的過程,在編譯器領(lǐng)域被稱為自舉(bootstrapping)。通常,編譯器的最初版本需要用另一種語言或工具來編寫。

下面是我們的 ZModel 語言的正式語法定義:

grammar ZModel

entry Schema:
    (models+=Model)*;

Model:
    'model' name=ID '{'
        (fields+=Field)+
        (rules+=Rule)*
    '}';

Field:
    name=ID type=(Type | ModelReference) (isArray?='[' ']')?;

ModelReference:
    target=[Model];

Type returns string:
    'Int' | 'String' | 'Boolean';

Rule:
    '@@allow' '('
        accessType=STRING ',' condition=Condition
    ')';

Condition:
    field=SimpleExpression '==' value=SimpleExpression;

SimpleExpression:
    FieldReference | Boolean;

FieldReference:
    target=[Field];

Boolean returns boolean:
    'true' | 'false';

hidden terminal WS: /\s+/;
terminal ID: /[_a-zA-Z][\w_]*/;
terminal STRING: /"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/;

這個語法定義清晰且易于理解,包含兩個主要部分:

  • 詞法規(guī)則
    底部的終結(jié)符規(guī)則定義了如何將源文本分解為標(biāo)記。我們的簡單語言包含標(biāo)識符(ID)和字符串(STRING)兩種標(biāo)記類型。空格字符在這里被忽略。
  • 解析規(guī)則
    其他部分是解析規(guī)則,決定了如何將標(biāo)記流組織成一棵樹。解析規(guī)則中也包含關(guān)鍵字(如 Int、@@allow),這些關(guān)鍵字同樣參與詞法分析。在更復(fù)雜的語言中,可能會出現(xiàn)遞歸的解析規(guī)則(例如,嵌套表達(dá)式),這需要特別注意設(shè)計(jì),但我們的示例語言結(jié)構(gòu)較為簡單,暫不涉及此類情況。

通過定義好的語言規(guī)則,我們可以利用 Langium 的 API 將示例代碼轉(zhuǎn)換成如下解析樹:

第 2 步:從語法樹構(gòu)建鏈接樹

解析樹極大地幫助我們理解源代碼的語義。但為了進(jìn)一步完善解析樹,我們還需要進(jìn)行一些額外的步驟。

在我們的 ZModel 語言中,出現(xiàn)了“循環(huán)引用”的情況。例如,User 模型的字段被 Post 模型的 author 字段引用。當(dāng)我們?yōu)g覽解析樹時,會遇到引用“Post”這個名字的節(jié)點(diǎn),但無法直接得知“Post”具體指代什么。雖然可以進(jìn)行特定的搜索來找到匹配的模型名稱,但更系統(tǒng)的做法是執(zhí)行一次“鏈接”操作,將這些引用解析并鏈接到它們的目標(biāo)節(jié)點(diǎn)。完成這一鏈接后,我們的解析樹將轉(zhuǎn)變?yōu)槿缦滤荆榱撕喕故?,這里只展示樹的一部分):

從技術(shù)角度看,此時的結(jié)構(gòu)更像是圖而非樹,但我們依舊習(xí)慣性地稱之為解析樹。

Langium 在這方面有顯著優(yōu)勢,它能自動完成大部分鏈接工作。這個工具遵循解析節(jié)點(diǎn)的嵌套層次,利用這一結(jié)構(gòu)構(gòu)建“作用域”。它解析遇到的名稱,并將它們鏈接到正確的目標(biāo)節(jié)點(diǎn)。在語言較為復(fù)雜的場景中,可能會遇到需要特別處理的情況。Langium 允許用戶自定義實(shí)現(xiàn)幾個服務(wù),從而簡化這個過程,讓鏈接操作更加高效。

第 3 步:從鏈接樹到語義正確性檢查

如果源文件包含詞法或解析錯誤,編譯器會報(bào)錯并終止處理。

例如:

model {
  id
  title String
}

編譯器可能會報(bào)如下錯誤:

期望的是 'ID' 類型的標(biāo)記,但實(shí)際發(fā)現(xiàn) `{`。[第1行,第7列]

但是,代碼即使沒有詞法或解析錯誤,也不一定在語義上正確。以以下代碼為例,它在語法上是有效的,但在語義上卻是錯誤的。原因是將 title 與 true 進(jìn)行比較是無意義的操作。

model Post {
  id Int
  title String
  author User
  published Boolean

  @@allow('read', title == true) // <- 這類比較應(yīng)當(dāng)是無效的
}

語義規(guī)則通常是特定于語言的,并且工具很難自動處理這些規(guī)則。Langium 解決這個問題的方法是,為不同節(jié)點(diǎn)類型提供驗(yàn)證鉤子。

例如:

export function registerValidationChecks(services: ZModelServices) {
    const registry = services.validation.ValidationRegistry;
    const validator = services.validation.ZModelValidator;
    const checks: ValidationChecks<ZModelAstType> = {
        SimpleExpression: validator.checkExpression,
    };
    registry.register(checks, validator);
}

export class ZModelValidator {
    checkExpression(expr: SimpleExpression, accept: ValidationAcceptor): void {
        if (isFieldReference(expr) && expr.target.ref?.type !== 'Boolean') {
            accept('error', '條件中只允許使用布爾字段', {
                node: expr,
            });
        }
    }
}

現(xiàn)在,我們可以針對語義問題,得到更準(zhǔn)確的錯誤提示:

條件中只允許使用布爾字段 [第7行,第19列]

與詞法分析、解析和鏈接過程不同,語義檢查通常不是非常聲明式或系統(tǒng)化的。對于復(fù)雜的語言,你可能需要編寫許多命令式代碼規(guī)則。

圖片引用自 《特征工程的方法和原理》

第 4 步:優(yōu)化開發(fā)者體驗(yàn)

在當(dāng)今軟件開發(fā)領(lǐng)域,為開發(fā)者提供優(yōu)秀的工具體驗(yàn)非常重要。一個成功的開發(fā)工具不僅要運(yùn)行良好,還要提供出色的用戶體驗(yàn)。在語言和編譯器開發(fā)中,關(guān)注開發(fā)者體驗(yàn)(DX)主要涉及以下幾個方面:

  • IDE 支持

優(yōu)秀的集成開發(fā)環(huán)境(IDE)支持,如語法高亮、代碼格式化、自動補(bǔ)全等,可以顯著降低學(xué)習(xí)曲線,提高開發(fā)者的工作效率。Langium 的一個重要優(yōu)勢是支持 Language Server Protocol(語言服務(wù)器協(xié)議)。這意味著你的解析規(guī)則和驗(yàn)證檢查可以自動轉(zhuǎn)換為一個基礎(chǔ)的 LSP 實(shí)現(xiàn),兼容 Visual Studio Code 和最新的JetBrains IDEs(有限制)。但要提供卓越的 IDE 體驗(yàn),你還需擴(kuò)展 Langium 默認(rèn)的 LSP 相關(guān)服務(wù),進(jìn)行深度優(yōu)化。

  • 錯誤報(bào)告

你的驗(yàn)證邏輯會在多種情況下生成錯誤消息。這些消息的準(zhǔn)確性和實(shí)用性極大地影響了開發(fā)者理解和修復(fù)錯誤的速度。

  • 調(diào)試

如果你的語言支持“執(zhí)行”(這一點(diǎn)我們將在下一節(jié)詳細(xì)討論),提供調(diào)試工具就非常重要。調(diào)試的具體內(nèi)容取決于語言特性。對于包含語句和控制流的命令式語言,可能需要支持步進(jìn)調(diào)試和狀態(tài)檢查。而對于聲明式語言,調(diào)試可能意味著提供可視化工具,幫助理解復(fù)雜結(jié)構(gòu),如規(guī)則和表達(dá)式等。

第 5 步:發(fā)揮實(shí)際應(yīng)用價(jià)值

解析出一個無錯誤的解析樹是非常有趣的,但這本身并不足以產(chǎn)生實(shí)際應(yīng)用價(jià)值。從這一步開始,你有幾個選項(xiàng)來生成實(shí)際的應(yīng)用價(jià)值:

1.就此停止

你可以選擇在此階段停止,將解析樹作為最終成果,并讓用戶決定如何使用它。

2.轉(zhuǎn)換成其他語言

通常一種語言會有一個“后端”來將解析樹轉(zhuǎn)換成更低級的語言。舉個例子,Java 編譯器的后端生成 JVM 字節(jié)碼,TypeScript 的后端生成 JavaScript 代碼。在 ZenStack 中,我們將 ZModel 轉(zhuǎn)換成 Prisma Schema Language,并由目標(biāo)語言的工具或運(yùn)行時進(jìn)行處理。

3.實(shí)現(xiàn)可插拔的轉(zhuǎn)換機(jī)制

另一種選擇是實(shí)現(xiàn)一個插件機(jī)制。使用這樣語言的用戶就可以提供他們自己的后端轉(zhuǎn)換。與僅提供解析樹相比,這是一種更有結(jié)構(gòu)的方法。

4.構(gòu)建一個執(zhí)行解析樹的運(yùn)行時

這可能是構(gòu)建語言的最全面方法。你可以實(shí)現(xiàn)一個解釋器來“運(yùn)行”解析后的代碼。具體的“運(yùn)行”意義取決于你的定義。在 ZenStack 中,我們不僅將 ZModel 轉(zhuǎn)換成 Prisma Schema Language,還實(shí)現(xiàn)了一個運(yùn)行時。這個運(yùn)行時解釋和執(zhí)行訪問控制規(guī)則,在數(shù)據(jù)訪問期間生效。

第 6 步:推廣使用

恭喜你!你已經(jīng)完成了創(chuàng)建新語言工作的20%。就像大多數(shù)創(chuàng)新一樣,最具挑戰(zhàn)性的部分通常是推廣它——即使它是免費(fèi)的。如果這種語言僅供你自己或團(tuán)隊(duì)內(nèi)部使用,那不如不做。但如果你的語言面向公眾,那么你需要投入大量努力進(jìn)行市場推廣。這通常占據(jù)了剩余的 80% 工作量??。

最后的思考

考慮到軟件工程在過去幾十年的迅速發(fā)展,編譯器構(gòu)建似乎成為了一門古老的藝術(shù)。然而,我認(rèn)為這是每個認(rèn)真的開發(fā)者都應(yīng)該嘗試的事情。它能帶來獨(dú)特的經(jīng)驗(yàn),并很好地反映了編程的二元性——美學(xué)與實(shí)用主義的結(jié)合。一個優(yōu)秀的軟件系統(tǒng)通?;谝粋€優(yōu)雅的概念模型,但在其表面之下,你會發(fā)現(xiàn)許多實(shí)際操作中的不太完美之處。

你應(yīng)該嘗試構(gòu)建一種語言,這是一個值得挑戰(zhàn)的有趣項(xiàng)目。

譯者介紹

劉汪洋,51CTO社區(qū)編輯,昵稱:明明如月,一個擁有 5 年開發(fā)經(jīng)驗(yàn)的某大廠高級 Java 工程師,擁有多個主流技術(shù)博客平臺博客專家稱號。

原文標(biāo)題:How Much Work Does It Take to Build a Programming Language?,作者:ymc9

責(zé)任編輯:華軒 來源: 51CTO
相關(guān)推薦

2018-08-20 08:15:50

編程語言Go語言切片

2024-03-01 19:53:37

PyBuilderPython開發(fā)

2024-07-31 08:14:17

2010-02-22 09:39:52

HTML 5Web

2017-02-10 09:30:33

數(shù)據(jù)化運(yùn)營流量

2025-07-24 07:42:08

2025-01-26 16:57:02

2025-01-09 11:14:13

2024-05-17 17:29:00

CurdlingPython開發(fā)

2022-03-30 08:24:25

操作系統(tǒng)內(nèi)核開源軟件

2015-05-06 09:36:05

Java語言從零開始學(xué)習(xí)

2015-11-17 16:11:07

Code Review

2019-01-18 12:39:45

云計(jì)算PaaS公有云

2018-04-18 07:01:59

Docker容器虛擬機(jī)

2024-12-06 17:02:26

2020-07-02 15:32:23

Kubernetes容器架構(gòu)

2023-11-22 12:59:07

2025-02-17 07:20:00

Flutter 3Flutter開發(fā)

2025-07-08 09:24:52

2018-03-14 11:15:06

點(diǎn)贊
收藏

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

欧美黑人粗大| 午夜福利视频一区二区| 成人在线一区| 欧美一二三四区在线| 国产精品久久久久9999爆乳| 无码国产伦一区二区三区视频| 久久久久欧美精品| 久久九九免费视频| 熟女人妻在线视频| 高清电影一区| 亚洲精品乱码久久久久久| 精品一区二区三区国产| 一级一级黄色片| 黄色av一区| 中文字幕日韩在线观看| 男人的天堂影院| 欧美韩国日本| 欧美日韩中文字幕在线视频| 国产精品99久久久久久大便| 亚洲 精品 综合 精品 自拍| 精品一区二区免费在线观看| 欧美一级bbbbb性bbbb喷潮片| 精品丰满少妇一区二区三区| 精品资源在线| 欧美一级二级三级蜜桃| 久久久国产欧美| 92久久精品| 日韩一区中文字幕| 日韩色妇久久av| 日韩一区二区三区不卡| 国产一区不卡视频| 国产精品海角社区在线观看| 免费一级片视频| 色天天久久综合婷婷女18| 国产视频亚洲视频| 亚洲自拍偷拍精品| 九色精品蝌蚪| 欧美夫妻性生活| 91香蕉视频污版| 日韩欧美一区二区三区在线观看| 香蕉成人啪国产精品视频综合网| 永久免费在线看片视频| 91在线高清| 国产色综合久久| 蜜桃av久久久亚洲精品| 日本免费不卡视频| 成人性视频免费网站| 亚洲在线www| 国产免费一区二区三区最新不卡| 蜜桃视频在线观看一区| 国产精品久久久久77777| 日韩三级视频在线播放| 激情欧美亚洲| 韩国美女主播一区| 国产五月天婷婷| 黄色成人在线网址| 久久久噜久噜久久综合| 国产在线观看免费av| 国产精品大片| 久久久女女女女999久久| 国产在线视频第一页| 欧美精品九九| 国内精品久久久久久| 国产一级在线视频| 夜夜嗨一区二区三区| 538国产精品视频一区二区| 中文字幕精品三级久久久| 中文精品在线| 日本电影亚洲天堂| 中文字幕免费高清网站| 免费成人在线视频观看| 国产在线视频不卡| 国产高清视频免费观看| 国产乱人伦偷精品视频不卡| 不卡视频一区二区| 亚洲av成人精品一区二区三区在线播放| 成人国产精品免费| 老司机精品福利在线观看| 国产一二三在线观看| 中文文精品字幕一区二区| 伊人精品久久久久7777| 羞羞的网站在线观看| 亚洲va欧美va人人爽| 欧美黄色免费影院| 国产黄色一区| 日韩欧美高清在线| 成人无码www在线看免费| 精品久久久久久久| 久久的精品视频| 中文字幕一区二区三区手机版 | 久久成人麻豆午夜电影| 亚洲一区二区三区毛片| 天天爱天天干天天操| 欧美激情一区二区在线| 黄色一级视频播放| 色偷偷偷在线视频播放| 欧美蜜桃一区二区三区| 亚洲成年人在线观看| 欧美精品色图| 欧美激情免费在线| 懂色av蜜臀av粉嫩av喷吹| 国产高清在线精品| 日韩理论片在线观看| 视频在线观看入口黄最新永久免费国产 | 日本黄色免费在线| 欧美美女bb生活片| 国产精品久久不卡| 欧美国产精品| 国产精品成人av性教育| 亚洲春色一区二区三区| 国产欧美日韩视频在线观看| 成人免费观看在线| 成人黄色毛片| 亚洲美女久久久| 九九热国产精品视频| 日本不卡一区二区三区| 九九九久久久| 欧美男男video| 欧美日韩三级在线| 人妻丰满熟妇av无码久久洗澡 | 熟女人妇 成熟妇女系列视频| 欧美成人精品午夜一区二区| 中文字幕日韩精品有码视频| 日产亚洲一区二区三区| 国产精品一区二区在线观看网站| 日本一区不卡| 黄色视屏在线免费观看| 日韩一区二区三区电影在线观看| 91在线无精精品白丝| 日韩一区二区免费看| 99国产在线| 成人福利网站| 欧美日韩第一区日日骚| 人人人妻人人澡人人爽欧美一区| 亚洲第一黄色| 国产精品v欧美精品v日韩| 黄a在线观看| 欧美日本韩国一区二区三区视频| 国精产品一区一区三区免费视频| 99re国产精品| 国产不卡一区二区在线观看| 在线观看中文字幕的网站| 欧美蜜桃一区二区三区| www中文在线| 日本在线不卡一区| 日韩av图片| 国产日韩另类视频一区| 亚洲欧美国产高清va在线播| 亚洲天堂一区在线| 91美女片黄在线观看| 免费日韩视频在线观看| 丝袜美腿综合| 日本成人精品在线| 国产精品一区二区婷婷| 欧美性xxxxx极品少妇| 99久久精品免费视频| 视频一区二区三区在线| 日韩av高清| 黄色欧美视频| 日韩中文字幕第一页| 97精品人妻一区二区三区香蕉 | 亚洲精品中文字| 六月丁香婷婷综合| 久久久精品影视| 成人在线激情网| 国产精品久久久久久麻豆一区软件 | 高清无码视频直接看| av成人综合| 欧美综合一区第一页| 国产区视频在线播放| 欧美日韩中文一区| 免费在线观看h片| 成人在线一区二区三区| 欧美精品久久久久久久免费| 中文字幕中文字幕精品| 国产精品亚洲美女av网站| 国产黄色小视频在线| 亚洲成人精品在线| 亚洲天堂一区在线| 国产精品国产三级国产aⅴ中文 | 免费黄色小视频在线观看| 国产精品理伦片| 国产又黄又嫩又滑又白| 国产亚洲综合精品| 日韩免费毛片| 精品中文字幕一区二区三区四区| 97视频在线观看免费| 在线播放日本| 亚洲成人性视频| 最新在线中文字幕| 亚洲一二三级电影| 久久午夜福利电影| 国产成人亚洲综合a∨婷婷图片| 欧美 日韩 亚洲 一区| 精品日本12videosex| 99re视频在线| av成人在线观看| 色综合久久88色综合天天看泰| 欧美在线观看在线观看| 欧美精品18+| 日韩免费av网站| 亚洲尤物在线视频观看| 五月天综合视频| 国产91精品入口| 天天干天天玩天天操| 夜夜精品视频| 777久久精品一区二区三区无码 | 日本99精品| 国产精品成人观看视频国产奇米| 直接在线观看的三级网址| 亚洲欧洲一区二区三区在线观看 | 国产成人精品网址| 91蝌蚪视频在线观看| 亚洲国产精品第一区二区| 中文字幕一区二区三区精彩视频| 亚洲盗摄视频| www.成人三级视频| 四虎精品永久免费| 国产成人精品一区二区| 毛片电影在线| 欧美精品激情blacked18| 日本中文字幕在线2020| 亚洲欧美中文另类| 天堂成人在线视频| 日韩精品一区二区三区视频| 中文字幕一区二区三区四区免费看 | 国产精品18久久久久| wwwwwxxxx日本| 肉肉av福利一精品导航| 久久精品免费一区二区| 精品99视频| 免费观看亚洲视频| 亚洲精品小说| 亚洲欧美日韩不卡一区二区三区| 国产一区二区精品久| 久久久99爱| 免费萌白酱国产一区二区三区| 97超碰人人看人人| 精品国产一区二区三区性色av| 国产欧洲精品视频| 99精品国自产在线| 国产精品视频中文字幕91| 日韩国产激情| 国产精品福利观看| 成人国产精品入口免费视频| 国产精品成人久久久久| 99精品国自产在线| 国产精品无码专区在线观看| 国产精品久久久久77777丨| 国产精品激情自拍| 国产第一亚洲| 成人美女免费网站视频| 国产成人视屏| 97超级在线观看免费高清完整版电视剧| 欧美国产中文高清| 国产高清一区二区三区| 精品国产影院| 久久天天狠狠| 欧洲grand老妇人| 日韩精品一线二线三线| 日本精品黄色| 免费在线精品视频| 亚洲最大黄网| 97在线国产视频| 亚洲影院免费| 亚洲 欧美 另类人妖| 国产一区二区在线观看视频| 26uuu国产| av午夜一区麻豆| 亚洲理论片在线观看| 一色屋精品亚洲香蕉网站| 五月天婷婷色综合| 亚洲va欧美va人人爽| 日韩精选在线观看| 91精品在线免费| 人妻91麻豆一区二区三区| 亚洲女人天堂网| 快射av在线播放一区| 欧美精品18videos性欧| 亚洲精品**中文毛片| 国产剧情日韩欧美| 99久久免费精品国产72精品九九| 欧美激情国产日韩| 亚洲精品网址| 国产一区二区三区精彩视频| 久久99精品国产.久久久久| 日本少妇一区二区三区| 久久综合九色综合久久久精品综合 | 天美av一区二区三区久久| 亚洲欧洲一区二区福利| 今天的高清视频免费播放成人| 亚洲 中文字幕 日韩 无码| 国产米奇在线777精品观看| 800av在线播放| 中文字幕五月欧美| 国产超碰人人爽人人做人人爱| 欧美日韩成人一区二区| 亚洲av片在线观看| 久久精品中文字幕一区| 日韩免费电影| 国产欧美一区二区在线播放| 国产精品精品| 欧美一区二区三区爽大粗免费| 久久精品国产99| 亚洲专区区免费| 亚洲一区二区三区在线播放| 中文字幕第315页| 日韩高清不卡av| 在线欧美三级| 国产在线视频不卡| 精品福利久久久| 成人一对一视频| 国产精品资源在线观看| 亚洲精品视频网址| 精品女厕一区二区三区| 精品久久在线观看| 色av中文字幕一区| 日韩免费va| 久久久久一区二区三区| 欧美视频不卡| 手机av在线网站| 自拍偷自拍亚洲精品播放| 日韩电影在线观看一区二区| 亚洲精品xxxx| 黄色羞羞视频在线观看| 亚洲a∨日韩av高清在线观看| 精品色999| 日本精品一区二区三区四区| 成人激情综合网站| 免费无遮挡无码永久在线观看视频| 欧美日韩国产在线观看| 国内精品一区视频| 欧美洲成人男女午夜视频| 免费观看成人www动漫视频| 欧美图片激情小说| 国产69精品久久久久毛片| 91在线播放观看| 欧美一区二区三区日韩视频| 久操视频在线播放| 国产在线精品播放| 久久在线电影| 日韩成人av免费| 亚洲婷婷在线视频| 国产精品视频第一页| 久久精品一区中文字幕| 9999精品免费视频| 在线观看18视频网站| 国产成人综合在线观看| 黄色在线观看免费| 精品国产一区二区三区不卡| 久久香蕉一区| 国产精品一区视频网站| 99亚洲视频| 波多野结衣一本| 欧美性色黄大片| 日本成人网址| 亚洲精品欧美日韩| 国产综合网站| 少妇一级淫片免费放播放| 欧美丝袜美女中出在线| 久青青在线观看视频国产| 国产精品国产三级国产aⅴ浪潮| 日韩伦理一区| 日本黄色一级网站| 亚洲高清免费视频| 日本成人一区二区三区| 国产精品wwwwww| 忘忧草精品久久久久久久高清| 韩国三级与黑人| 欧美性极品xxxx娇小| av天在线观看| 国产v亚洲v天堂无码| 久久婷婷一区| 侵犯稚嫩小箩莉h文系列小说| 精品日产卡一卡二卡麻豆| 原纱央莉成人av片| 一区二区日本伦理| 懂色中文一区二区在线播放| 欧美h在线观看| 日韩综合视频在线观看| av自拍一区| 欧美自拍小视频| 亚洲已满18点击进入久久| 日本人妖在线| 91亚洲精品在线| 欧美中文字幕| 国产真实乱在线更新| 日韩av在线影院| 亚洲色图图片| 欧美日韩亚洲第一| 亚洲女人的天堂| 青青草手机在线| 亚洲专区在线视频| 丝袜脚交一区二区| 欧美黄色免费在线观看| 亚洲人成网在线播放| 亚洲精选av| 色综合色综合色综合色综合| 亚洲高清免费观看| 浪潮av一区|