青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
數(shù)據(jù)加載中……

IBM----Yacc 與 Lex 快速入門

Lex Yacc UNIX 兩個(gè)非常重要的、功能強(qiáng)大的工具。事實(shí)上,如果你熟練掌握 Lex Yacc 的話,它們的強(qiáng)大功能使創(chuàng)建 FORTRAN C 的編譯器如同兒戲。Ashish Bansal 為您詳細(xì)的討論了編寫自己的語(yǔ)言和編譯器所用到的這兩種工具,包括常規(guī)表達(dá)式、聲明、匹配模式、變量、Yacc 語(yǔ)法和解析器代碼。最后,他解釋了怎樣把 Lex Yacc 結(jié)合起來(lái)。

Lex 代表 Lexical AnalyzarYacc 代表 Yet Another Compiler Compiler。 讓我們從 Lex 開(kāi)始吧。

 

Lex

Lex 是一種生成掃描器的工具。掃描器是一種識(shí)別文本中的詞匯模式的程序。這些詞匯模式(或者常規(guī)表達(dá)式)在一種特殊的句子結(jié)構(gòu)中定義,這個(gè)我們一會(huì)兒就要討論。

一種匹配的常規(guī)表達(dá)式可能會(huì)包含相關(guān)的動(dòng)作。這一動(dòng)作可能還包括返回一個(gè)標(biāo)記。當(dāng) Lex 接收到文件或文本形式的輸入時(shí),它試圖將文本與常規(guī)表達(dá)式進(jìn)行匹配。它一次讀入一個(gè)輸入字符,直到找到一個(gè)匹配的模式。如果能夠找到一個(gè)匹配的模式,Lex 就執(zhí)行相關(guān)的動(dòng)作(可能包括返回一個(gè)標(biāo)記)。另一方面,如果沒(méi)有可以匹配的常規(guī)表達(dá)式,將會(huì)停止進(jìn)一步的處理,Lex 將顯示一個(gè)錯(cuò)誤消息。

Lex C 是強(qiáng)耦合的。一個(gè) .lex 文件(Lex 文件具有 .lex 的擴(kuò)展名)通過(guò) lex 公用程序來(lái)傳遞,并生成 C 的輸出文件。這些文件被編譯為詞法分析器的可執(zhí)行版本。

 

Lex 的常規(guī)表達(dá)式

常規(guī)表達(dá)式是一種使用元語(yǔ)言的模式描述。表達(dá)式由符號(hào)組成。符號(hào)一般是字符和數(shù)字,但是 Lex 中還有一些具有特殊含義的其他標(biāo)記。下面兩個(gè)表格定義了 Lex 中使用的一些標(biāo)記并給出了幾個(gè)典型的例子。

Lex 定義常規(guī)表達(dá)式

字符

含義

A-Z, 0-9, a-z

構(gòu)成了部分模式的字符和數(shù)字。

.

匹配任意字符,除了 \n

-

用來(lái)指定范圍。例如:A-Z 指從 A Z 之間的所有字符。

[ ]

一個(gè)字符集合。匹配括號(hào)內(nèi)的 任意 字符。如果第一個(gè)字符是 ^ 那么它表示否定模式。例如: [abC] 匹配 a, b, C中的任何一個(gè)。

*

匹配 0個(gè)或者多個(gè)上述的模式。

+

匹配 1個(gè)或者多個(gè)上述模式。

?

匹配 0個(gè)或1個(gè)上述模式。

$

作為模式的最后一個(gè)字符匹配一行的結(jié)尾。

{ }

指出一個(gè)模式可能出現(xiàn)的次數(shù)。 例如: A{1,3} 表示 A 可能出現(xiàn)1次或3次。

\

用來(lái)轉(zhuǎn)義元字符。同樣用來(lái)覆蓋字符在此表中定義的特殊意義,只取字符的本意。

^

否定。

|

表達(dá)式間的邏輯或。

"<一些符號(hào)>"

字符的字面含義。元字符具有。

/

向前匹配。如果在匹配的模版中的“/”后跟有后續(xù)表達(dá)式,只匹配模版中“/”前面的部分。如:如果輸入 A01,那么在模版 A0/1 中的 A0 是匹配的。

( )

將一系列常規(guī)表達(dá)式分組。

 

常規(guī)表達(dá)式舉例

常規(guī)表達(dá)式

含義

joke[rs]

匹配 jokes joker

A{1,2}shis+

匹配 AAshis, Ashis, AAshi, Ashi

(A[b-e])+

匹配在 A 出現(xiàn)位置后跟隨的從 b e 的所有字符中的 0 個(gè)或 1個(gè)。

 

Lex 中的標(biāo)記聲明類似 C 中的變量名。每個(gè)標(biāo)記都有一個(gè)相關(guān)的表達(dá)式。(下表中給出了標(biāo)記和表達(dá)式的例子。)使用這個(gè)表中的例子,我們就可以編一個(gè)字?jǐn)?shù)統(tǒng)計(jì)的程序了。我們的第一個(gè)任務(wù)就是說(shuō)明如何聲明標(biāo)記。

 

標(biāo)記聲明舉例

標(biāo)記

相關(guān)表達(dá)式

含義

數(shù)字(number)

([0-9])+

1個(gè)或多個(gè)數(shù)字

字符(chars)

[A-Za-z]

任意字符

空格(blank)

" "

一個(gè)空格

(word)

(chars)+

1個(gè)或多個(gè) chars

變量(variable)

(字符)+(數(shù)字)*(字符)*(數(shù)字)*

 

 

 

Lex 編程

Lex 編程可以分為三步:

  1. Lex 可以理解的格式指定模式相關(guān)的動(dòng)作。
  2. 在這一文件上運(yùn)行 Lex,生成掃描器的 C 代碼。
  3. 編譯和鏈接 C 代碼,生成可執(zhí)行的掃描器。

注意: 如果掃描器是用 Yacc 開(kāi)發(fā)的解析器的一部分,只需要進(jìn)行第一步和第二步。關(guān)于這一特殊問(wèn)題的幫助請(qǐng)閱讀 Yacc將 Lex 和 Yacc 結(jié)合起來(lái)部分。

現(xiàn)在讓我們來(lái)看一看 Lex 可以理解的程序格式。一個(gè) Lex 程序分為三個(gè)段:第一段是 C Lex 的全局聲明,第二段包括模式(C 代碼),第三段是補(bǔ)充的 C 函數(shù)。 例如, 第三段中一般都有 main() 函數(shù)。這些段以%%來(lái)分界。 那么,回到字?jǐn)?shù)統(tǒng)計(jì)的 Lex 程序,讓我們看一下程序不同段的構(gòu)成。

 

C Lex 的全局聲明

這一段中我們可以增加 C 變量聲明。這里我們將為字?jǐn)?shù)統(tǒng)計(jì)程序聲明一個(gè)整型變量,來(lái)保存程序統(tǒng)計(jì)出來(lái)的字?jǐn)?shù)。我們還將進(jìn)行 Lex 的標(biāo)記聲明。


字?jǐn)?shù)統(tǒng)計(jì)程序的聲明

       %{
        int wordCount = 0;
        %}
        chars [A-za-z\_\'\.\"]
        numbers ([0-9])+
        delim [" "\n\t]
        whitespace {delim}+
        words {chars}+
        %%

 

兩個(gè)百分號(hào)標(biāo)記指出了 Lex 程序中這一段的結(jié)束和三段中第二段的開(kāi)始。

 

Lex 的模式匹配規(guī)則

讓我們看一下 Lex 描述我們所要匹配的標(biāo)記的規(guī)則。(我們將使用 C 來(lái)定義標(biāo)記匹配后的動(dòng)作。)繼續(xù)看我們的字?jǐn)?shù)統(tǒng)計(jì)程序,下面是標(biāo)記匹配的規(guī)則。


字?jǐn)?shù)統(tǒng)計(jì)程序中的 Lex 規(guī)則

       {words} { wordCount++; /*
        increase the word count by one*/ }
        {whitespace} { /* do
        nothing*/ }
        {numbers} { /* one may
        want to add some processing here*/ }
        %%

 

C 代碼

Lex 編程的第三段,也就是最后一段覆蓋了 C 的函數(shù)聲明(有時(shí)是主函數(shù))。注意這一段必須包括 yywrap() 函數(shù)。 Lex 有一套可供使用的函數(shù)和變量。 其中之一就是 yywrap。一般來(lái)說(shuō),yywrap() 的定義如下例。我們將在 高級(jí) Lex 中探討這一問(wèn)題。


字?jǐn)?shù)統(tǒng)計(jì)程序的 C 代碼段

       void main()
        {
        yylex(); /* start the
        analysis*/
        printf(" No of words:
        %d\n", wordCount);
        }
        int yywrap()
        {
        return 1;
        }

 

上一節(jié)我們討論了 Lex 編程的基本元素,它將幫助你編寫簡(jiǎn)單的詞法分析程序。在 高級(jí) Lex 這一節(jié)中我們將討論 Lex 提供的函數(shù),這樣你就能編寫更加復(fù)雜的程序了。

 

將它們?nèi)拷Y(jié)合起來(lái)

.lex文件是 Lex 的掃描器。它在 Lex 程序中如下表示:

   $ lex <file name.lex>

 

這生成了 lex.yy.c 文件,它可以用 C 編譯器來(lái)進(jìn)行編譯。它還可以用解析器來(lái)生成可執(zhí)行程序,或者在鏈接步驟中通過(guò)選項(xiàng)?ll 包含 Lex 庫(kù)。

這里是一些 Lex 的標(biāo)志:

  • -c表示 C 動(dòng)作,它是缺省的。
  • -t寫入 lex.yy.c 程序來(lái)代替標(biāo)準(zhǔn)輸出。
  • -v提供一個(gè)兩行的統(tǒng)計(jì)匯總。
  • -n不打印 -v 的匯總。
  •  

高級(jí) Lex

 

Lex 有幾個(gè)函數(shù)和變量提供了不同的信息,可以用來(lái)編譯實(shí)現(xiàn)復(fù)雜函數(shù)的程序。下表中列出了一些變量和函數(shù),以及它們的使用。詳盡的列表請(qǐng)參考 Lex Flex 手冊(cè)(見(jiàn)后文的 資源)。

 

Lex 變量

yyin

FILE* 類型。 它指向 lexer 正在解析的當(dāng)前文件。

yyout

FILE* 類型。 它指向記錄 lexer 輸出的位置。 缺省情況下,yyin yyout 都指向標(biāo)準(zhǔn)輸入和輸出。

yytext

匹配模式的文本存儲(chǔ)在這一變量中(char*)。

yyleng

給出匹配模式的長(zhǎng)度。

yylineno

提供當(dāng)前的行數(shù)信息。(lexer不一定支持。)

Lex 函數(shù)

yylex()

這一函數(shù)開(kāi)始分析。 它由 Lex 自動(dòng)生成。

yywrap()

這一函數(shù)在文件(或輸入)的末尾調(diào)用。如果函數(shù)的返回值是1,就停止解析。 因此它可以用來(lái)解析多個(gè)文件。代碼可以寫在第三段,這就能夠解析多個(gè)文件。 方法是使用 yyin 文件指針(見(jiàn)上表)指向不同的文件,直到所有的文件都被解析。最后,yywrap() 可以返回 1 來(lái)表示解析的結(jié)束。

yyless(int n)

這一函數(shù)可以用來(lái)送回除了前?n? 個(gè)字符外的所有讀出標(biāo)記。

yymore()

這一函數(shù)告訴 Lexer 將下一個(gè)標(biāo)記附加到當(dāng)前標(biāo)記后。

對(duì) Lex 的討論就到這里。下面我們來(lái)討論 Yacc...

 

Yacc

Yacc 代表 Yet Another Compiler Compiler Yacc GNU 版叫做 Bison。它是一種工具,將任何一種編程語(yǔ)言的所有語(yǔ)法翻譯成針對(duì)此種語(yǔ)言的 Yacc 語(yǔ) 法解析器。它用巴科斯范式(BNF, Backus Naur Form)來(lái)書寫。按照慣例,Yacc 文件有 .y 后綴。編譯行如下調(diào)用 Yacc 編譯器:

       $ yacc <options>
        <filename ending with .y>

 

在進(jìn)一步闡述以前,讓我們復(fù)習(xí)一下什么是語(yǔ)法。在上一節(jié)中,我們看到 Lex 從輸入序列中識(shí)別標(biāo)記。如果你在查看標(biāo)記序列,你可能想在這一序列出現(xiàn)時(shí)執(zhí)行某一動(dòng)作。這種情況下有效序列的規(guī)范稱為語(yǔ)法。Yacc 語(yǔ)法文件包括這一語(yǔ)法規(guī)范。它還包含了序列匹配時(shí)你想要做的事。

為了更加說(shuō)清這一概念,讓我們以英語(yǔ)為例。 這一套標(biāo)記可能是:名詞, 動(dòng)詞, 形容詞等等。為了使用這些標(biāo)記造一個(gè)語(yǔ)法正確的句子,你的結(jié)構(gòu)必須符合一定的規(guī)則。一個(gè)簡(jiǎn)單的句子可能是名詞+動(dòng)詞或者名詞+動(dòng)詞+名詞。( I care. See spot run.)

所以在我們這里,標(biāo)記本身來(lái)自語(yǔ)言(Lex),并且標(biāo)記序列允許用 Yacc 來(lái)指定這些標(biāo)記(標(biāo)記序列也叫語(yǔ)法)

clip_image002

終端和非終端符號(hào)

終端符號(hào) : 代表一類在語(yǔ)法結(jié)構(gòu)上等效的標(biāo)記。終端符號(hào)有三種類型:

命名標(biāo)記: 這些由 %token 標(biāo)識(shí)符來(lái)定義。按照慣例,它們都是大寫。

字符標(biāo)記 : 字符常量的寫法與 C 相同。例如, -- 就是一個(gè)字符標(biāo)記。

字符串標(biāo)記 : 寫法與 C 的字符串常量相同。例如,"<<" 就是一個(gè)字符串標(biāo)記。

lexer 返回命名標(biāo)記。

非終端符號(hào) : 是一組非終端符號(hào)和終端符號(hào)組成的符號(hào)。按照慣例,它們都是小寫。 在例子中,file 是一個(gè)非終端標(biāo)記而 NAME 是一個(gè)終端標(biāo)記。

Yacc 來(lái)創(chuàng)建一個(gè)編譯器包括四個(gè)步驟:

  1. 通過(guò)在語(yǔ)法文件上運(yùn)行 Yacc 生成一個(gè)解析器。
  2. 說(shuō)明語(yǔ)法:
    • 編寫一個(gè) .y 的語(yǔ)法文件(同時(shí)說(shuō)明 C 在這里要進(jìn)行的動(dòng)作)。
    • 編寫一個(gè)詞法分析器來(lái)處理輸入并將標(biāo)記傳遞給解析器。 這可以使用 Lex 來(lái)完成。
    • 編寫一個(gè)函數(shù),通過(guò)調(diào)用 yyparse() 來(lái)開(kāi)始解析。
    • 編寫錯(cuò)誤處理例程(如 yyerror())。
  3. 編譯 Yacc 生成的代碼以及其他相關(guān)的源文件。
  4. 將目標(biāo)文件鏈接到適當(dāng)?shù)目蓤?zhí)行解析器庫(kù)。

 

 

 

Yacc 編寫語(yǔ)法

如同 Lex 一樣, 一個(gè) Yacc 程序也用雙百分號(hào)分為三段。它們是:聲明、語(yǔ)法規(guī)則和 C 代碼。我們將解析一個(gè)格式為 姓名 = 年齡的文件作為例子,來(lái)說(shuō)明語(yǔ)法規(guī)則。我們假設(shè)文件有多個(gè)姓名和年齡,它們以空格分隔。在看 Yacc 程序的每一段時(shí),我們將為我們的例子編寫一個(gè)語(yǔ)法文件。

 

C Yacc 的聲明

C 聲明可能會(huì)定義動(dòng)作中使用的類型和變量,以及宏。還可以包含頭文件。每個(gè) Yacc 聲明段聲明了終端符號(hào)和非終端符號(hào)(標(biāo)記)的名稱,還可能描述操作符優(yōu)先級(jí)和針對(duì)不同符號(hào)的數(shù)據(jù)類型。 lexer (Lex) 一般返回這些標(biāo)記。所有這些標(biāo)記都必須在 Yacc 聲明中進(jìn)行說(shuō)明。

在文件解析的例子中我們感興趣的是這些標(biāo)記:name, equal sign, ageName 是一個(gè)完全由字符組成的值。 Age 是數(shù)字。于是聲明段就會(huì)像這樣:


文件解析例子的聲明

       %
        #typedef char* string; /*
        to specify token types as char* */
        #define YYSTYPE string /*
        a Yacc variable which has the value of returned token */
        %}
        %token NAME EQ AGE
        %%

 

你可能會(huì)覺(jué)得 YYSTYPE 有點(diǎn)奇怪。但是類似 Lex, Yacc 也有一套變量和函數(shù)可供用戶來(lái)進(jìn)行功能擴(kuò)展。 YYSTYPE 定義了用來(lái)將值從 lexer 拷貝到解析器或者 Yacc yylval (另一個(gè) Yacc 變量)的類型。默認(rèn)的類型是 int。 由于字符串可以從 lexer 拷貝,類型被重定義為 char*。 關(guān)于 Yacc 變量的詳細(xì)討論,請(qǐng)參考 Yacc 手冊(cè)(見(jiàn) 資源)。

 

Yacc 語(yǔ)法規(guī)則

Yacc 語(yǔ)法規(guī)則具有以下一般格式:

       result: components { /*
        action to be taken in C */ }
        ;

 

在這個(gè)例子中,result 是規(guī)則描述的非終端符號(hào)。Components 是根據(jù)規(guī)則放在一起的不同的終端和非終端符號(hào)。 如果匹配特定序列的話 Components 后面可以跟隨要執(zhí)行的動(dòng)作。 考慮如下的例子:

       param : NAME EQ NAME {
        printf("\tName:%s\tValue(name):%s\n", $1,$3);}
            | NAME EQ VALUE{
            printf("\tName:%s\tValue(value):%s\n",$1,$3);}
        ;

 

如果上例中序列 NAME EQ NAME 被匹配,將執(zhí)行相應(yīng)的 { } 括號(hào)中的動(dòng)作。 這里另一個(gè)有用的就是 $1 $3 的使用, 它們引用了標(biāo)記 NAME NAME(或者第二行的 VALUE)的值。 lexer 通過(guò) Yacc 的變量 yylval 返回這些值。標(biāo)記 NAME Lex 代碼是這樣的:

       char [A-Za-z]
        name {char}+
        %%
        {name} { yylval = strdup(yytext);
        return NAME; }

 

文件解析例子的規(guī)則段是這樣的:


文件解析的語(yǔ)法

       file : record file
        | record
        ;
        record: NAME EQ AGE {
        printf("%s is now %s years old!!!", $1, $3);}
        ;
        %%

 

附加 C 代碼

現(xiàn)在讓我們看一下語(yǔ)法文件的最后一段,附加 C 代碼。(這一段是可選的,如果有人想要略過(guò)它的話:)一個(gè)函數(shù)如 main() 調(diào)用 yyparse() 函數(shù)(Yacc Lex yylex() 等效函數(shù))。 一般來(lái)說(shuō),Yacc 最好提供 yyerror(char msg) 函數(shù)的代碼。 當(dāng)解析器遇到錯(cuò)誤時(shí)調(diào)用 yyerror(char msg)。錯(cuò)誤消息作為參數(shù)來(lái)傳遞。一個(gè)簡(jiǎn)單的 yyerror( char* ) 可能是這樣的:

       int yyerror(char* msg)
        {
        printf("Error: %s
        encountered at line number:%d\n", msg, yylineno);
        }

 

yylineno 提供了行數(shù)信息。

這一段還包括文件解析例子的主函數(shù):


附加 C 代碼

       void main()
        {
            yyparse();
        }
        int yyerror(char* msg)
        {
        printf("Error: %s
        encountered \n", msg);

 

要生成代碼,可能用到以下命令:

       $ yacc _d <filename.y>

 

這生成了輸出文件 y.tab.h y.tab.c,它們可以用 UNIX 上的任何標(biāo)準(zhǔn) C 編譯器來(lái)編譯(如 gcc)。

 

命令行的其他常用選項(xiàng)

  • '-d' ,'--defines' : 編寫額外的輸出文件,它們包含這些宏定義:語(yǔ)法中定義的標(biāo)記類型名稱,語(yǔ)義的取值類型 YYSTYPE, 以及一些外部變量聲明。如果解析器輸出文件名叫 'name.c', 那么 '-d' 文件就叫做 'name.h'。 如果你想將 yylex 定義放到獨(dú)立的源文件中,你需要 'name.h', 因?yàn)?yylex 必須能夠引用標(biāo)記類型代碼和 yylval變量。
  • '-b file-prefix' ,'--file-prefix=prefix' : 指定一個(gè)所有Yacc輸出文件名都可以使用的前綴。選擇一個(gè)名字,就如輸入文件名叫 'prefix.c'.
  • '-o outfile' ,'--output-file=outfile' : 指定解析器文件的輸出文件名。其他輸出文件根據(jù) '-d' 選項(xiàng)描述的輸出文件來(lái)命名。

Yacc 庫(kù)通常在編譯步驟中自動(dòng)被包括。但是它也能被顯式的包括,以便在編譯步驟中指定 ?ly選項(xiàng)。這種情況下的編譯命令行是:

       $ cc <source file
        names> -ly

 

Lex Yacc 結(jié)合起來(lái)

到目前為止我們已經(jīng)分別討論了 Lex Yacc。現(xiàn)在讓我們來(lái)看一下他們是怎樣結(jié)合使用的。

一個(gè)程序通常在每次返回一個(gè)標(biāo)記時(shí)都要調(diào)用 yylex() 函數(shù)。只有在文件結(jié)束或者出現(xiàn)錯(cuò)誤標(biāo)記時(shí)才會(huì)終止。

一個(gè)由 Yacc 生成的解析器調(diào)用 yylex() 函數(shù)來(lái)獲得標(biāo)記。 yylex() 可以由 Lex 來(lái)生成或完全由自己來(lái)編寫。 對(duì)于由 Lex 生成的 lexer 來(lái)說(shuō),要和 Yacc 結(jié)合使用,每當(dāng) Lex 中匹配一個(gè)模式時(shí)都必須返回一個(gè)標(biāo)記。 因此 Lex 中匹配模式時(shí)的動(dòng)作一般格式為:

       {pattern} { /* do smthg*/
        return TOKEN_NAME; }

 

于是 Yacc 就會(huì)獲得返回的標(biāo)記。當(dāng) Yacc 編譯一個(gè)帶有 _d 標(biāo)記的 .y文件時(shí),會(huì)生成一個(gè)頭文件,它對(duì)每個(gè)標(biāo)記都有 #define 的定義。 如果 Lex Yacc 一起使用的話,頭文件必須在相應(yīng)的 Lex 文件 .lex中的 C 聲明段中包括。

讓我們回到名字和年齡的文件解析例子中,看一看 Lex Yacc 文件的代碼。


Name.y -
語(yǔ)法文件

       %
        typedef char* string;
        #define YYSTYPE string
        %}
        %token NAME EQ AGE
        %%
        file : record file
        | record
        ;
        record : NAME EQ AGE {
        printf("%s is %s years old!!!\n", $1, $3); }
        ;
        %%
        int main()
        {
        yyparse();
        return 0;
        }
        int yyerror(char *msg)
        {
        printf("Error
        encountered: %s \n", msg);
        }

 

Name.lex - Lex 的解析器文件

       %{
        #include "y.tab.h"
        
        #include <stdio.h>
        #include <string.h>
        extern char* yylval;
        %}
        char [A-Za-z]
        num [0-9]
        eq [=]
        name {char}+
        age {num}+
        %%
        {name} { yylval = strdup(yytext);
        return NAME; }
        {eq} { return EQ; }
        {age} { yylval = strdup(yytext);
        return AGE; }
        %%
        int yywrap()
        {
        return 1;
        }

 

作為一個(gè)參考,我們列出了 y.tab.h, Yacc 生成的頭文件。


y.tab.h - Yacc
生成的頭文件

       # define NAME 257
        # define EQ 258
        # define AGE 259

 

我們對(duì)于 Lex Yacc的討論到此為止。今天你想要編譯什么語(yǔ)言呢?

參考資料

 

posted on 2008-09-19 18:14 肥仔 閱讀(1479) 評(píng)論(0)  編輯 收藏 引用 所屬分類: LEX & YACC

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            中文av字幕一区| 欧美日韩一区二区三区免费看| 久久久久久久网站| 欧美一区二区三区免费在线看| 亚洲免费在线| 欧美在线999| 久久gogo国模啪啪人体图| 久久久国产精品一区二区中文| 久久躁狠狠躁夜夜爽| 亚洲电影在线看| 亚洲欧洲日韩在线| 亚洲视频精选在线| 欧美影院久久久| 老司机久久99久久精品播放免费| 欧美大片免费看| 欧美先锋影音| 激情综合网址| 一区二区不卡在线视频 午夜欧美不卡在| 一本色道久久综合亚洲二区三区| 亚洲摸下面视频| 欧美国产91| 亚洲午夜91| 欧美成ee人免费视频| 国产精品人人做人人爽人人添 | 欧美午夜不卡在线观看免费 | 日韩一区二区精品在线观看| 亚洲一区激情| 免费永久网站黄欧美| 欧美一级二区| 欧美在线高清视频| 亚洲观看高清完整版在线观看| 欧美福利视频在线| 欧美日韩国产一区二区三区| 亚洲一区二区毛片| 欧美一区二区视频网站| 亚洲二区视频| 亚洲视频导航| 在线免费观看欧美| 99视频一区二区三区| 国产精品色婷婷| 免费不卡亚洲欧美| 欧美日韩一区二区高清| 久久精品中文字幕一区二区三区| 久久久噜噜噜久久人人看| 91久久精品国产91性色tv| 久久网站热最新地址| 在线综合亚洲欧美在线视频| 久久精品人人做人人爽电影蜜月| 国产精品久久久久久久久久免费看| 91久久精品国产91久久性色tv| 久久久噜噜噜| 西西裸体人体做爰大胆久久久| 欧美色图一区二区三区| 亚洲免费精彩视频| 欧美激情国产日韩| 男人的天堂亚洲| 18成人免费观看视频| 久热re这里精品视频在线6| 香蕉久久夜色精品国产| 国产欧美精品日韩精品| 午夜精品一区二区三区在线视| 亚洲精品永久免费精品| 欧美日韩1080p| 一区二区三区偷拍| 99视频精品免费观看| 欧美日韩在线播| 亚洲一区二区三区四区中文| 这里只有精品在线播放| 国产精品美女主播| 小处雏高清一区二区三区| 亚洲一区日韩在线| 国产日韩在线亚洲字幕中文| 久久久久久久久久久成人| 欧美亚洲视频一区二区| 国产午夜精品一区理论片飘花| 久久九九全国免费精品观看| 久久久久亚洲综合| 亚洲人成免费| 亚洲视频在线免费观看| 国产日韩亚洲欧美精品| 欧美国产亚洲另类动漫| 欧美日韩免费观看一区=区三区| 亚洲无亚洲人成网站77777| 亚洲一区久久久| 亚洲国产91精品在线观看| 欧美一二三视频| 老司机精品福利视频| 欧美不卡三区| 亚洲国产精品福利| 美女性感视频久久久| 欧美电影免费观看高清| 在线播放一区| 猫咪成人在线观看| 亚洲第一福利视频| 亚洲人成在线观看一区二区| 免费视频一区二区三区在线观看| 男女精品视频| 亚洲精品裸体| 欧美日韩免费视频| 亚洲视频导航| 久久精品一区中文字幕| 国内久久精品| 欧美国产精品日韩| 欧美~级网站不卡| 久久精品官网| 欧美日韩在线视频一区二区| 老司机亚洲精品| 亚洲在线免费| 欧美日韩国产大片| 亚洲精品影院| 亚洲欧美成人精品| 国产亚洲精品久久久久婷婷瑜伽| 欧美亚洲视频| 欧美激情aⅴ一区二区三区| 亚洲精品视频一区| 欧美系列一区| 欧美诱惑福利视频| 欧美3dxxxxhd| 一本色道久久综合一区| 国产精品伊人日日| 久久深夜福利免费观看| 最近看过的日韩成人| 亚洲一区二区三区精品在线| 国产精品亚洲а∨天堂免在线| 免费一区视频| 欧美精品精品一区| 亚洲九九精品| 日韩一级网站| 欧美激情国产日韩| 亚洲国产精品高清久久久| 精品99一区二区三区| 久久国产精品毛片| 久久男女视频| 好看的亚洲午夜视频在线| 欧美一区二区视频在线| 欧美一激情一区二区三区| 国产精品乱码一区二区三区 | 欧美a级一区二区| 韩国女主播一区| 久久国产精品99国产| 久久久欧美一区二区| 精品成人一区二区三区| 久久久精品国产免费观看同学| 老**午夜毛片一区二区三区| 在线成人av.com| 欧美成人一区在线| 亚洲欧洲日本专区| 亚洲四色影视在线观看| 欧美永久精品| 欧美激情片在线观看| 久久久综合网站| 欧美亚洲尤物久久| 亚洲午夜精品久久久久久浪潮| 亚洲国产女人aaa毛片在线| 国产日韩精品在线观看| 欧美日韩在线观看一区二区| 久久嫩草精品久久久精品一| 亚洲欧美在线x视频| 一二三区精品| 亚洲精品日韩欧美| 最新亚洲电影| 欧美黑人多人双交| 麻豆国产va免费精品高清在线| 欧美亚洲综合另类| 亚洲免费综合| 亚洲免费在线视频| 亚洲免费人成在线视频观看| 久久另类ts人妖一区二区| 久久综合网色—综合色88| 夜夜嗨av一区二区三区| 国产日本欧美一区二区| 久久综合999| 一区二区av在线| 亚洲乱码一区二区| 欧美亚洲第一页| 夜夜爽av福利精品导航 | 亚洲电影自拍| 亚洲无线观看| 亚洲第一网站| 国产精品无人区| 麻豆精品视频在线观看| 一区二区三区四区蜜桃| 麻豆久久久9性大片| 亚洲一区二区黄色| 亚洲茄子视频| 国语自产精品视频在线看8查询8| 欧美肥婆在线| 久久成人精品一区二区三区| 亚洲精品一区二区三| 久热精品在线视频| 午夜一区二区三视频在线观看| 亚洲国产精品传媒在线观看| 国产嫩草影院久久久久| 欧美日韩小视频| 欧美jizz19hd性欧美| 久久久久久电影| 欧美夜福利tv在线| 亚洲一区欧美二区| 日韩视频在线观看国产| 亚洲风情在线资源站|