久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

PLY文档翻译——利用Python进行词法和语法分析

發布時間:2023/12/20 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PLY文档翻译——利用Python进行词法和语法分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PLY (Python Lex-Yacc)

文章目錄

    • 1. Preface and Requirements
    • 2. Introduction
    • 3. PLY Overview
    • 4. Lex
      • 4.1 Lex Example
      • 4.2 The tokens list
      • 4.3 Specification of tokens
      • 4.4 Token values
      • 4.5 Discarded tokens
      • 4.6 Line numbers and positional information
      • 4.7 Ignored characters
      • 4.8 Literal characters
      • 4.9 Error handling
      • 4.10 EOF Handling
      • 4.11 Building and using the lexer
      • 4.12 The @TOKEN decorator
      • 4.13 Optimized mode
      • 4.14 Debugging
      • 4.15 Alternative specification of lexers
      • 4.16 Maintaining state
      • 4.17 Lexer cloning
      • 4.18 Internal lexer state
      • 4.19 Conditional lexing and start conditions
      • 4.20 Miscellaneous Issues
    • 5. Parsing basics
    • 6. Yacc
      • 6.1 An example
      • 6.2 Combining Grammar Rule Functions
      • 6.3 Character Literals
      • 6.4 Empty Productions
      • 6.5 Changing the starting symbol
      • 6.6 Dealing With Ambiguous Grammars
      • 6.7 The parser.out file
      • 6.8 Syntax Error Handling
      • 6.9 Line Number and Position Tracking
      • 6.10 AST Construction
      • 6.11 Embedded Actions
      • 6.12 Miscellaneous Yacc Notes
    • 7. Multiple Parsers and Lexers
    • 8. Using Python's Optimized Mode
    • 9. Advanced Debugging
      • 9.1 Debugging the lex() and yacc() commands
      • 9.2 Run-time Debugging
    • 10. Packaging Advice
    • 11. Where to go from here?

1. Preface and Requirements

本文檔提供了使用PLY進行詞法分析和解析的概述,考慮到解析的內在復雜性,我強烈建議您在使用PLY進行大型開發項目之前閱讀(或至少略讀)整個文檔。

2. Introduction

PLY是流行的編譯器構造工具lex和yacc的純python實現。PLY的主要目標是相當忠實于傳統lex/yacc工具的工作方式。這包括支持LALR(1)解析,以及提供廣泛的輸入驗證、錯誤報告和診斷。因此,如果您在另一種編程語言中使用過yacc,那么使用PLY應該相對簡單。

PLY的早期版本是為了支持David 2001年在芝加哥大學(University of Chicago)教授的編譯器入門課程而開發的。由于PLY最初是作為教學工具開發的,所以您會發現它對標記和語法規則規范相當挑剔。在某種程度上,這種附加的形式是為了捕捉新手用戶所犯的常見編程錯誤。然而,高級用戶在為真正的編程語言構建復雜語法時也會發現這些特性非常有用。還應該注意,PLY沒有提供太多額外功能(例如,自動構造抽象語法樹、遍歷樹等)。我也不認為它是一個解析框架。相反,您將發現一個完全用Python編寫的、功能齊全的基本lex/yacc實現。

本文的其余部分需要假設您對解析理論、語法制導翻譯以及其他編程語言中編譯器構造工具(如lex和yacc)的使用有一定的了解。如果您不熟悉這些主題,您可能想要查閱介紹性的文本,例如Aho、Sethi和Ullman編寫的“編譯器:原則、技術和工具”。O’Reilly的John Levine的《Lex and Yacc》可能也很方便。事實上,O’Reilly的書可以作為PLY的參考,因為這兩個概念實際上是相同的。

3. PLY Overview

PLY由兩個單獨的模塊組成:lex.py 和 yacc. p y。都可以在名為ply的Python包中找到。

lex.py模塊用于將輸入的文本通過正則表達式轉化成一系列特定的token。

yacc.py用于識別以上下文無關語法形式指定的語言語法。

這兩種工具應該一起工作。具體來說,lex.py以token()函數的形式提供了一個外部接口,該函數返回輸入流上的下一個有效token。yacc.py用于反復調用函數來檢索標記并調用語法規則。yacc.py的輸出通常是抽象語法樹(AST)。然而,這完全取決于用戶。如果需要,還可以使用yacc.py實現簡單的單遍編譯器。

與Unix對應程序一樣,yacc.py提供了您期望的大部分特性,包括廣泛的錯誤檢查、語法驗證、對空結果的支持、錯誤標記以及通過優先規則解決歧義。事實上,幾乎所有在傳統yacc中可以實現的功能都應該得到充分的支持。

yacc.py和Unix 中yacc的主要區別在于,yacc.py不涉及單獨的代碼生成過程。相反,PLY依賴于反射(內省)來構建它的詞法分析器和解析器。與傳統的lex/yacc不同,傳統的lex/yacc需要將一個特殊的輸入文件轉換為一個單獨的源文件,而PLY的規范是有效的Python程序。

這意味著沒有額外的源文件,也沒有特殊的編譯器構造步驟(例如,運行yacc為編譯器生成Python代碼)。由于生成解析表的成本相對較高,PLY緩存結果并將其保存到文件中。如果在輸入源中沒有檢測到任何更改,則從緩存中讀取表。否則,它們將被重新生成。

4. Lex

lex.py用于將輸入的代碼轉化為token序列,假設你將輸入的程序語言為如下的語句:

x = 3 + 42 * (s - t)

一個分詞器將會把這語句分割成單個的token:

'x','=', '3', '+', '42', '*', '(', 's', '-', 't', ')'

Token通常需要給一個名字來標注它們是哪個類型的,例如:

'ID','EQUALS','NUMBER','PLUS','NUMBER','TIMES','LPAREN','ID','MINUS','ID','RPAREN'

更具體的來講,輸入被分成包含類型和相應值的序列,例如:

('ID','x'), ('EQUALS','='), ('NUMBER','3'), ('PLUS','+'), ('NUMBER','42), ('TIMES','*'),('LPAREN','('), ('ID','s'), ('MINUS','-'),('ID','t'), ('RPAREN',')'

通常情況下通過一系列的正則表達式來確定token,下一節將來具體介紹它在lex.py中如何實現。

4.1 Lex Example

下面的例子將介紹lex.py將如何實現一個簡單的分詞器。

# ------------------------------------------------------------ # calclex.py # # tokenizer for a simple expression evaluator for # numbers and +,-,*,/ # ------------------------------------------------------------ import ply.lex as lex# List of token names. This is always required tokens = ('NUMBER','PLUS','MINUS','TIMES','DIVIDE','LPAREN','RPAREN', )# Regular expression rules for simple tokens t_PLUS = r'\+' t_MINUS = r'-' t_TIMES = r'\*' t_DIVIDE = r'/' t_LPAREN = r'\(' t_RPAREN = r'\)'# A regular expression rule with some action code def t_NUMBER(t):r'\d+'t.value = int(t.value) return t# Define a rule so we can track line numbers def t_newline(t):r'\n+'t.lexer.lineno += len(t.value)# A string containing ignored characters (spaces and tabs) t_ignore = ' \t'# Error handling rule def t_error(t):print("Illegal character '%s'" % t.value[0])t.lexer.skip(1)# Build the lexer lexer = lex.lex()

要想使用這個詞法分析程序,你首先需要使用input()方法輸入一些文本,然后重復調用token()方法生成token序列,如下代碼是展示了它是如何運作的。

# Test it outdata = '''3 + 4 * 10+ -20 *2'''# Give the lexer some inputlexer.input(data)# Tokenizewhile True:tok = lexer.token()if not tok: break # No more inputprint(tok)

執行的結果為:

LexToken(NUMBER,3,2,1)LexToken(PLUS,'+',2,3)LexToken(NUMBER,4,2,5)LexToken(TIMES,'*',2,7)LexToken(NUMBER,10,2,10)LexToken(PLUS,'+',3,14)LexToken(MINUS,'-',3,16)LexToken(NUMBER,20,3,18)LexToken(TIMES,'*',3,20)LexToken(NUMBER,2,3,21)

lexer.token()方法會返回一個LexToken的實例,該對象中的屬性包括:tok.type, tok.value, tok.lineno和tok.lexpos。

其中type和value指的是token中的類型和相應的值,tok.lineno和tok.lexpos表示的這個token的位置,tok.lexpos 是相對應的這段輸入文本起始地址的相對地址。

例如“3”這個數字表示了位于data中第2行,是data第一個元素,“+”(第三行)表示了位于data中第3行,是data第14個元素。注意一個空格也算占一個位置。

4.2 The tokens list

所有的詞法分析程序必須定義tokens來表明所有可能的token名稱,只有這些名稱將會被詞法分析程序來處理。定義這個序列往往是必要的,也被用于執行各種驗證檢查。而且在yacc.py模塊中也用于確定終結符。

例如,下列代碼確定了一系列的token名稱:

tokens = ('NUMBER','PLUS','MINUS','TIMES','DIVIDE','LPAREN','RPAREN',)

4.3 Specification of tokens

每個token都是通過編寫與Python的re模塊兼容的正則表達式規則來指定的。每個規則都是通過使用一個特殊前綴t_聲明來定義的,以表明它定義了一個token。

對于簡單的token,正則表達式可以指定為這樣的字符串(注意:使用Python原始字符串,因為它們是編寫正則表達式字符串最方便的方法):

t_PLUS = r'\+'

在這種情況下,t_后面的名稱必須與tokens中提供的名稱完全匹配。如果需要執行某種操作,可以將令牌規則指定為函數。例如,該規則匹配數字并將字符串轉換為Python整數。

def t_NUMBER(t):r'\d+'t.value = int(t.value)return t

當使用函數時,正則表達式規則在函數文檔字符串中指定。該函數總是接受單個參數,即LexToken的實例。每個LexToken中含有四種屬性:

  • t.type :類型
  • t.value:值
  • t.lineno :標明第幾行
  • t.lexpos :相對于文本起始位置的相對位置

通常情況下,t.type的名稱與t_后跟的名稱一致,action函數可以根據需要修改LexToken對象的內容。但是,當它完成時,應該返回生成的token。如果action函數沒有返回值,則只丟棄令牌并讀取下一個token。

在內部,lex.py使用re模塊進行模式匹配。模式是使用re.VERBOSE標志編譯的,該標志可用于提高可讀性。但是,請注意,未轉義的空格將被忽略,并且在此模式下允許注釋。如果您的模式包含空格,請確保使用\s。如果需要匹配#字符,請使用[#]。

構建主正則表達式時,按如下順序添加規則:

1)函數定義的所有token都按照它們在lexer文件中出現的相同順序添加。

2)按照正則表達式長度遞減的順序對字符串定義的標記進行排序(首先添加更長的表達式)。

如果沒有這種排序,就很難正確匹配某些類型的token。例如,如果您想為“=”和“==” 使用單獨的標記,您需要確保首先選中了“==”。通過對正則表達式按長度遞減排序,解決了定義為字符串的規則的排序問題。對于函數,可以顯式地控制順序,因為首先檢查出現的規則。

要處理保留字,您應該編寫一個規則來匹配標識符,并在函數中執行一個特殊的名稱查找,如下所示:

reserved = {'if' : 'IF','then' : 'THEN','else' : 'ELSE','while' : 'WHILE',...}tokens = ['LPAREN','RPAREN',...,'ID'] + list(reserved.values())def t_ID(t):r'[a-zA-Z_][a-zA-Z_0-9]*'t.type = reserved.get(t.value,'ID')# Check for reserved wordsreturn t

這種方法極大地減少了正則表達式規則的數量,并可能使事情更快一些。

注意:您應該避免為保留字編寫單獨的規則。例如,如果你這樣寫規則:

t_FOR = r'for't_PRINT = r'print'

對于包含這些單詞作為前綴的標識符,如“forget”或“printed”,將觸發這些規則。這可能不是你想要的。

4.4 Token values

當lex返回token時,它們有一個值存儲在value屬性中。通常,值是匹配的文本。但是,該值可以分配給任何Python對象。例如,在對標識符進行詞法分析時,可能希望同時返回標識符名稱和來自某種符號表的信息。要做到這一點,你可以這樣寫一條規則:

def t_ID(t):...# Look up symbol table information and return a tuplet.value = (t.value, symbol_lookup(t.value))...return t

需要注意的是,不建議使用其他屬性名存儲數據。yacc.py模塊只公開value屬性的內容。因此,訪問其他屬性可能是不必要的尷尬。如果需要在token上存儲多個值,請將元組、字典或實例賦值。

4.5 Discarded tokens

如果是注釋,則需要跳過對應標志,例如:

def t_COMMENT(t):r'\#.*'pass# No return value. Token discarded

或者,您可以在token聲明中包含前綴“ignore_”,以強制忽略token。例如:

t_ignore_COMMENT = r'\#.*'

請注意,如果忽略了許多不同類型的文本,您可能仍然希望使用函數,因為這些函數提供了對正則表達式匹配順序的更精確控制(即,函數按指定的順序匹配,而字符串按正則表達式長度排序)。

4.6 Line numbers and positional information

默認情況下,lex.py并不知道行號信息,因為它并不清楚是什么構成了一行(例如一個換行符)。如果要更新這個信息,則需要寫一個規則,如:

# Define a rule so we can track line numbersdef t_newline(t):r'\n+'t.lexer.lineno += len(t.value)

在這個規則下,lineno 屬性就會更新了,當這個行號更新以后,這個token就直接被忽略了,而不用返回值。

lex.py沒有使用任何自動的列追蹤,然而它確實在lexpos 中記錄了token相關的位置信息,使用這種方法,通常可以將計算列信息作為一個單獨的步驟。例如,只需向后計數,直到到達換行為止。

# Compute column.# input is the input text string# token is a token instancedef find_column(input, token):line_start = input.rfind('\n', 0, token.lexpos) + 1return (token.lexpos - line_start) + 1

由于列信息通常只在錯誤處理上下文中有用,因此可以在需要時計算列位置,而不是對每個token進行計算。

4.7 Ignored characters

對于輸入流中應該完全忽略的字符,lex.py保留了特殊的t_ignore規則。通常這是用來跳過空白和其他不必要的字符。盡管可以以類似于t_newline()的方式為空白定義正則表達式規則,但是t_ignore的使用提供了更好的詞法分析性能,因為它是作為一種特殊情況處理的,并且以比常規正則表達式規則更有效的方式進行檢查。

當t_ignore中給出的字符是其他正則表達式模式的一部分時,這些字符不會被忽略。例如,如果您有一個捕獲引用文本的規則,那么該模式可以包含被忽略的字符(將以正常方式捕獲這些字符)。t_ignore的主要目的是忽略要解析的標記之間的空格和其他填充。

4.8 Literal characters

文字字符可以通過在詞法分析模塊中定義變量文字來指定。例如:

literals = [ '+','-','*','/' ]

或者:

literals = "+-*/"

文字字符只是lexer遇到時返回“原樣”的單個字符。

在所有定義的正則表達式規則之后檢查文本。因此,如果規則以其中一個文字字符開始,它總是優先。

當返回文字標記時,它的類型和值屬性都設置為字符本身。例如,“+”。

當字面值匹配時,可以編寫執行附加操作的token函數。但是,您需要適當地設置token類型。例如:

literals = [ '{', '}' ]def t_lbrace(t):r'\{'t.type = '{' # Set token type to the expected literalreturn tdef t_rbrace(t):r'\}'t.type = '}' # Set token type to the expected literalreturn t

4.9 Error handling

t_error函數的作用是:處理檢測到非法字符時發生的詞法分析錯誤。

# Error handling ruledef t_error(t):print("Illegal character '%s'" % t.value[0])t.lexer.skip(1)

在本例中,我們只需打印出違規字符并通過調用t.lexer.skip(1)跳過一個字符。

4.10 EOF Handling

t_eof()函數的作用是:處理輸入中的文件結束(EOF)條件。作為輸入,它接收一個token類型“eof”,并適當設置lineno和lexpos屬性。這個函數的主要用途是為lexer提供更多的輸入,以便它能夠繼續解析。下面是一個例子:

# EOF handling ruledef t_eof(t):# Get more input (Example)more = raw_input('... ')if more:self.lexer.input(more)return self.lexer.token()return None

EOF函數應該返回下一個可用的token(通過調用self.lexer.token()或None來指示沒有更多的數據。注意,使用self.lexer.input()方法設置更多的輸入并不會重置lexer狀態或用于位置跟蹤的lineno屬性。lexpos屬性被重置,所以如果在錯誤報告中使用它,請注意這一點。

4.11 Building and using the lexer

構建一個詞法分析器的方法為:

lexer = lex.lex()

該函數使用Python反射(或內省)從調用上下文中讀取正則表達式規則并構建lexer。一旦構建了lexer,就可以使用兩種方法來控制lexer。

  • lexer.input(data). 根據輸入的data重新設置詞法分析器
  • lexer.token(). 返回下一個token。

4.12 The @TOKEN decorator

在某些應用程序中,您可能希望將構建token定義為一系列更復雜的正則表達式規則。例如:

digit = r'([0-9])'nondigit = r'([_A-Za-z])'identifier = r'(' + nondigit + r'(' + digit + r'|' + nondigit + r')*)' def t_ID(t):# want docstring to be identifier above. ?????...

在本例中,我們希望ID的正則表達式規則是上面的變量之一。但是,無法使用普通的文檔字符串直接指定它。要解決這個問題,可以使用@TOKEN裝飾器。例如:

from ply.lex import TOKEN@TOKEN(identifier)def t_ID(t):...

這將為t_ID()附加標識符,允許lex.py正常工作。

4.13 Optimized mode

為了提高性能,最好使用Python的優化模式(例如,使用-O選項運行Python)。但是,這樣做會導致Python忽略文檔字符串。這給lex.py帶來了特殊的問題。要處理這種情況,可以使用如下優化選項創建lexer:

lexer = lex.lex(optimize=1)

接下來,以正常的操作模式運行Python。當您這樣做時,lex.py將在包含lexer規范的模塊所在的目錄中編寫一個名為lextab.py的文件。該文件包含在詞法分析期間使用的所有正則表達式規則和表。在隨后的執行中,只需要導入lextab.py來構建lexer。這種方法大大提高了lexer的啟動時間,并且可以在Python的優化模式下工作。

要更改lexer生成的模塊的名稱,請使用lextab關鍵字參數。例如:

lexer = lex.lex(optimize=1,lextab="footab")

在優化模式下運行時,必須注意lex禁用了大多數錯誤檢查。因此,只有在您確信所有操作都是正確的,并且準備好開始發布生產代碼時,才真正推薦這樣做。

4.14 Debugging

為了調試,您可以在調試模式下運行lex(),如下所示:

lexer = lex.lex(debug=1)

這將生成各種調試信息,包括所有添加的規則、lexer使用的主正則表達式和詞法分析期間生成的標記。

此外,lex.py附帶了一個簡單的main函數,它可以標記從標準輸入讀取的輸入,也可以標記從命令行指定的文件讀取的輸入。要使用它,只需把它放進你的詞典:

if __name__ == '__main__':lex.runmain()

有關調試的更高級細節,請參閱末尾的“調試”一節。

4.15 Alternative specification of lexers

如示例所示,lexer都是在一個Python模塊中指定的。如果希望將token規則放在與調用lex()的模塊不同的模塊中,請使用module關鍵字參數。

例如,您可能有一個專門的模塊,它只包含token規則:

# This module just contains the lexing rules# List of token names. This is always required tokens = ('NUMBER','PLUS','MINUS','TIMES','DIVIDE','LPAREN','RPAREN', )# Regular expression rules for simple tokens t_PLUS = r'\+' t_MINUS = r'-' t_TIMES = r'\*' t_DIVIDE = r'/' t_LPAREN = r'\(' t_RPAREN = r'\)'# A regular expression rule with some action code def t_NUMBER(t):r'\d+'t.value = int(t.value) return t# Define a rule so we can track line numbers def t_newline(t):r'\n+'t.lexer.lineno += len(t.value)# A string containing ignored characters (spaces and tabs) t_ignore = ' \t'# Error handling rule def t_error(t):print("Illegal character '%s'" % t.value[0])t.lexer.skip(1)

使用這個token規則的代碼如下:

>>> import tokrules>>> lexer = lex.lex(module=tokrules)>>> lexer.input("3 + 4")>>> lexer.token()LexToken(NUMBER,3,1,1,0)>>> lexer.token()LexToken(PLUS,'+',1,2)>>> lexer.token()LexToken(NUMBER,4,1,4)>>> lexer.token()None

模塊選項還可以用于從類的實例定義lexer。例如:

import ply.lex as lex class MyLexer(object):# List of token names. This is always requiredtokens = ('NUMBER','PLUS','MINUS','TIMES','DIVIDE','LPAREN','RPAREN',)# Regular expression rules for simple tokenst_PLUS = r'\+'t_MINUS = r'-'t_TIMES = r'\*'t_DIVIDE = r'/'t_LPAREN = r'\('t_RPAREN = r'\)'# A regular expression rule with some action code# Note addition of self parameter since we're in a classdef t_NUMBER(self,t):r'\d+'t.value = int(t.value) return t# Define a rule so we can track line numbersdef t_newline(self,t):r'\n+'t.lexer.lineno += len(t.value)# A string containing ignored characters (spaces and tabs)t_ignore = ' \t'# Error handling ruledef t_error(self,t):print("Illegal character '%s'" % t.value[0])t.lexer.skip(1)# Build the lexerdef build(self,**kwargs):self.lexer = lex.lex(module=self, **kwargs)# Test it outputdef test(self,data):self.lexer.input(data)while True:tok = self.lexer.token()if not tok: breakprint(tok)# Build the lexer and try it out m = MyLexer() m.build() # Build the lexer m.test("3 + 4") # Test it

在從類構建lexer時,應該從類的實例而不是類對象本身構建lexer。這是因為PLY只有在lexer操作由綁定方法定義時才能正常工作。

當使用lex()的模塊選項時,PLY使用dir()函數從底層對象收集符號。不能直接訪問作為模塊值提供的對象的_dict__屬性。

最后,如果您希望保持良好的封裝,但不希望使用完整的類定義,可以使用閉包定義lexer。例如:

import ply.lex as lex# List of token names. This is always requiredtokens = ('NUMBER','PLUS','MINUS','TIMES','DIVIDE','LPAREN','RPAREN',)def MyLexer():# Regular expression rules for simple tokenst_PLUS = r'\+'t_MINUS = r'-'t_TIMES = r'\*'t_DIVIDE = r'/'t_LPAREN = r'\('t_RPAREN = r'\)'# A regular expression rule with some action codedef t_NUMBER(t):r'\d+'t.value = int(t.value) return t# Define a rule so we can track line numbersdef t_newline(t):r'\n+'t.lexer.lineno += len(t.value)# A string containing ignored characters (spaces and tabs)t_ignore = ' \t'# Error handling ruledef t_error(t):print("Illegal character '%s'" % t.value[0])t.lexer.skip(1)# Build the lexer from my environment and return it return lex.lex()

重要提示:如果您使用類或閉包定義lexer,請注意PLY仍然要求您僅為每個模塊(源文件)定義一個lexer。如果不遵循這條規則,那么層中有大量的驗證/錯誤檢查部分可能會錯誤地報告錯誤消息。

4.16 Maintaining state

在lexer中,您可能希望維護各種狀態信息。這可能包括模式設置、符號表和其他細節。作為一個例子,假設您想跟蹤遇到了多少個NUMBER 。

一種方法是在創建lexer的模塊中保留一組全局變量。例如:

num_count = 0def t_NUMBER(t):r'\d+'global num_countnum_count += 1t.value = int(t.value) return t

如果您不喜歡使用全局變量,那么可以在lex()創建的Lexer對象中存儲信息。為此,您可以使用傳遞給各種規則的令牌的lexer屬性。例如:

def t_NUMBER(t):r'\d+'t.lexer.num_count += 1 # Note use of lexer attributet.value = int(t.value) return tlexer = lex.lex()lexer.num_count = 0 # Set the initial count

后一種方法的優點是簡單,可以在同一個應用程序中存在多個給定lexer實例的應用程序中正確工作。然而,對于OO純粹主義者來說,這也可能是對封裝的嚴重違反。為了讓您放心,lexer的所有內部屬性(lineno除外)都有以lex為前綴的名稱(例如,lexdata、lexpos等)。因此,在lexer中存儲沒有以該前綴開頭的名稱或與預定義方法(例如input()、token()等)沖突的名稱的屬性是完全安全的。

如果不喜歡對lexer對象賦值,可以將lexer定義為一個類,如下面的部分所示:

class MyLexer:...def t_NUMBER(self,t):r'\d+'self.num_count += 1t.value = int(t.value) return tdef build(self, **kwargs):self.lexer = lex.lex(object=self,**kwargs)def __init__(self):self.num_count = 0

如果您的應用程序要創建同一個lexer的多個實例,并且需要管理大量狀態,那么類方法可能是最容易管理的。

狀態也可以通過閉包來管理。例如,在python3中:

def MyLexer():num_count = 0...def t_NUMBER(t):r'\d+'nonlocal num_countnum_count += 1t.value = int(t.value) return t...

4.17 Lexer cloning

如果需要,可以通過調用它的clone()方法復制lexer對象。例如:

lexer = lex.lex()...newlexer = lexer.clone()

克隆lexer時,該副本與原始lexer完全相同,包括任何輸入文本和內部狀態。但是,克隆允許提供一組不同的輸入文本,這些文本可以單獨處理。在編寫涉及遞歸或可重入處理的解析器/編譯器時,這可能很有用。例如,如果出于某種原因需要提前掃描輸入,可以創建一個克隆并使用它來提前查看。或者,如果您正在實現某種預處理器,可以使用克隆的lexer來處理不同的輸入文件。

創建克隆與調用lex.lex()不同,因為PLY不會重新生成任何內部表或正則表達式。

在克隆還使用類或閉包維護自身內部狀態的lexer時,需要特別注意。也就是說,您需要知道新創建的lexer將與原始lexer共享所有這些狀態。例如,如果您將lexer定義為一個類并執行以下操作:

m = MyLexer()a = lex.lex(object=m) # Create a lexerb = a.clone() # Clone the lexer

然后a和b都將綁定到同一個對象m上,對m的任何更改都將反映在兩個lexer中。需要強調的是,clone()只意味著創建一個新的lexer,它重用另一個lexer的正則表達式和環境。如果需要創建一個全新的lexer副本,那么再次調用lex()。

4.18 Internal lexer state

Lexer對象Lexer具有許多內部屬性,這些屬性在某些情況下可能有用。

lexer.lexpos

此屬性是一個整數,包含輸入文本中的當前位置。如果修改該值,它將更改對token()的下一個調用的結果。在token規則函數中,它指向匹配文本之后的第一個字符。如果在規則中修改了該值,則將在新位置匹配下一個返回的token。

lexer.lineno

存儲在lexer中的行號屬性的當前值。PLY只指定屬性存在——它從不設置、更新或執行任何處理。如果您想跟蹤行號,您需要自己添加代碼(請參閱行號和位置信息一節)。

lexer.lexdata

存儲在lexer中的當前輸入文本。這是通過input()方法傳遞的字符串。除非你真的知道你在做什么,否則修改它可能不是一個好主意。

lexer.lexmatch

這是Python re.match()函數(PLY在內部使用)為當前令牌返回的原始匹配對象。如果您編寫了包含命名組的正則表達式,則可以使用它檢索這些值。注意:此屬性僅在由函數定義和處理token時更新。

4.19 Conditional lexing and start conditions

在高級解析應用程序中,具有不同的詞法分析狀態可能很有用。例如,您可能希望某個token或語法結構的出現觸發另一種類型的詞法分析。PLY支持一個特性,該特性允許將底層lexer放入一系列不同的狀態。每個狀態都可以有自己的token、詞法規則等等。該實現主要基于GNU flex的“啟動條件”特性。詳細信息可以在http://flex.sourceforge.net/manual/startconditions .html中找到。

要定義一個新的lexing狀態,必須首先聲明它。這是通過在lex文件中包含一個“states”聲明來實現的。例如:

states = (('foo','exclusive'),('bar','inclusive'),)

這個聲明聲明了兩個狀態,‘foo’和’bar’。狀態可分為兩類;“獨占exclusive”和“包含inclusive”。獨占狀態完全覆蓋lexer的默認行為。也就是說,lex只返回token并應用為該狀態定義的規則。包含狀態將附加狀態和規則添加到默認規則集。因此,除了為包含狀態定義的包含之外,lex還將返回默認定義的兩個包含。

一旦聲明了狀態,就通過在token/規則聲明中包含狀態名來聲明token和規則。例如:

t_foo_NUMBER = r'\d+' # Token 'NUMBER' in state 'foo' t_bar_ID = r'[a-zA-Z_][a-zA-Z0-9_]*' # Token 'ID' in state 'bar'def t_foo_newline(t):r'\n't.lexer.lineno += 1

通過在聲明中包含多個狀態名,可以在多個狀態中聲明token。例如:

t_foo_bar_NUMBER = r'\d+' # Defines token 'NUMBER' in both state 'foo' and 'bar'

另一種方法是,可以在所有狀態中使用名稱中的“ANY”聲明令牌:

t_ANY_NUMBER = r'\d+' # Defines a token 'NUMBER' in all states

如果沒有提供狀態名(通常是這種情況),則令牌與一個特殊的狀態“INITIAL”關聯。例如,這兩個聲明是相同的:

t_foo_ignore = " \t\n" # Ignored characters for state 'foo'def t_bar_error(t): # Special error handler for state 'bar'pass

默認情況下,lexing在“初始”狀態下運行。此狀態包括所有通常定義的令牌。對于不使用不同狀態的用戶,這個事實是完全透明的。如果在進行詞法分析或解析時,希望更改詞法分析狀態,請使用begin()方法。例如:

def t_begin_foo(t):r'start_foo't.lexer.begin('foo') # Starts 'foo' state

要脫離狀態,可以使用begin()切換回初始狀態。例如:

def t_foo_end(t):r'end_foo't.lexer.begin('INITIAL') # Back to the initial state

狀態管理也可以通過堆棧來完成。例如:

def t_begin_foo(t):r'start_foo't.lexer.push_state('foo') # Starts 'foo' statedef t_foo_end(t):r'end_foo't.lexer.pop_state() # Back to the previous state

堆棧的使用在以下情況下非常有用:有許多方法可以進入新的lexing狀態,而您只是想在以后返回到以前的狀態。

舉個例子可能更清晰。假設您正在編寫一個解析器,并且希望獲取用大括號括起來的任意C代碼段。也就是說,每當遇到開始大括號“{”時,都希望讀取所包含的所有代碼,直到結束大括號“}”,并將其作為字符串返回。使用普通正則表達式規則來實現這一點幾乎是不可能的。這是因為大括號可以嵌套,可以包含在注釋和字符串中。因此,僅僅匹配第一個匹配的“}”字符是不夠的。下面是使用lexer狀態的方法:

# Declare the statestates = (('ccode','exclusive'),)# Match the first {. Enter ccode state.def t_ccode(t):r'\{'t.lexer.code_start = t.lexer.lexpos # Record the starting positiont.lexer.level = 1 # Initial brace levelt.lexer.begin('ccode') # Enter 'ccode' state# Rules for the ccode statedef t_ccode_lbrace(t): r'\{'t.lexer.level +=1 def t_ccode_rbrace(t):r'\}'t.lexer.level -=1# If closing brace, return the code fragmentif t.lexer.level == 0:t.value = t.lexer.lexdata[t.lexer.code_start:t.lexer.lexpos+1]t.type = "CCODE"t.lexer.lineno += t.value.count('\n')t.lexer.begin('INITIAL') return t# C or C++ comment (ignore) def t_ccode_comment(t):r'(/\*(.|\n)*?\*/)|(//.*)'pass# C stringdef t_ccode_string(t):r'\"([^\\\n]|(\\.))*?\"'# C character literaldef t_ccode_char(t):r'\'([^\\\n]|(\\.))*?\''# Any sequence of non-whitespace characters (not braces, strings)def t_ccode_nonspace(t):r'[^\s\{\}\'\"]+'# Ignored characters (whitespace)t_ccode_ignore = " \t\n"# For bad characters, we just skip over itdef t_ccode_error(t):t.lexer.skip(1)

在本例中,第一個“{”的出現導致lexer記錄起始位置并輸入一個新的狀態“ccode”。然后,一組規則匹配隨后輸入的各個部分(注釋、字符串等)。所有這些規則都只是丟棄令牌(通過不返回值)。但是,如果遇到右大括號,規則t_ccode_r大括號將收集所有代碼(使用前面記錄的起始位置),存儲它,并返回一個包含所有文本的令牌“CCODE”。當返回令牌時,詞法分析狀態將恢復到初始狀態。

4.20 Miscellaneous Issues

  • lexer要求以單個輸入字符串的形式提供輸入。由于大多數機器都有足夠的內存,因此很少會出現性能問題。但是,這意味著lexer目前不能用于流數據,例如打開的文件或套接字。這種限制主要是使用re模塊的副作用。您可以通過實現適當的def t_eof()文件末尾處理規則來解決這個問題。這里的主要復雜之處在于,您可能需要確保以某種方式將數據提供給lexer,這樣它就不會在令牌中間分裂。

  • lexer應該能夠正確地處理作為令牌和模式匹配規則給出的Unicode字符串以及輸入文本。

  • 您需要向re.compile()函數提供可選的標志,使用lex的reflags選項。例如:

    lex.lex(reflags=re.UNICODE | re.VERBOSE)

    默認情況下,reflags被設置為re.VERBOSE。如果您提供了自己的標志,您可能需要將其包含在PLY中以保持其正常行為。

  • 由于lexer完全是用Python編寫的,所以它的性能在很大程度上取決于Python re模塊的性能。盡管lexer被編寫得盡可能的高效,但是當它被用于非常大的輸入文件時,它的速度并不快。如果關心性能,可以考慮升級到Python的最新版本,創建一個手寫的lexer,或者將lexer卸載到C擴展模塊中。

  • 如果您打算創建一個手寫的lexer,并計劃與yacc一起使用它。,只需要符合以下要求:

    • 它必須提供一個token()方法,該方法返回下一個令牌,如果沒有更多的令牌可用,則返回None。
    • token()方法必須返回一個具有類型和值屬性的對象tok。如果使用行號跟蹤,那么標記還應該定義一個lineno屬性。

5. Parsing basics

yacc.py用于解析語言的語法,在展示示例之前,必須提到一些重要的背景知識。首先,語法通常用BNF語法指定。例如,如果您想解析簡單的算術表達式,您可以首先編寫一個明確的語法規范,如下所示:

expression : expression + term| expression - term| termterm : term * factor| term / factor| factorfactor : NUMBER| ( expression )

在語法中,數字、+、-、*和/等符號被稱為終結符,與原始輸入標記相對應。

諸如term和factor之類的標識符是指由一組終結符和其他規則組成的語法規則,這些被稱之為非終結符。

語言的語義行為通常使用一種稱為語法制導翻譯的技術來指定。在語法制導翻譯中,屬性與操作一起附加到給定語法規則中的每個符號。只要識別出特定的語法規則,動作就描述要做什么。例如,給定上面的表達式語法,您可以編寫一個像這樣的簡單計算器的規范:

理解語法制導翻譯的一個方式是將語法中的每個符號看做是一個對象,與每個符號相關聯的是一個表示其“狀態”的值,然后,語義動作被表示為操作符號和相關值的函數或方法的集合。

Yacc使用的解析技術,稱為LR解析或shift-reduce解析,LR解析是一種自下而上的技術。

LR解析通過棧來操作,下面有一個用于解析 3 + 5 * (10 - 20) 的棧操作,其中$表示輸入的結束。


如果棧中頂部元素可以合并成生成式左邊的表達式,則可以進行合并。解析的成功取決于最終棧中元素為空且沒有新輸入的token。

6. Yacc

ply.yacc 模塊實現了PLY中的內容解析。Yacc代表"Yet Another Compiler Compiler" ,采用了和Unix中一樣的名稱。

6.1 An example

如果你想要做一個簡單的語法表達式的解析,下面有一個簡單的例子:

# Yacc exampleimport ply.yacc as yacc# Get the token map from the lexer. This is required. from calclex import tokensdef p_expression_plus(p):'expression : expression PLUS term'p[0] = p[1] + p[3]def p_expression_minus(p):'expression : expression MINUS term'p[0] = p[1] - p[3]def p_expression_term(p):'expression : term'p[0] = p[1]def p_term_times(p):'term : term TIMES factor'p[0] = p[1] * p[3]def p_term_div(p):'term : term DIVIDE factor'p[0] = p[1] / p[3]def p_term_factor(p):'term : factor'p[0] = p[1]def p_factor_num(p):'factor : NUMBER'p[0] = p[1]def p_factor_expr(p):'factor : LPAREN expression RPAREN'p[0] = p[2]# Error rule for syntax errors def p_error(p):print("Syntax error in input!")# Build the parser parser = yacc.yacc()while True:try:s = raw_input('calc > ')except EOFError:breakif not s: continueresult = parser.parse(s)print(result)

在上述例子中,每一個語法規則規定義為一個python的函數,每個函數接收一個參數p,其中p為一個包含每個語法符號對應值的序列。p[i]的值是一個語法符號的映射,如:

def p_expression_plus(p):'expression : expression PLUS term'# ^ ^ ^ ^# p[0] p[1] p[2] p[3]p[0] = p[1] + p[3]

對應token來說,p[i]的值類似于在詞法分析中的屬性值 p.value 。對于非終端結點而言,當進行規約的時候,該值取決于p[0]中放置的內容決定。這個值可以是任何值。然而,最常見的值可能是簡單的Python類型、元組或實例。在本例中,我們依賴于NUMBER在其值字段中存儲整數值。所有其他規則只是執行各種類型的整數操作并傳播結果。

注意:負索引的使用在yacc中有特殊的意義——在本例中,特殊的p[-1]與p[3]沒有相同的值。有關詳細信息,請參閱“嵌入式操作”一節。

yacc規范中定義的第一個規則確定開始語法符號(在本例中,首先出現expression規則)。每當解析器規約了起始規則,并且沒有更多的輸入可用時,解析就會停止,并返回最終的值(這個值將是p[0]中放置的最上面的規則)。注意:可以使用yacc()的start關鍵字參數start指定另一個啟動符號。

定義p_error§規則是為了捕獲語法錯誤。有關詳細信息,請參閱下面的錯誤處理部分。

要構建解析器,請調用yacc.yacc()函數。這個函數查看模塊并嘗試為您指定的語法構造所有LR解析表。第一次調用yacc.yacc()時,您將得到這樣一條消息:

$ python calcparse.pyGenerating LALR tablescalc >

由于表的構造相對比較昂貴(特別是對于大型語法),因此產生的解析表被寫到一個名為parsetab.py的文件中。此外,還有一個名為parser.out的調試文件創建。在隨后的執行中,yacc將從parsetab.py重新加載表,除非它檢測到底層語法的變化(在這種情況下,表和parsetab.py文件將重新生成)。這兩個文件都被寫到與指定解析器的模塊相同的目錄中。可以使用tabmodule關鍵字參數yacc()更改parsetab模塊的名稱。例如:

parser = yacc.yacc(tabmodule='fooparsetab')

如果在語法規范中檢測到任何錯誤,yacc.py將生成診斷消息,并可能引發異常。可以檢測到的錯誤包括:

  • 重復的函數名(如果語法文件中有多個規則函數具有相同的名稱)。
  • Shift/reduce和reduce/reduce由模糊語法生成的沖突
  • 語法規則不規范
  • 無限遞歸(永不終止的規則)
  • 未使用的規則和令
  • 未定義的規則和令牌

接下來的幾節將更詳細地討論語法規范。示例的最后一部分顯示了如何實際運行yacc()創建的解析器。要運行解析器,只需使用輸入文本字符串調用parse()。這將運行所有語法規則并返回整個解析的結果。這個結果返回值是在開始語法規則中分配給p[0]的值。

6.2 Combining Grammar Rule Functions

當語法規則相似時,可以將它們組合成一個函數。例如,考慮前面例子中的兩條規則:

def p_expression_plus(p):'expression : expression PLUS term'p[0] = p[1] + p[3]def p_expression_minus(t):'expression : expression MINUS term'p[0] = p[1] - p[3]

可以寫成一個函數,如下所示:

def p_expression(p):'''expression : expression PLUS term| expression MINUS term'''if p[2] == '+':p[0] = p[1] + p[3]elif p[2] == '-':p[0] = p[1] - p[3]

通常,任何給定函數的字符串都可以包含多個語法規則。所以,這樣寫也是合法的(盡管可能會讓人困惑):

def p_binary_operators(p):'''expression : expression PLUS term| expression MINUS termterm : term TIMES factor| term DIVIDE factor'''if p[2] == '+':p[0] = p[1] + p[3]elif p[2] == '-':p[0] = p[1] - p[3]elif p[2] == '*':p[0] = p[1] * p[3]elif p[2] == '/':p[0] = p[1] / p[3]

當將語法規則組合成單個函數時,通常所有規則都具有類似的結構(例如,相同數量的術語)。否則,相應的操作代碼可能比需要的更復雜。但是,可以使用len()處理簡單的情況。例如:

def p_expressions(p):'''expression : expression MINUS expression| MINUS expression'''if (len(p) == 4):p[0] = p[1] - p[3]elif (len(p) == 3):p[0] = -p[2]

解析性能是一個需要考慮的問題,您應該克制將太多條件處理放入單個語法規則的沖動,如這些示例所示。當您添加檢查以查看正在處理的語法規則時,實際上是在復制解析器已經執行的工作(即,解析器已經確切地知道它匹配的規則)。您可以通過為每個語法規則使用單獨的p_rule()函數來消除這種開銷。

6.3 Character Literals

如果需要,語法可以包含定義為單個字符文字的標記。例如:

def p_binary_operators(p):'''expression : expression '+' term| expression '-' termterm : term '*' factor| term '/' factor'''if p[2] == '+':p[0] = p[1] + p[3]elif p[2] == '-':p[0] = p[1] - p[3]elif p[2] == '*':p[0] = p[1] * p[3]elif p[2] == '/':p[0] = p[1] / p[3]

字符文字必須用引號括起來,如“+”。此外,如果使用了文本,則必須通過使用特殊的文本聲明在相應的lex文件中聲明它們。

# Literals. Should be placed in module given to lex()literals = ['+','-','*','/' ]

字符文字僅限于單個字符。因此,指定諸如’<=‘或’==‘之類的文字是不合法的。為此,使用常規的詞法規則(例如,定義一個規則,如t_EQ = r’==’)。

6.4 Empty Productions

yacc.py可以通過定義如下規則來處理空結果:

def p_empty(p):'empty :'pass

使用空結果可以直接使用“empty”作為符號,例如:

def p_optitem(p):'optitem : item'' | empty'...

注意:您可以在任何地方編寫空規則,只需指定右側為空即可。然而,我個人發現,寫一個“空”規則并用“空”來表示一個空的結果更容易閱讀,也更清楚地說明了您的意圖。

6.5 Changing the starting symbol

通常,在yacc規范中發現的第一個規則定義了開始語法規則(頂級規則)。要更改這一點,只需在文件中提供一個start說明符。例如:

start = 'foo'def p_bar(p):'bar : A B'# This is the starting rule due to the start specifier abovedef p_foo(p):'foo : bar X'...

在調試過程中使用start說明符可能很有用,因為您可以使用它來讓yacc構建更大語法的子集。為此,也可以指定起始符號作為yacc()的參數。例如:

parser = yacc.yacc(start='foo')

6.6 Dealing With Ambiguous Grammars

前面的例子中給出的表達式語法是用一種特殊的格式編寫的,以消除歧義。然而,在許多情況下,用這種格式編寫語法極其困難或尷尬。一種更自然的表達語法的方式是這樣一種更緊湊的形式:

expression : expression PLUS expression| expression MINUS expression| expression TIMES expression| expression DIVIDE expression| LPAREN expression RPAREN| NUMBER

不幸的是,這個語法規范是含糊不清的。例如,如果您正在解析字符串“3 * 4 + 5”,那么就無法知道操作符應該如何分組。例如,表達式的意思是“(3 * 4)+5”還是“3 *(4+5)”?

當 yacc.py中出現具有二義性的語法的時候,會出現“移入/規約”或”規約/規約“沖突,

當解析器生成器無法決定是減少規則還是更改解析堆棧上的符號時,將導致移入/規約沖突。例如,考慮字符串“3 * 4 + 5”和內部解析堆棧:

在本例中,當解析器達到步驟6時,它有兩個選項。一種是減少堆棧上的規則expr: expr * expr。另一個選項是在堆棧上移入”+“。根據上下文無關語法的規則,這兩個選項都是完全合法的。

默認情況下,所有的移入/規約沖突都是通過移入來解決的。因此,在上面的例子中,解析器總是將+移位而不是減少。雖然這種策略在很多情況下都有效(例如,“if-then”與“if-then-else”的情況),但是對于算術表達式來說還不夠。事實上,在上面的例子中,移位+的決定是完全錯誤的——我們應該減少expr * expr,因為乘法比加法具有更高的數學優先級。

為了解決歧義,特別是在表達式語法中,yacc.py允許為單個標記分配優先級和關聯性。這是通過向語法文件添加一個變量優先級來實現的,如下所示:

precedence = (('left', 'PLUS', 'MINUS'),('left', 'TIMES', 'DIVIDE'),)

這個聲明指定加減具有相同的優先級,并且是左關聯的,而乘以/除以具有相同的優先級,并且是左關聯的。在優先聲明中,token從最低優先級排序到最高優先級。因此,這個聲明指定TIMES/DIVIDE的優先級高于PLUS/MINUS(因為它們出現在優先級規范的后面)。

優先規范通過將數值優先級值和關聯方向關聯到列出的標記來工作。例如,在上面的例子中,你得到:

PLUS : level = 1, assoc = 'left'MINUS : level = 1, assoc = 'left'TIMES : level = 2, assoc = 'left'DIVIDE : level = 2, assoc = 'left'

然后,這些值用于為每個語法規則附加一個數值優先值和關聯方向。這總是通過查看最右端符號的優先級來確定的。例如:

expression : expression PLUS expression # level = 1, left| expression MINUS expression # level = 1, left| expression TIMES expression # level = 2, left| expression DIVIDE expression # level = 2, left| LPAREN expression RPAREN # level = None (not specified)| NUMBER # level = None (not specified)

當遇到移位/規約沖突時,解析器生成器通過查看優先規則和關聯說明符來解決沖突。

  • 如果當前令牌的優先級高于堆棧上的規則,則對其進行移位。
  • 如果堆棧上的語法規則具有更高的優先級,則該規則進行規約
  • 如果當前token和語法規則具有相同的優先級,則對左關聯規則規約,而對右關聯規則更改token
  • 如果對優先級一無所知,則使用移位(默認值)解決移位/減少沖突。

例如,當"expression PLUS expression" 遇到下一個"TIMES",則應該進行移入操作。相反,"expression TIMES expression"遇到““PLUS””則進行規約操作。

優先說明符技術的一個問題是,有時需要在某些上下文中更改操作符的優先級。例如,考慮“3 + 4 * -5”中的一元減運算符。

從數學上講,一元減號通常具有很高的優先級——在乘法之前求值。然而,在我們的優先說明符中,-的優先級比TIMES低。為了處理這個問題,可以為所謂的“虛擬令牌”提供優先規則,如下所示:

precedence = (('left', 'PLUS', 'MINUS'),('left', 'TIMES', 'DIVIDE'),('right', 'UMINUS'), # Unary minus operator)

現在,在語法文件中,我們可以這樣寫一元減號規則:

def p_expr_uminus(p):'expression : MINUS expression %prec UMINUS'p[0] = -p[2]

在這種情況下,%prec UMINUS覆蓋默認規則優先級——在優先說明符中將其設置為UMINUS。

當有多個語法規則可應用于給定的一組符號時,會導致Reduce/ Reduce沖突。這種沖突幾乎總是不好的,總是通過選擇語法文件中首先出現的規則來解決。當不同的語法規則以某種方式生成相同的符號集時,幾乎總是會引起Reduce/ Reduce沖突。例如:


在這種情況下,這兩條規則之間存在一個reduce/reduce沖突:

assignment : ID EQUALS NUMBERexpression : NUMBER

例如,如果你寫了“a=5”,解析的時候將不清楚到底是解析為assignment : ID EQUALS NUMBER 還是 assignment : ID EQUALS expression.

當出現規約/規約沖突的時候,yacc()將會打印下列警告信息:

WARNING: 1 reduce/reduce conflictWARNING: reduce/reduce conflict in state 15 resolved using rule (assignment -> ID EQUALS NUMBER)WARNING: rejected rule (expression -> NUMBER)

此消息標識沖突的兩條規則。但是,它可能不會告訴您解析器是如何達到這種狀態的。要嘗試解決這個問題,您可能需要查看語法和解析器 parser.out 的內容。

6.7 The parser.out file

跟蹤shift/reduce和reduce/reduce沖突是使用LR解析算法的一個更好的樂趣。為了幫助調試,yacc.py創建了一個名為“parser”的調試文件。當它生成解析表時。該文件的內容如下:

Unused terminals:GrammarRule 1 expression -> expression PLUS expressionRule 2 expression -> expression MINUS expressionRule 3 expression -> expression TIMES expressionRule 4 expression -> expression DIVIDE expressionRule 5 expression -> NUMBERRule 6 expression -> LPAREN expression RPARENTerminals, with rules where they appearTIMES : 3error : MINUS : 2RPAREN : 6LPAREN : 6DIVIDE : 4PLUS : 1NUMBER : 5Nonterminals, with rules where they appearexpression : 1 1 2 2 3 3 4 4 6 0Parsing method: LALRstate 0S' -> . expressionexpression -> . expression PLUS expressionexpression -> . expression MINUS expressionexpression -> . expression TIMES expressionexpression -> . expression DIVIDE expressionexpression -> . NUMBERexpression -> . LPAREN expression RPARENNUMBER shift and go to state 3LPAREN shift and go to state 2state 1S' -> expression .expression -> expression . PLUS expressionexpression -> expression . MINUS expressionexpression -> expression . TIMES expressionexpression -> expression . DIVIDE expressionPLUS shift and go to state 6MINUS shift and go to state 5TIMES shift and go to state 4DIVIDE shift and go to state 7state 2expression -> LPAREN . expression RPARENexpression -> . expression PLUS expressionexpression -> . expression MINUS expressionexpression -> . expression TIMES expressionexpression -> . expression DIVIDE expressionexpression -> . NUMBERexpression -> . LPAREN expression RPARENNUMBER shift and go to state 3LPAREN shift and go to state 2state 3expression -> NUMBER .$ reduce using rule 5PLUS reduce using rule 5MINUS reduce using rule 5TIMES reduce using rule 5DIVIDE reduce using rule 5RPAREN reduce using rule 5state 4expression -> expression TIMES . expressionexpression -> . expression PLUS expressionexpression -> . expression MINUS expressionexpression -> . expression TIMES expressionexpression -> . expression DIVIDE expressionexpression -> . NUMBERexpression -> . LPAREN expression RPARENNUMBER shift and go to state 3LPAREN shift and go to state 2state 5expression -> expression MINUS . expressionexpression -> . expression PLUS expressionexpression -> . expression MINUS expressionexpression -> . expression TIMES expressionexpression -> . expression DIVIDE expressionexpression -> . NUMBERexpression -> . LPAREN expression RPARENNUMBER shift and go to state 3LPAREN shift and go to state 2state 6expression -> expression PLUS . expressionexpression -> . expression PLUS expressionexpression -> . expression MINUS expressionexpression -> . expression TIMES expressionexpression -> . expression DIVIDE expressionexpression -> . NUMBERexpression -> . LPAREN expression RPARENNUMBER shift and go to state 3LPAREN shift and go to state 2state 7expression -> expression DIVIDE . expressionexpression -> . expression PLUS expressionexpression -> . expression MINUS expressionexpression -> . expression TIMES expressionexpression -> . expression DIVIDE expressionexpression -> . NUMBERexpression -> . LPAREN expression RPARENNUMBER shift and go to state 3LPAREN shift and go to state 2state 8expression -> LPAREN expression . RPARENexpression -> expression . PLUS expressionexpression -> expression . MINUS expressionexpression -> expression . TIMES expressionexpression -> expression . DIVIDE expressionRPAREN shift and go to state 13PLUS shift and go to state 6MINUS shift and go to state 5TIMES shift and go to state 4DIVIDE shift and go to state 7state 9expression -> expression TIMES expression .expression -> expression . PLUS expressionexpression -> expression . MINUS expressionexpression -> expression . TIMES expressionexpression -> expression . DIVIDE expression$ reduce using rule 3PLUS reduce using rule 3MINUS reduce using rule 3TIMES reduce using rule 3DIVIDE reduce using rule 3RPAREN reduce using rule 3! PLUS [ shift and go to state 6 ]! MINUS [ shift and go to state 5 ]! TIMES [ shift and go to state 4 ]! DIVIDE [ shift and go to state 7 ]state 10expression -> expression MINUS expression .expression -> expression . PLUS expressionexpression -> expression . MINUS expressionexpression -> expression . TIMES expressionexpression -> expression . DIVIDE expression$ reduce using rule 2PLUS reduce using rule 2MINUS reduce using rule 2RPAREN reduce using rule 2TIMES shift and go to state 4DIVIDE shift and go to state 7! TIMES [ reduce using rule 2 ]! DIVIDE [ reduce using rule 2 ]! PLUS [ shift and go to state 6 ]! MINUS [ shift and go to state 5 ]state 11expression -> expression PLUS expression .expression -> expression . PLUS expressionexpression -> expression . MINUS expressionexpression -> expression . TIMES expressionexpression -> expression . DIVIDE expression$ reduce using rule 1PLUS reduce using rule 1MINUS reduce using rule 1RPAREN reduce using rule 1TIMES shift and go to state 4DIVIDE shift and go to state 7! TIMES [ reduce using rule 1 ]! DIVIDE [ reduce using rule 1 ]! PLUS [ shift and go to state 6 ]! MINUS [ shift and go to state 5 ]state 12expression -> expression DIVIDE expression .expression -> expression . PLUS expressionexpression -> expression . MINUS expressionexpression -> expression . TIMES expressionexpression -> expression . DIVIDE expression$ reduce using rule 4PLUS reduce using rule 4MINUS reduce using rule 4TIMES reduce using rule 4DIVIDE reduce using rule 4RPAREN reduce using rule 4! PLUS [ shift and go to state 6 ]! MINUS [ shift and go to state 5 ]! TIMES [ shift and go to state 4 ]! DIVIDE [ shift and go to state 7 ]state 13expression -> LPAREN expression RPAREN .$ reduce using rule 6PLUS reduce using rule 6MINUS reduce using rule 6TIMES reduce using rule 6DIVIDE reduce using rule 6RPAREN reduce using rule 6

該文件中出現的不同狀態表示語法允許的每個可能的有效輸入標記序列。當接收輸入標記時,解析器將構建一個堆棧并尋找匹配的規則。每個狀態都跟蹤可能正在匹配的語法規則。在每個規則中,“.”字符表示該規則中解析的當前位置。此外,還列出了每個有效輸入token的操作。當發生移位/規約或規約/規約沖突時,未選擇的規則前面加上一個“!”。例如:

! TIMES [ reduce using rule 2 ]! DIVIDE [ reduce using rule 2 ]! PLUS [ shift and go to state 6 ]! MINUS [ shift and go to state 5 ]

通過查看這些規則(并進行一些實踐),您通常可以找到大多數解析沖突的根源。還應該強調的是,并不是所有的shift-reduce沖突都是不好的。但是,確保正確解析它們的唯一方法是查看parser.out。

6.8 Syntax Error Handling

如果您正在創建一個供生產使用的解析器,那么語法錯誤的處理是非常重要的。一般來說,您不希望解析器在出現問題的第一個跡象時就舉手投降。相反,您希望它報告錯誤,如果可能的話進行恢復,并繼續解析,以便立即將輸入中的所有錯誤報告給用戶。這是在C、c++和Java等語言的編譯器中發現的標準行為。

通常,當語法錯誤在解析過程中發生時,會立即檢測到該錯誤(即,解析器只讀取錯誤源之外的任何標記)。但是,此時,解析器進入了一個恢復模式,可以使用該模式嘗試并繼續進一步解析。一般來說,LR解析器中的錯誤恢復是一個古老話題。yacc.py提供的恢復機制可以與Unix yacc相媲美,因此您可能想要查閱O’Reilly的《Lex and yacc》之類的書以獲得更詳細的信息。

當出現語法錯誤時,yacc.py執行以下步驟:

  • 在第一次出現錯誤時,將調用用戶定義的p_error()函數,并將違規token作為參數。但是,如果語法錯誤是由于到達文件末尾,則調用p_error(),參數為None。然后,解析器進入“錯誤恢復”模式,在此模式中,在成功地將至少3個標記轉移到解析堆棧之前,它不會對p_error()進行后續調用
  • 如果p_error()中沒有執行恢復操作,則使用一個特殊的錯誤token替換違規的前向令牌
  • 如果錯誤的前向token已經設置為error,解析堆棧的頂部項將被刪除。
  • 如果整個解析堆棧被解除,解析器將進入重啟狀態,并嘗試從初始狀態開始解析。
  • 如果語法規則接受錯誤作為標記,它將被轉移到解析堆棧。
  • 如果解析堆棧的頂部項是error,則在解析器成功轉換新符號或減少包含錯誤的規則之前,將丟棄前向標記。

6.9 Line Number and Position Tracking

編寫編譯器時,位置跟蹤常常是一個棘手的問題。默認情況下,PLY跟蹤所有token的行號和位置。這些資料可用以下功能提供:

  • p.lineno(num). 返回行號
  • p.lexpos(num). 返回相對于文本的相對位置

例如:

def p_expression(p):'expression : expression PLUS expression'line = p.lineno(2) # line number of the PLUS tokenindex = p.lexpos(2) # Position of the PLUS token

作為一個可選特性,yacc.py還可以自動跟蹤所有語法符號的行號和位置。但是,這種額外的跟蹤需要額外的處理,并且會顯著降低解析速度。因此,必須通過將tracking=True選項傳遞給yacc.parse()來啟用它。例如:

yacc.parse(data,tracking=True)

一旦啟用,lineno()和lexpos()方法就可以用于所有語法符號。此外,還可以使用另外兩種方法:

  • p.linespan(num). 返回一個元組(起始行、結束行)
  • p.lexspan(num). 返回一個元組(start,end),表示起始結束位置。
def p_expression(p):'expression : expression PLUS expression'p.lineno(1) # Line number of the left expressionp.lineno(2) # line number of the PLUS operatorp.lineno(3) # line number of the right expression...start,end = p.linespan(3) # Start,end lines of the right expressionstarti,endi = p.lexspan(3) # Start,end positions of right expression

注意:lexspan()函數只返回到最后一個語法符號開始的值范圍

雖然PLY可以方便地跟蹤所有語法符號的位置信息,但這通常是不必要的。例如,如果您只是在錯誤消息中使用行號信息,那么您通常可以在語法規則中鍵入特定的token。例如:

def p_bad_func(p):'funccall : fname LPAREN error RPAREN'# Line number reported from LPAREN tokenprint("Bad function call at line", p.lineno(2))

類似地,如果使用p.set_lineno()方法只在需要的地方有選擇地傳播行號信息,那么解析性能可能會更好。例如:

def p_fname(p):'fname : ID'p[0] = p[1]p.set_lineno(0,p.lineno(1))

PLY不保留已解析規則中的行號信息。如果您正在構建一個抽象語法樹,并且需要行號,那么您應該確保行號出現在樹本身中。

6.10 AST Construction

yacc.py 并沒有提供特殊的方法來構造AST,然而這種構造可以自己來輕松實現。

構造樹的最簡單方法是在每個語法規則函數中創建和傳播一個元組或列表。有很多方法可以做到這一點,其中一個例子是這樣的:

def p_expression_binop(p):'''expression : expression PLUS expression| expression MINUS expression| expression TIMES expression| expression DIVIDE expression'''p[0] = ('binary-expression',p[2],p[1],p[3])def p_expression_group(p):'expression : LPAREN expression RPAREN'p[0] = ('group-expression',p[2])def p_expression_number(p):'expression : NUMBER'p[0] = ('number-expression',p[1])

另一種方法是為不同類型的抽象語法樹節點創建一組數據結構,并在每個規則中將節點分配給p[0]。例如:

class Expr: passclass BinOp(Expr):def __init__(self,left,op,right):self.type = "binop"self.left = leftself.right = rightself.op = opclass Number(Expr):def __init__(self,value):self.type = "number"self.value = valuedef p_expression_binop(p):'''expression : expression PLUS expression| expression MINUS expression| expression TIMES expression| expression DIVIDE expression'''p[0] = BinOp(p[1],p[2],p[3])def p_expression_group(p):'expression : LPAREN expression RPAREN'p[0] = p[2]def p_expression_number(p):'expression : NUMBER'p[0] = Number(p[1])

這種方法的優點是,它可以更容易地將更復雜的語義、類型檢查、代碼生成和其他特性附加到節點類。

為了簡化樹遍歷,可以為解析樹節點選擇一個非常通用的樹結構。例如:

class Node:def __init__(self,type,children=None,leaf=None):self.type = typeif children:self.children = childrenelse:self.children = [ ]self.leaf = leafdef p_expression_binop(p):'''expression : expression PLUS expression| expression MINUS expression| expression TIMES expression| expression DIVIDE expression'''p[0] = Node("binop", [p[1],p[3]], p[2])

6.11 Embedded Actions

yacc使用的解析技術只允許在規則末尾執行操作。例如,假設您有這樣一個規則:

def p_foo(p):"foo : A B C D"print("Parsed a foo", p[1],p[2],p[3],p[4])

在本例中,所提供的操作代碼僅在解析完所有符號A、B、C和D之后執行。然而,有時在解析的中間階段執行小的代碼片段是有用的。例如,假設您想在解析A之后立即執行某個操作。要做到這一點,可以這樣寫一個空規則:

def p_foo(p):"foo : A seen_A B C D"print("Parsed a foo", p[1],p[3],p[4],p[5])print("seen_A returned", p[2])def p_seen_A(p):"seen_A :"print("Saw an A = ", p[-1]) # Access grammar symbol to leftp[0] = some_value # Assign value to seen_A

在本例中,空seen_A規則在將A轉移到解析堆棧后立即執行。在這個規則中,p[-1]指堆棧上立即出現在seen_A符號左側的符號。在這種情況下,它將是上面foo規則中A的值。與其他規則一樣,可以通過簡單地將嵌入式操作分配給p[0]來返回值。

嵌入式操作的使用有時會引入額外的移位/規約沖突。例如,這個語法沒有沖突:

def p_foo(p):"""foo : abcd| abcx"""def p_abcd(p):"abcd : A B C D"def p_abcx(p):"abcx : A B C X"

然而,如果你像這樣在規則中插入一個嵌入的動作,

def p_foo(p):"""foo : abcd| abcx"""def p_abcd(p):"abcd : A B C D"def p_abcx(p):"abcx : A B seen_AB C X"def p_seen_AB(p):"seen_AB :"

將引入一個額外的shift-reduce沖突。這個沖突是由于相同的符號C出現在abcd和abcx規則中。解析器可以移動符號(abcd規則)或規約空規則seen_AB (abcx規則)。

嵌入式規則的一個常見用途是控制解析的其他方面,比如局部變量的范圍。例如,如果您正在解析C代碼,您可能會這樣編寫代碼:

def p_statements_block(p):"statements: LBRACE new_scope statements RBRACE"""# Action code...pop_scope() # Return to previous scopedef p_new_scope(p):"new_scope :"# Create a new scope for local variabless = new_scope()push_scope(s)...

在這種情況下,在解析LBRACE({)符號之后,嵌入的動作new_scope立即執行。這可能會調整內部符號表和解析器的其他方面。在規則statements_block完成后,代碼可以撤消在嵌入式操作(例如,pop_scope())中執行的操作。

6.12 Miscellaneous Yacc Notes

  • 默認情況下,yacc.py依賴于lex.py進行標記。但是,可以提供另一種token,如下:

    parser = yacc.parse(lexer=x)

    在本例中,x必須是Lexer對象,該對象至少具有用于檢索下一個token的x.token()方法。如果向yacc.parse()提供輸入字符串,lexer還必須有一個x.input()方法。

  • 默認情況下,yacc以調試模式生成表(調試模式生成解析器)。輸出文件和其他輸出)。若要禁用此功能,請使用

    parser = yacc.yacc(debug=False)
  • 要更改parsetab.py文件的名稱,請使用:

    parser = yacc.yacc(tabmodule="foo")

    通常,parsetab.py文件與定義解析器的模塊放在同一個目錄中。如果您想將它放到其他地方,您可以為tabmodule提供一個絕對的包名。在這種情況下,表將寫在那里。

  • 要更改寫入parsetab.py文件(和其他輸出文件)的目錄,請使用:

    parser = yacc.yacc(tabmodule="foo",outputdir="somedirectory")

    注意:除非指定的目錄也位于Python的路徑上(sys.path),否則后續的表文件導入將失敗。一般來說,最好使用tabmodule參數指定目標,而不是直接使用outputdir參數指定目錄。

  • 要防止yacc生成任何類型的解析器表文件,請使用:

    parser = yacc.yacc(write_tables=False)

    注意:如果禁用表生成,yacc()將在每次運行時重新生成解析表(這可能需要一段時間,這取決于語法的大小)。

  • 若要在解析期間打印大量調試,請使用:

    parser.parse(input_text, debug=True)
  • 由于生成LALR表的成本相對較高,因此以前生成的表將被緩存并盡可能重用。重新生成表的決定是通過對所有語法規則和優先規則進行MD5校驗和來確定的。只有在不匹配的情況下才會重新生成表。

    應該注意的是,表生成相當高效,即使對于涉及大約100條規則和幾百種狀態的語法也是如此。

  • 由于LR解析是由表驅動的,所以解析器的性能在很大程度上獨立于語法的大小。最大的瓶頸將是lexer和語法規則中代碼的復雜性。

  • yacc()還允許將解析器定義為類和閉包(請參閱關于lexer的替代規范的部分)。但是,請注意在單個模塊(源文件)中只能定義一個解析器。如果您試圖在同一個源文件中定義多個解析器,可能會出現各種錯誤檢查和驗證步驟,從而產生混淆的錯誤消息。

  • 生產規則的裝飾器必須更新包裝函數的行號。wrapper.co_firstlineno = func.__code__.co_firstlineno:

    from functools import wrapsfrom nodes import Collectiondef strict(*types):def decorate(func):@wraps(func)def wrapper(p):func(p)if not isinstance(p[0], types):raise TypeErrorwrapper.co_firstlineno = func.__code__.co_firstlinenoreturn wrapperreturn decorate@strict(Collection)def p_collection(p):"""collection : sequence| map"""p[0] = p[1]

7. Multiple Parsers and Lexers

在高級解析應用程序中,您可能希望擁有多個解析器和lexer。

一般來說,這不是問題。然而,要使它工作,您需要仔細確保所有內容都正確地連接起來。首先,確保保存lex()和yacc()返回的對象。例如:

lexer = lex.lex() # Return lexer objectparser = yacc.yacc() # Return parser object

接下來,在解析時,確保將parse()函數引用到它應該使用的lexer。例如:

parser.parse(text,lexer=lexer)

如果忘記這樣做,解析器將使用最后創建的lexer——這并不總是您想要的。

在lexer和parser規則函數中,這些對象也是可用的。在lexer中,令牌的“lexer”屬性引用觸發規則的lexer對象。例如:

def t_NUMBER(t):r'\d+'...print(t.lexer) # Show lexer object

在解析器中,“lexer”和“parser”屬性分別引用lexer和parser對象。

def p_expr_plus(p):'expr : expr PLUS expr'...print(p.parser) # Show parser objectprint(p.lexer) # Show lexer object

如果需要,可以將任意屬性附加到lexer或解析器對象。例如,如果希望有不同的解析模式,可以將模式屬性附加到解析器對象上,稍后再進行研究。

8. Using Python’s Optimized Mode

因為PLY使用來自doc-string的信息,所以在正常模式下運行Python解釋器(即,而不是-O或-OO選項)。但是,如果您像這樣指定優化模式:

lex.lex(optimize=1)yacc.yacc(optimize=1)

然后,當Python以優化模式運行時,可以使用PLY。要使此工作正常,請確保首先在正常模式下運行Python。第一次生成詞法分析和解析表之后,以優化模式運行Python。PLY將使用不需要doc字符串的表。

注意:在優化模式下運行PLY會禁用大量錯誤檢查。您應該只在項目已穩定且不需要進行任何調試時才這樣做。優化模式的目的之一是顯著減少編譯器的啟動時間(假設所有內容都已正確指定并正常工作)。

9. Advanced Debugging

調試編譯器通常不是一項容易的任務。PLY通過使用Python的日志模塊提供了一些高級的對角線功能。下面兩部分將對此進行描述:

9.1 Debugging the lex() and yacc() commands

lex()和yacc()命令都具有可以使用debug標志啟用的調試模式。例如:

lex.lex(debug=True)yacc.yacc(debug=True)

通常,調試生成的輸出要么路由到標準錯誤,要么(在yacc()的情況下)路由到文件parser.out。通過提供一個日志對象,可以更仔細地控制這個輸出。下面是一個例子,它添加了關于不同調試消息來自何處的信息:

# Set up a logging objectimport logginglogging.basicConfig(level = logging.DEBUG,filename = "parselog.txt",filemode = "w",format = "%(filename)10s:%(lineno)4d:%(message)s")log = logging.getLogger()lex.lex(debug=True,debuglog=log)yacc.yacc(debug=True,debuglog=log)

如果提供自定義日志記錄器,則可以通過設置日志記錄級別來控制生成的調試信息的數量。通常,調試消息在調試、信息或警告級別發出。

PLY的錯誤消息和警告也使用日志記錄接口生成。這可以通過使用errorlog參數傳遞日志對象來控制。

lex.lex(errorlog=log)yacc.yacc(errorlog=log)

如果希望完全消除警告,可以傳入具有適當過濾器級別的日志對象,或者使用lex或yacc中定義的NullLogger對象。例如:

yacc.yacc(errorlog=yacc.NullLogger())

9.2 Run-time Debugging

若要啟用解析器的運行時調試,請使用debug選項進行解析。這個選項可以是整數(它只是打開或關閉調試),也可以是logger對象的實例。例如:

log = logging.getLogger()parser.parse(input,debug=log)

如果傳遞了日志對象,則可以使用其篩選級別來控制生成了多少輸出。INFO級別用于生成關于規則縮減的信息。調試級別將顯示有關解析堆棧、令牌轉換和其他細節的信息。錯誤級別顯示與解析錯誤相關的信息。

對于非常復雜的問題,您應該傳遞一個日志對象,該對象將重定向到一個文件,在執行后,您可以更容易地檢查輸出。

10. Packaging Advice

如果您正在分發一個使用PLY的包,您應該花一些時間考慮如何處理自動生成的文件。例如,yacc()函數生成的parsetab.py文件。

在PLY-3.6中,表文件創建在與定義解析器的文件相同的目錄中。這意味著parsetab.py文件將與解析器規范共存。就打包而言,這可能是最簡單、最理智的管理方法。您不需要給yacc()任何額外的參數,它應該只是“工作”。

一個關注點是parsetab.py文件本身的管理。例如,您應該將該文件簽入版本控制(例如GitHub),它應該作為普通文件包含在包分發版中,還是應該讓PLY在用戶安裝您的包時自動生成它?

從PLY -3.6開始,parsetab.py文件應該兼容所有Python版本,包括Python 2和Python 3。因此,如果在python3上使用,用python2生成的表文件應該可以正常工作。因此,如果需要的話,自己分發parsetab.py文件應該是相對無害的。但是,請注意,如果將來對文件的格式進行了增強或更改,那么PLY的舊/新版本可能會嘗試重新生成文件。

為了使表文件的生成更易于安裝,您可以使用-m選項或類似的方法使解析器文件可執行。例如:

# calc.py......def make_parser():parser = yacc.yacc()return parserif __name__ == '__main__':make_parser()

然后可以使用python -m calc .py之類的命令生成表。另外,setup.py腳本可以導入模塊并使用make_parser()創建解析表。

如果愿意犧牲一點啟動時間,還可以指示PLY不要使用yacc編寫表。yacc.yacc(write_tables=False, debug=False)。在此模式下,PLY將每次重新生成解析表。對于一個小語法,您可能不會注意到。對于大型語法,您可能應該重新考慮—解析表的目的是顯著加快這個過程。

在操作過程中,正常情況是PLY生成診斷錯誤消息(通常打印為標準錯誤)。這些都是完全使用日志模塊生成的。如果希望重定向這些消息或使其保持靜默,可以將自己的日志對象提供給yacc()。例如:

import logginglog = logging.getLogger('ply')...parser = yacc.yacc(errorlog=log)

11. Where to go from here?

PLY分布的examples目錄包含幾個簡單的示例。有關理論和底層實現細節或LR解析,請參閱編譯器教科書。

總結

以上是生活随笔為你收集整理的PLY文档翻译——利用Python进行词法和语法分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

真人与拘做受免费视频 | 乱人伦中文视频在线观看 | 东京无码熟妇人妻av在线网址 | 日韩无码专区 | 性史性农村dvd毛片 | 成人欧美一区二区三区 | 成人欧美一区二区三区黑人 | 欧美成人免费全部网站 | 四虎国产精品一区二区 | 中文无码成人免费视频在线观看 | 亚洲爆乳大丰满无码专区 | 伊人久久婷婷五月综合97色 | 亚洲伊人久久精品影院 | 亚洲人成网站色7799 | 大色综合色综合网站 | 日韩成人一区二区三区在线观看 | 亚洲人成影院在线无码按摩店 | 无码人妻少妇伦在线电影 | 国产精品18久久久久久麻辣 | 久久久成人毛片无码 | 国产人妻人伦精品1国产丝袜 | 精品国偷自产在线视频 | 无码精品国产va在线观看dvd | 国产精品久久久一区二区三区 | 国产超级va在线观看视频 | 国产av一区二区精品久久凹凸 | 国产精品无码一区二区三区不卡 | 精品欧美一区二区三区久久久 | 九九热爱视频精品 | 人妻aⅴ无码一区二区三区 | 婷婷丁香六月激情综合啪 | 亚洲国产精品一区二区第一页 | 人人妻在人人 | 免费播放一区二区三区 | 亚洲第一无码av无码专区 | 日日碰狠狠躁久久躁蜜桃 | 国产真人无遮挡作爱免费视频 | 久久视频在线观看精品 | 国产精品亚洲专区无码不卡 | 国产激情艳情在线看视频 | 中文字幕无码免费久久99 | 小泽玛莉亚一区二区视频在线 | 国产av久久久久精东av | 一本久道久久综合婷婷五月 | 中文字幕日韩精品一区二区三区 | 精品久久综合1区2区3区激情 | 在线视频网站www色 | 国产精品亚洲lv粉色 | 疯狂三人交性欧美 | 丰满护士巨好爽好大乳 | 国产精品免费大片 | 99视频精品全部免费免费观看 | 学生妹亚洲一区二区 | 国产精品无码永久免费888 | 亚洲啪av永久无码精品放毛片 | 任你躁在线精品免费 | 中文字幕人妻丝袜二区 | 国产成人无码av一区二区 | 国产成人久久精品流白浆 | 日韩欧美中文字幕公布 | 国产av无码专区亚洲awww | 久久精品女人天堂av免费观看 | 亚洲国产成人a精品不卡在线 | 国产亚洲精品久久久闺蜜 | 久久无码专区国产精品s | 一个人看的www免费视频在线观看 | 中文久久乱码一区二区 | 老司机亚洲精品影院无码 | 中文字幕无码人妻少妇免费 | 午夜福利一区二区三区在线观看 | 国产成人无码一二三区视频 | 日产国产精品亚洲系列 | 内射老妇bbwx0c0ck | 日日碰狠狠躁久久躁蜜桃 | 欧美黑人乱大交 | 精品乱子伦一区二区三区 | 色婷婷av一区二区三区之红樱桃 | 少妇太爽了在线观看 | 精品乱码久久久久久久 | 中文字幕乱码亚洲无线三区 | 国产精品无码成人午夜电影 | 中文无码伦av中文字幕 | 天天av天天av天天透 | 国产情侣作爱视频免费观看 | 熟女少妇人妻中文字幕 | 国产精品高潮呻吟av久久4虎 | 男女爱爱好爽视频免费看 | 丝袜人妻一区二区三区 | 娇妻被黑人粗大高潮白浆 | 东京热无码av男人的天堂 | 国产人妻大战黑人第1集 | 98国产精品综合一区二区三区 | 久久综合狠狠综合久久综合88 | 久青草影院在线观看国产 | 国产人妻人伦精品 | 激情五月综合色婷婷一区二区 | 亚洲综合无码一区二区三区 | 成人试看120秒体验区 | 亚洲阿v天堂在线 | 国产成人无码午夜视频在线观看 | 波多野42部无码喷潮在线 | 亚洲国产欧美日韩精品一区二区三区 | 激情内射日本一区二区三区 | 国产亚洲美女精品久久久2020 | 亚洲小说图区综合在线 | 日本一区二区更新不卡 | 婷婷丁香六月激情综合啪 | 人人爽人人澡人人人妻 | 亚洲理论电影在线观看 | 亚洲男女内射在线播放 | 人妻aⅴ无码一区二区三区 | 99久久无码一区人妻 | 国产一区二区三区四区五区加勒比 | 亚洲精品无码国产 | 少妇性俱乐部纵欲狂欢电影 | 熟妇女人妻丰满少妇中文字幕 | 熟妇激情内射com | 亚洲综合在线一区二区三区 | 国产免费观看黄av片 | 亚洲精品国产精品乱码视色 | 最近中文2019字幕第二页 | 丰腴饱满的极品熟妇 | 十八禁视频网站在线观看 | 无码av最新清无码专区吞精 | 中文字幕无码乱人伦 | 久久精品国产亚洲精品 | 亚洲国产精华液网站w | 丰满少妇人妻久久久久久 | 日本一本二本三区免费 | 亚洲欧美日韩国产精品一区二区 | 日产精品99久久久久久 | 欧美三级a做爰在线观看 | 精品一区二区不卡无码av | 特黄特色大片免费播放器图片 | 日本丰满熟妇videos | 久久精品视频在线看15 | 亚洲国产精品无码一区二区三区 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产激情无码一区二区 | 草草网站影院白丝内射 | 国产精品香蕉在线观看 | aⅴ亚洲 日韩 色 图网站 播放 | 成人免费无码大片a毛片 | 荫蒂被男人添的好舒服爽免费视频 | 丰满少妇女裸体bbw | 丰满少妇熟乱xxxxx视频 | 国产午夜亚洲精品不卡下载 | 国产网红无码精品视频 | 免费看男女做好爽好硬视频 | 免费国产成人高清在线观看网站 | 午夜精品久久久久久久 | 亚洲日韩乱码中文无码蜜桃臀网站 | 欧美大屁股xxxxhd黑色 | 人妻无码久久精品人妻 | 久久午夜夜伦鲁鲁片无码免费 | 午夜熟女插插xx免费视频 | 亚洲精品久久久久avwww潮水 | 亚洲自偷自拍另类第1页 | 国产一区二区三区四区五区加勒比 | 日本高清一区免费中文视频 | 一个人看的视频www在线 | 玩弄少妇高潮ⅹxxxyw | 牲欲强的熟妇农村老妇女 | 亚洲精品成a人在线观看 | 无码精品人妻一区二区三区av | 精品久久综合1区2区3区激情 | 国产精品无码永久免费888 | 十八禁视频网站在线观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 欧美丰满熟妇xxxx性ppx人交 | 无码av免费一区二区三区试看 | 377p欧洲日本亚洲大胆 | 久久午夜无码鲁丝片 | 久久精品丝袜高跟鞋 | 无套内谢老熟女 | 国产精品对白交换视频 | 97久久精品无码一区二区 | 久久精品视频在线看15 | 中文字幕乱妇无码av在线 | 亚洲自偷自拍另类第1页 | 中文字幕+乱码+中文字幕一区 | 99久久亚洲精品无码毛片 | 午夜嘿嘿嘿影院 | 亚洲人成网站在线播放942 | 少妇高潮一区二区三区99 | 亚洲综合无码久久精品综合 | 欧美xxxx黑人又粗又长 | 麻豆成人精品国产免费 | 亚洲成av人片在线观看无码不卡 | 国产国产精品人在线视 | 日韩人妻少妇一区二区三区 | 国产成人无码a区在线观看视频app | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲国产高清在线观看视频 | 人妻体内射精一区二区三四 | 中文字幕无码视频专区 | 2020久久超碰国产精品最新 | 色妞www精品免费视频 | 九九久久精品国产免费看小说 | a在线亚洲男人的天堂 | 伊人色综合久久天天小片 | 呦交小u女精品视频 | 97人妻精品一区二区三区 | 国产亚洲精品久久久久久久久动漫 | 人妻少妇精品无码专区二区 | 无码免费一区二区三区 | 欧美成人高清在线播放 | 99久久精品无码一区二区毛片 | 色综合久久88色综合天天 | 特黄特色大片免费播放器图片 | 亚洲国产精品久久人人爱 | 大肉大捧一进一出好爽视频 | 国产区女主播在线观看 | 成 人影片 免费观看 | 色综合久久久久综合一本到桃花网 | 伊人久久大香线蕉午夜 | 精品aⅴ一区二区三区 | 久久久精品人妻久久影视 | 天天爽夜夜爽夜夜爽 | 无套内谢的新婚少妇国语播放 | 欧美性生交xxxxx久久久 | 国产女主播喷水视频在线观看 | 丁香啪啪综合成人亚洲 | 欧洲精品码一区二区三区免费看 | 亚洲精品一区三区三区在线观看 | 无码人妻出轨黑人中文字幕 | 天堂亚洲2017在线观看 | 日日摸日日碰夜夜爽av | 桃花色综合影院 | 最新国产麻豆aⅴ精品无码 | 中文无码成人免费视频在线观看 | 人妻夜夜爽天天爽三区 | 乱人伦人妻中文字幕无码 | 草草网站影院白丝内射 | 国产超级va在线观看视频 | 成人无码视频在线观看网站 | 亚洲国产欧美日韩精品一区二区三区 | 国产真人无遮挡作爱免费视频 | 免费人成网站视频在线观看 | 国产乱人无码伦av在线a | 亚洲色欲色欲天天天www | 久久综合色之久久综合 | 人人澡人人妻人人爽人人蜜桃 | 久久99精品国产.久久久久 | 在线精品国产一区二区三区 | 狠狠cao日日穞夜夜穞av | 国产xxx69麻豆国语对白 | 精品日本一区二区三区在线观看 | 无套内射视频囯产 | 亚洲成熟女人毛毛耸耸多 | 亚洲精品综合五月久久小说 | 中文字幕无码乱人伦 | 欧美阿v高清资源不卡在线播放 | 亚洲综合色区中文字幕 | 国产一区二区三区精品视频 | 亚洲成av人综合在线观看 | 国产精品美女久久久网av | 亚洲日韩av一区二区三区四区 | 国产精品久久福利网站 | 99久久久国产精品无码免费 | 国产成人午夜福利在线播放 | 国产电影无码午夜在线播放 | 中文精品无码中文字幕无码专区 | 麻豆精产国品 | 亚洲自偷自拍另类第1页 | 黑人玩弄人妻中文在线 | а√天堂www在线天堂小说 | 无遮挡国产高潮视频免费观看 | 中文字幕无码日韩专区 | 99精品国产综合久久久久五月天 | 无码一区二区三区在线观看 | 伦伦影院午夜理论片 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产精品亚洲а∨无码播放麻豆 | 狠狠色噜噜狠狠狠7777奇米 | 人妻尝试又大又粗久久 | 强辱丰满人妻hd中文字幕 | 国产精品毛多多水多 | 动漫av一区二区在线观看 | 成人精品一区二区三区中文字幕 | 免费人成网站视频在线观看 | 无套内谢的新婚少妇国语播放 | 久热国产vs视频在线观看 | 精品久久久久久人妻无码中文字幕 | 亚洲国产精品美女久久久久 | 精品久久综合1区2区3区激情 | 日本爽爽爽爽爽爽在线观看免 | 一本久久伊人热热精品中文字幕 | 人人妻人人藻人人爽欧美一区 | 综合人妻久久一区二区精品 | 久久伊人色av天堂九九小黄鸭 | 性做久久久久久久免费看 | 中文字幕av日韩精品一区二区 | 粗大的内捧猛烈进出视频 | 国产人妻大战黑人第1集 | 精品国产av色一区二区深夜久久 | 波多野结衣av在线观看 | 无套内射视频囯产 | 欧美丰满少妇xxxx性 | 成人三级无码视频在线观看 | 亚洲人成网站免费播放 | 好屌草这里只有精品 | 免费无码肉片在线观看 | 99精品视频在线观看免费 | 少妇被粗大的猛进出69影院 | 亚洲a无码综合a国产av中文 | 国产精品国产自线拍免费软件 | 欧美野外疯狂做受xxxx高潮 | 中文字幕中文有码在线 | 丝袜 中出 制服 人妻 美腿 | 一本久道久久综合婷婷五月 | 97se亚洲精品一区 | 欧美性色19p | 成人三级无码视频在线观看 | 野外少妇愉情中文字幕 | 国产乱人偷精品人妻a片 | 欧美丰满熟妇xxxx性ppx人交 | 国产精品久久久久7777 | 中文字幕人妻无码一区二区三区 | 亚洲人成影院在线观看 | 亚洲精品欧美二区三区中文字幕 | 国产莉萝无码av在线播放 | 青青草原综合久久大伊人精品 | a在线亚洲男人的天堂 | 欧美xxxx黑人又粗又长 | 图片小说视频一区二区 | 国产suv精品一区二区五 | 久久国内精品自在自线 | 俺去俺来也在线www色官网 | 国产精品亚洲一区二区三区喷水 | 天天躁日日躁狠狠躁免费麻豆 | 国产免费久久精品国产传媒 | 久久久亚洲欧洲日产国码αv | 少妇性荡欲午夜性开放视频剧场 | 少妇性俱乐部纵欲狂欢电影 | 亚洲成在人网站无码天堂 | 极品嫩模高潮叫床 | a片在线免费观看 | 日韩精品久久久肉伦网站 | 中国女人内谢69xxxxxa片 | 国产情侣作爱视频免费观看 | 中文字幕人妻无码一夲道 | 国产精品久久久久9999小说 | 最新国产乱人伦偷精品免费网站 | 欧美激情综合亚洲一二区 | 久久亚洲国产成人精品性色 | 人妻天天爽夜夜爽一区二区 | 无码av免费一区二区三区试看 | 亚洲国产成人a精品不卡在线 | 狠狠cao日日穞夜夜穞av | 亚欧洲精品在线视频免费观看 | 水蜜桃色314在线观看 | 国产精品成人av在线观看 | 国产精品高潮呻吟av久久4虎 | 未满成年国产在线观看 | 理论片87福利理论电影 | 国产av一区二区精品久久凹凸 | 男女超爽视频免费播放 | 黑人巨大精品欧美黑寡妇 | 青青草原综合久久大伊人精品 | 日韩视频 中文字幕 视频一区 | 色综合久久中文娱乐网 | 亚洲人成网站色7799 | 国产午夜福利亚洲第一 | 宝宝好涨水快流出来免费视频 | 亚洲综合无码久久精品综合 | 大胆欧美熟妇xx | 蜜桃视频韩日免费播放 | 又大又紧又粉嫩18p少妇 | 精品无码国产自产拍在线观看蜜 | 国产成人无码av一区二区 | 97精品人妻一区二区三区香蕉 | 欧美三级a做爰在线观看 | 国产成人一区二区三区别 | 麻豆蜜桃av蜜臀av色欲av | 思思久久99热只有频精品66 | 内射白嫩少妇超碰 | 国产综合在线观看 | 狠狠亚洲超碰狼人久久 | 国产精品久久久久久久9999 | 亚洲精品久久久久久一区二区 | 夜夜高潮次次欢爽av女 | 色欲久久久天天天综合网精品 | 国产sm调教视频在线观看 | 亚欧洲精品在线视频免费观看 | 少妇久久久久久人妻无码 | 国产内射老熟女aaaa | 六十路熟妇乱子伦 | 无人区乱码一区二区三区 | 欧美日本免费一区二区三区 | 亚洲日本在线电影 | 无码av中文字幕免费放 | 久久99久久99精品中文字幕 | 在线 国产 欧美 亚洲 天堂 | a国产一区二区免费入口 | 国产成人综合色在线观看网站 | 成人免费无码大片a毛片 | 永久免费精品精品永久-夜色 | 爆乳一区二区三区无码 | 亚洲色偷偷男人的天堂 | 亚洲熟悉妇女xxx妇女av | 丰满肥臀大屁股熟妇激情视频 | 久久精品女人的天堂av | 免费人成在线视频无码 | 国产激情艳情在线看视频 | 午夜精品久久久久久久久 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产精品久久久久9999小说 | 色综合久久久无码网中文 | 亚洲国产精品美女久久久久 | 国产又粗又硬又大爽黄老大爷视 | 欧美性色19p | 东北女人啪啪对白 | 精品无码国产自产拍在线观看蜜 | 牛和人交xxxx欧美 | 初尝人妻少妇中文字幕 | 亚洲国产精品成人久久蜜臀 | 麻豆md0077饥渴少妇 | 成年女人永久免费看片 | аⅴ资源天堂资源库在线 | av小次郎收藏 | 日本熟妇大屁股人妻 | 久久久国产精品无码免费专区 | 97无码免费人妻超级碰碰夜夜 | 国产熟妇另类久久久久 | 乌克兰少妇性做爰 | 国产成人综合色在线观看网站 | 少妇人妻大乳在线视频 | 久久精品国产亚洲精品 | 国产精品久久久一区二区三区 | 一本加勒比波多野结衣 | 久久精品一区二区三区四区 | 99久久久国产精品无码免费 | 久久久久久av无码免费看大片 | 国产欧美精品一区二区三区 | 无人区乱码一区二区三区 | 亚洲国产精品成人久久蜜臀 | 性欧美videos高清精品 | 亚洲国产精品久久人人爱 | 久久久久人妻一区精品色欧美 | 装睡被陌生人摸出水好爽 | 暴力强奷在线播放无码 | 人妻插b视频一区二区三区 | 99久久精品国产一区二区蜜芽 | 少妇愉情理伦片bd | 国产午夜无码精品免费看 | 白嫩日本少妇做爰 | 小sao货水好多真紧h无码视频 | 7777奇米四色成人眼影 | 欧美色就是色 | 少妇高潮喷潮久久久影院 | 无码精品人妻一区二区三区av | 丰满人妻一区二区三区免费视频 | 国产精品久久久久久亚洲毛片 | 日本精品久久久久中文字幕 | 久久综合给合久久狠狠狠97色 | 欧美刺激性大交 | 牲欲强的熟妇农村老妇女视频 | 国产成人综合在线女婷五月99播放 | 精品无码国产一区二区三区av | 午夜理论片yy44880影院 | 欧美 丝袜 自拍 制服 另类 | 亚洲熟妇色xxxxx欧美老妇y | 国产精品久久国产精品99 | 日韩少妇白浆无码系列 | 中文字幕无码av波多野吉衣 | 亚拍精品一区二区三区探花 | 亚洲色在线无码国产精品不卡 | 动漫av网站免费观看 | 日韩av无码一区二区三区不卡 | 成人试看120秒体验区 | 青草视频在线播放 | 国产精品久免费的黄网站 | 伊人久久大香线蕉亚洲 | 亚洲 a v无 码免 费 成 人 a v | 国产精品美女久久久久av爽李琼 | 中文无码精品a∨在线观看不卡 | 色老头在线一区二区三区 | 人人妻人人澡人人爽人人精品 | 无码人妻出轨黑人中文字幕 | 激情亚洲一区国产精品 | 荫蒂被男人添的好舒服爽免费视频 | 国产亚洲精品久久久久久国模美 | 久久综合狠狠综合久久综合88 | 日韩视频 中文字幕 视频一区 | 亚洲精品国偷拍自产在线观看蜜桃 | 国语自产偷拍精品视频偷 | 精品国产一区二区三区四区在线看 | 精品成在人线av无码免费看 | 国产精品成人av在线观看 | 日日躁夜夜躁狠狠躁 | 日日噜噜噜噜夜夜爽亚洲精品 | 久久国产精品_国产精品 | 亚洲中文字幕无码中文字在线 | 国产黑色丝袜在线播放 | 小泽玛莉亚一区二区视频在线 | 国产亚洲日韩欧美另类第八页 | 欧洲熟妇精品视频 | 久久午夜无码鲁丝片秋霞 | 精品国产麻豆免费人成网站 | 日本一区二区更新不卡 | 日本精品久久久久中文字幕 | 亚洲 欧美 激情 小说 另类 | 亚洲熟女一区二区三区 | 中文精品久久久久人妻不卡 | 无码av中文字幕免费放 | 美女黄网站人色视频免费国产 | 成人一区二区免费视频 | 国产莉萝无码av在线播放 | 日本熟妇人妻xxxxx人hd | 中文字幕日韩精品一区二区三区 | 永久免费观看美女裸体的网站 | 国产综合久久久久鬼色 | 狠狠亚洲超碰狼人久久 | 久久亚洲精品成人无码 | 国产亚洲精品久久久久久久久动漫 | 久久综合给合久久狠狠狠97色 | 国产高潮视频在线观看 | 动漫av一区二区在线观看 | 国产无av码在线观看 | 欧美日韩一区二区免费视频 | 亚洲一区二区三区无码久久 | 骚片av蜜桃精品一区 | 国产精品无码永久免费888 | 伊人久久大香线蕉av一区二区 | 国产在线一区二区三区四区五区 | 午夜理论片yy44880影院 | 97久久超碰中文字幕 | 久久久久国色av免费观看性色 | 日本熟妇人妻xxxxx人hd | 狠狠亚洲超碰狼人久久 | 玩弄少妇高潮ⅹxxxyw | 亚洲啪av永久无码精品放毛片 | 国产真实乱对白精彩久久 | 国产在线精品一区二区高清不卡 | 国产特级毛片aaaaaa高潮流水 | 色婷婷综合中文久久一本 | 丰满岳乱妇在线观看中字无码 | 丁香花在线影院观看在线播放 | 澳门永久av免费网站 | 国内揄拍国内精品少妇国语 | 久久99国产综合精品 | 国产乱人伦av在线无码 | 免费观看又污又黄的网站 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | √天堂中文官网8在线 | 亚洲性无码av中文字幕 | 国产亚洲欧美日韩亚洲中文色 | 麻豆md0077饥渴少妇 | 国产精品手机免费 | 欧美一区二区三区视频在线观看 | 日日碰狠狠躁久久躁蜜桃 | 欧美阿v高清资源不卡在线播放 | а天堂中文在线官网 | 午夜肉伦伦影院 | 国产乱人偷精品人妻a片 | 国产一区二区三区精品视频 | 国产另类ts人妖一区二区 | 欧美兽交xxxx×视频 | 精品少妇爆乳无码av无码专区 | 荫蒂添的好舒服视频囗交 | 日本又色又爽又黄的a片18禁 | 亚洲国产精品成人久久蜜臀 | 1000部夫妻午夜免费 | 好爽又高潮了毛片免费下载 | 国产偷国产偷精品高清尤物 | 性做久久久久久久免费看 | 黑人粗大猛烈进出高潮视频 | 宝宝好涨水快流出来免费视频 | 欧美丰满老熟妇xxxxx性 | 国产精品沙发午睡系列 | 日本一本二本三区免费 | 亚洲精品久久久久久久久久久 | 最近中文2019字幕第二页 | 久久伊人色av天堂九九小黄鸭 | 99久久久无码国产精品免费 | 丝袜人妻一区二区三区 | 在线a亚洲视频播放在线观看 | 国产精品欧美成人 | 日本丰满护士爆乳xxxx | 国产精品毛多多水多 | 国产亲子乱弄免费视频 | 国产人妻人伦精品 | 欧美一区二区三区视频在线观看 | 丰满妇女强制高潮18xxxx | 六十路熟妇乱子伦 | 无码精品国产va在线观看dvd | 免费无码av一区二区 | 久久精品人人做人人综合试看 | 亚洲一区二区三区四区 | 老太婆性杂交欧美肥老太 | 亚洲高清偷拍一区二区三区 | 牲交欧美兽交欧美 | 99在线 | 亚洲 | 久久精品人人做人人综合试看 | 亚洲天堂2017无码中文 | 精品乱码久久久久久久 | 一本一道久久综合久久 | 中国女人内谢69xxxxxa片 | 亚洲 a v无 码免 费 成 人 a v | 国产精品亚洲а∨无码播放麻豆 | 亚洲日本va中文字幕 | 成人无码精品1区2区3区免费看 | 日日噜噜噜噜夜夜爽亚洲精品 | 久久国产精品二国产精品 | 国产乱人无码伦av在线a | 免费无码一区二区三区蜜桃大 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 中文字幕中文有码在线 | 曰韩少妇内射免费播放 | 99久久精品午夜一区二区 | 国产激情精品一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 国产午夜福利亚洲第一 | 无码毛片视频一区二区本码 | 76少妇精品导航 | 水蜜桃色314在线观看 | 蜜臀aⅴ国产精品久久久国产老师 | 麻花豆传媒剧国产免费mv在线 | 亚洲成av人在线观看网址 | 99re在线播放 | 久久久精品成人免费观看 | aⅴ亚洲 日韩 色 图网站 播放 | 极品尤物被啪到呻吟喷水 | aa片在线观看视频在线播放 | 精品国产一区av天美传媒 | 亚洲一区二区三区 | 午夜肉伦伦影院 | 国产无套粉嫩白浆在线 | 国产欧美熟妇另类久久久 | 久久精品无码一区二区三区 | 国产精品无套呻吟在线 | 亚洲自偷精品视频自拍 | 狠狠色噜噜狠狠狠狠7777米奇 | 色欲综合久久中文字幕网 | 九九久久精品国产免费看小说 | 精品成在人线av无码免费看 | 成人免费视频视频在线观看 免费 | 小sao货水好多真紧h无码视频 | 日本www一道久久久免费榴莲 | 在教室伦流澡到高潮hnp视频 | 国产精品.xx视频.xxtv | 天干天干啦夜天干天2017 | 久久久久久久久蜜桃 | 午夜时刻免费入口 | 国产精品视频免费播放 | 99精品视频在线观看免费 | 亚洲熟悉妇女xxx妇女av | 在线观看欧美一区二区三区 | 亚洲中文无码av永久不收费 | 国产免费久久精品国产传媒 | 国产卡一卡二卡三 | 国产精品久久久久久无码 | 亚洲中文字幕无码一久久区 | 在线a亚洲视频播放在线观看 | 成熟妇人a片免费看网站 | 在线天堂新版最新版在线8 | 日本精品久久久久中文字幕 | 日本一区二区更新不卡 | 日本乱偷人妻中文字幕 | 免费国产成人高清在线观看网站 | 国产熟女一区二区三区四区五区 | 妺妺窝人体色www婷婷 | 久久天天躁狠狠躁夜夜免费观看 | 少妇性l交大片欧洲热妇乱xxx | 国产后入清纯学生妹 | 久久久久亚洲精品中文字幕 | 日本乱偷人妻中文字幕 | 蜜桃视频韩日免费播放 | 亚洲精品国产精品乱码不卡 | 麻豆果冻传媒2021精品传媒一区下载 | 午夜嘿嘿嘿影院 | 无码人妻精品一区二区三区不卡 | 5858s亚洲色大成网站www | 色窝窝无码一区二区三区色欲 | 无码人妻少妇伦在线电影 | 一区二区三区乱码在线 | 欧洲 | 人人澡人摸人人添 | 亚洲精品成a人在线观看 | 任你躁在线精品免费 | 精品国产一区二区三区四区在线看 | 成人影院yy111111在线观看 | 波多野42部无码喷潮在线 | 偷窥日本少妇撒尿chinese | 一本色道婷婷久久欧美 | 亚洲精品久久久久avwww潮水 | 高清无码午夜福利视频 | 中文字幕av伊人av无码av | 欧美三级a做爰在线观看 | 2019nv天堂香蕉在线观看 | 亚洲一区二区三区国产精华液 | 无遮挡国产高潮视频免费观看 | 在线观看国产一区二区三区 | 免费网站看v片在线18禁无码 | 亚洲自偷精品视频自拍 | 日本丰满护士爆乳xxxx | 亚洲 日韩 欧美 成人 在线观看 | 精品水蜜桃久久久久久久 | 日本xxxx色视频在线观看免费 | 亚洲精品久久久久中文第一幕 | 无码播放一区二区三区 | 成熟人妻av无码专区 | 熟女体下毛毛黑森林 | 欧美一区二区三区 | 丰满少妇熟乱xxxxx视频 | 久久综合给合久久狠狠狠97色 | 精品国偷自产在线视频 | 亚洲国产综合无码一区 | 国产高潮视频在线观看 | 国产成人精品无码播放 | 国产免费久久精品国产传媒 | 久久久久成人片免费观看蜜芽 | 四虎影视成人永久免费观看视频 | 国产偷自视频区视频 | 国产色在线 | 国产 | 青青久在线视频免费观看 | 免费视频欧美无人区码 | 九九久久精品国产免费看小说 | 成在人线av无码免费 | 2019午夜福利不卡片在线 | 一区二区三区乱码在线 | 欧洲 | 天天躁夜夜躁狠狠是什么心态 | 大乳丰满人妻中文字幕日本 | 在线播放免费人成毛片乱码 | 少妇高潮喷潮久久久影院 | 少妇无码吹潮 | 亚洲国产午夜精品理论片 | 国产无遮挡吃胸膜奶免费看 | 国产精品久免费的黄网站 | 欧美精品无码一区二区三区 | 欧美老熟妇乱xxxxx | 色欲人妻aaaaaaa无码 | 久久久久久亚洲精品a片成人 | 国产成人无码午夜视频在线观看 | 国产精品成人av在线观看 | 国产成人精品视频ⅴa片软件竹菊 | 思思久久99热只有频精品66 | 日本丰满护士爆乳xxxx | 亚洲自偷自偷在线制服 | 久久久无码中文字幕久... | 久久久精品456亚洲影院 | 人人爽人人澡人人高潮 | 少妇无码av无码专区在线观看 | 国产精品久久久一区二区三区 | 成人影院yy111111在线观看 | 亚洲精品久久久久中文第一幕 | 欧美喷潮久久久xxxxx | 少女韩国电视剧在线观看完整 | 国产亚洲精品久久久久久久 | 久久久久av无码免费网 | 国产精品igao视频网 | 激情人妻另类人妻伦 | 人人爽人人澡人人高潮 | 亚洲 日韩 欧美 成人 在线观看 | 成人精品天堂一区二区三区 | 一本大道久久东京热无码av | 激情五月综合色婷婷一区二区 | 麻豆蜜桃av蜜臀av色欲av | 国语精品一区二区三区 | 日韩亚洲欧美中文高清在线 | 日日躁夜夜躁狠狠躁 | 国产超级va在线观看视频 | 清纯唯美经典一区二区 | 高清无码午夜福利视频 | 中文字幕精品av一区二区五区 | 免费看男女做好爽好硬视频 | 久久精品国产一区二区三区 | 少妇无码av无码专区在线观看 | 亚洲va中文字幕无码久久不卡 | 国产成人一区二区三区在线观看 | 狠狠噜狠狠狠狠丁香五月 | 精品水蜜桃久久久久久久 | a在线观看免费网站大全 | 99在线 | 亚洲 | 国产精品第一国产精品 | 亚洲第一无码av无码专区 | 亚洲男女内射在线播放 | 国产亚洲视频中文字幕97精品 | 国产精品无码成人午夜电影 | 98国产精品综合一区二区三区 | 天堂久久天堂av色综合 | 精品成人av一区二区三区 | 亚洲 高清 成人 动漫 | aⅴ在线视频男人的天堂 | 成人亚洲精品久久久久软件 | 日韩欧美成人免费观看 | 欧美老熟妇乱xxxxx | 亚洲一区二区三区无码久久 | 免费国产黄网站在线观看 | 精品国产麻豆免费人成网站 | 丰满护士巨好爽好大乳 | 在线天堂新版最新版在线8 | 国产精品视频免费播放 | 男女性色大片免费网站 | 小泽玛莉亚一区二区视频在线 | 亚洲自偷自拍另类第1页 | 在线观看欧美一区二区三区 | 国产超碰人人爽人人做人人添 | 波多野结衣 黑人 | 亚洲の无码国产の无码步美 | 高潮喷水的毛片 | 国产精品久久久久无码av色戒 | av人摸人人人澡人人超碰下载 | 在线播放亚洲第一字幕 | 狂野欧美性猛xxxx乱大交 | 天天摸天天碰天天添 | 无码av最新清无码专区吞精 | 大地资源网第二页免费观看 | 国产精品高潮呻吟av久久4虎 | 亚洲国产日韩a在线播放 | 强奷人妻日本中文字幕 | 天天做天天爱天天爽综合网 | 国产三级久久久精品麻豆三级 | 欧美人与禽zoz0性伦交 | 女人被男人爽到呻吟的视频 | 日韩av无码一区二区三区不卡 | 国产亚洲精品久久久久久大师 | 成人三级无码视频在线观看 | 久久久久免费看成人影片 | 老熟妇仑乱视频一区二区 | 特级做a爰片毛片免费69 | 欧美第一黄网免费网站 | 97精品国产97久久久久久免费 | 久久成人a毛片免费观看网站 | 99久久精品午夜一区二区 | 精品国产福利一区二区 | 俺去俺来也在线www色官网 | 极品嫩模高潮叫床 | 丰满肥臀大屁股熟妇激情视频 | 国产舌乚八伦偷品w中 | 国产成人综合在线女婷五月99播放 | 给我免费的视频在线观看 | 婷婷综合久久中文字幕蜜桃三电影 | 国产亚洲人成在线播放 | 2019nv天堂香蕉在线观看 | 亚洲成色在线综合网站 | 漂亮人妻洗澡被公强 日日躁 | 久久久久免费精品国产 | 国内精品人妻无码久久久影院蜜桃 | 精品人人妻人人澡人人爽人人 | 天天拍夜夜添久久精品 | 久久综合九色综合欧美狠狠 | 久久亚洲a片com人成 | 国产激情艳情在线看视频 | 爱做久久久久久 | 在线天堂新版最新版在线8 | 偷窥日本少妇撒尿chinese | 久久人人97超碰a片精品 | 日本一区二区更新不卡 | 狠狠色欧美亚洲狠狠色www | 欧洲欧美人成视频在线 | 青青久在线视频免费观看 | 欧美肥老太牲交大战 | 欧美 日韩 人妻 高清 中文 | 色欲综合久久中文字幕网 | 人妻少妇精品视频专区 | 麻豆av传媒蜜桃天美传媒 | 六十路熟妇乱子伦 | 欧美日韩精品 | 人人妻人人藻人人爽欧美一区 | 日本xxxx色视频在线观看免费 | 亚洲成a人一区二区三区 | 成熟女人特级毛片www免费 | 双乳奶水饱满少妇呻吟 | 免费人成网站视频在线观看 | 国产色xx群视频射精 | 亚洲午夜久久久影院 | 丰满人妻一区二区三区免费视频 | 精品欧洲av无码一区二区三区 | 欧美自拍另类欧美综合图片区 | 成人片黄网站色大片免费观看 | 亚洲经典千人经典日产 | 久久久久免费看成人影片 | 无码一区二区三区在线观看 | 国精产品一区二区三区 | 中文字幕无码免费久久9一区9 | 少妇无码吹潮 | 成人一区二区免费视频 | 国产凸凹视频一区二区 | 成人三级无码视频在线观看 | 久久亚洲中文字幕无码 | 国产特级毛片aaaaaaa高清 | 日韩av无码中文无码电影 | 久久精品无码一区二区三区 | 乱人伦人妻中文字幕无码久久网 | 扒开双腿吃奶呻吟做受视频 | 老熟妇乱子伦牲交视频 | 一本色道婷婷久久欧美 | 午夜福利一区二区三区在线观看 | 国产乱子伦视频在线播放 | 免费播放一区二区三区 | 成熟妇人a片免费看网站 | 午夜精品久久久久久久久 | 精品国产麻豆免费人成网站 | 中文字幕乱妇无码av在线 | 中文亚洲成a人片在线观看 | 亚洲国产精品久久人人爱 | 亚洲熟妇色xxxxx欧美老妇y | 久久久婷婷五月亚洲97号色 | 亚洲狠狠色丁香婷婷综合 | 成年女人永久免费看片 | 亚洲熟妇自偷自拍另类 | 人人妻人人澡人人爽欧美精品 | 国产一区二区不卡老阿姨 | 欧美猛少妇色xxxxx | 久久视频在线观看精品 | 女人和拘做爰正片视频 | 国产成人精品必看 | 成熟妇人a片免费看网站 | 呦交小u女精品视频 | 麻豆av传媒蜜桃天美传媒 | 国产亚洲精品久久久久久 | 国产欧美精品一区二区三区 | 国产女主播喷水视频在线观看 | 久久久久久九九精品久 | 久久久久成人片免费观看蜜芽 | 精品国产精品久久一区免费式 | 纯爱无遮挡h肉动漫在线播放 | 窝窝午夜理论片影院 | 无码纯肉视频在线观看 | 无码毛片视频一区二区本码 | 18禁黄网站男男禁片免费观看 | 亚洲成a人片在线观看无码 | 精品人人妻人人澡人人爽人人 | 少妇高潮一区二区三区99 | 影音先锋中文字幕无码 | 极品尤物被啪到呻吟喷水 | 国产人成高清在线视频99最全资源 | 亚洲热妇无码av在线播放 | 嫩b人妻精品一区二区三区 | 少妇性l交大片欧洲热妇乱xxx | 无码国产乱人伦偷精品视频 | yw尤物av无码国产在线观看 | 波多野结衣高清一区二区三区 | 一本久道久久综合婷婷五月 | 88国产精品欧美一区二区三区 | 久久国产精品_国产精品 | 国产精品自产拍在线观看 | 国产69精品久久久久app下载 | 欧美性黑人极品hd | 狂野欧美性猛交免费视频 | 丝袜 中出 制服 人妻 美腿 | 搡女人真爽免费视频大全 | 久久久久亚洲精品男人的天堂 | 天天燥日日燥 | 国产福利视频一区二区 | 无码乱肉视频免费大全合集 | 男女猛烈xx00免费视频试看 | 国产又爽又黄又刺激的视频 | 中文字幕中文有码在线 | 亚洲精品国产第一综合99久久 | 色欲av亚洲一区无码少妇 | 未满成年国产在线观看 | 中国女人内谢69xxxxxa片 | 日本一卡2卡3卡四卡精品网站 | 亚洲爆乳精品无码一区二区三区 | 中文无码成人免费视频在线观看 | 国产肉丝袜在线观看 | 精品国产国产综合精品 | 熟妇女人妻丰满少妇中文字幕 | 国产偷自视频区视频 | 男女下面进入的视频免费午夜 | 偷窥日本少妇撒尿chinese | 中文字幕日产无线码一区 | 久久久久亚洲精品男人的天堂 | 99视频精品全部免费免费观看 | 国产成人无码一二三区视频 | 暴力强奷在线播放无码 | 亚洲日韩av一区二区三区中文 | 内射巨臀欧美在线视频 | 色综合久久久无码网中文 | 97夜夜澡人人双人人人喊 | 亚洲の无码国产の无码步美 | 日日碰狠狠躁久久躁蜜桃 | 内射后入在线观看一区 | 无码成人精品区在线观看 | 一本无码人妻在中文字幕免费 | 国产色视频一区二区三区 | 狂野欧美性猛交免费视频 | 午夜精品久久久久久久 | 国产九九九九九九九a片 | 欧美 日韩 人妻 高清 中文 | 亚洲a无码综合a国产av中文 | a在线亚洲男人的天堂 | 国产黄在线观看免费观看不卡 | 在线观看国产一区二区三区 | √天堂中文官网8在线 | 欧洲熟妇精品视频 | 男人的天堂2018无码 | 国产亚洲美女精品久久久2020 | 永久免费观看国产裸体美女 | 免费无码的av片在线观看 | 宝宝好涨水快流出来免费视频 | 四虎永久在线精品免费网址 | 国内精品一区二区三区不卡 | 成在人线av无码免费 | 少妇被粗大的猛进出69影院 | 欧美 日韩 人妻 高清 中文 | 亚洲色欲久久久综合网东京热 | 成人毛片一区二区 | 超碰97人人做人人爱少妇 | 天天爽夜夜爽夜夜爽 | 午夜精品一区二区三区的区别 | 日韩av无码一区二区三区不卡 | 国产高清不卡无码视频 | 亚洲精品国产第一综合99久久 | 久久人人97超碰a片精品 | 丁香花在线影院观看在线播放 | 欧美兽交xxxx×视频 | 无码午夜成人1000部免费视频 | 国产成人精品久久亚洲高清不卡 | 成人一在线视频日韩国产 | 1000部夫妻午夜免费 | 色妞www精品免费视频 | 久久成人a毛片免费观看网站 | 一本色道久久综合亚洲精品不卡 | 中文字幕乱码中文乱码51精品 | 成熟妇人a片免费看网站 | 国产精品久久久久7777 | 国产肉丝袜在线观看 | 亚洲 另类 在线 欧美 制服 | 激情内射日本一区二区三区 | 国产精品久久久久无码av色戒 | 久久久久久av无码免费看大片 | 伊人久久大香线蕉午夜 | 四虎影视成人永久免费观看视频 | 伊人久久婷婷五月综合97色 | 一本久久伊人热热精品中文字幕 | 国产在线精品一区二区高清不卡 | 狠狠色噜噜狠狠狠7777奇米 | 成人精品一区二区三区中文字幕 | 国产福利视频一区二区 | 又黄又爽又色的视频 | 成人无码精品一区二区三区 | 日本在线高清不卡免费播放 | 无码吃奶揉捏奶头高潮视频 | 少妇厨房愉情理9仑片视频 | 精品国产乱码久久久久乱码 | 日韩 欧美 动漫 国产 制服 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产精品久久久久久亚洲毛片 | 国产精品理论片在线观看 | 亚洲 激情 小说 另类 欧美 | 自拍偷自拍亚洲精品被多人伦好爽 | 丰满少妇女裸体bbw | 亚洲色大成网站www | 国产无套内射久久久国产 | 久久人人爽人人爽人人片av高清 | www一区二区www免费 | 色婷婷久久一区二区三区麻豆 | 亚洲精品国产a久久久久久 | 丰满护士巨好爽好大乳 | 国产精品久久久久7777 | 色欲综合久久中文字幕网 | 婷婷五月综合激情中文字幕 | 国内精品人妻无码久久久影院蜜桃 | 久久99精品久久久久婷婷 | 亚洲码国产精品高潮在线 | 亚洲国产av美女网站 | 国产成人无码区免费内射一片色欲 | 亚洲精品中文字幕久久久久 | 99久久人妻精品免费二区 | 鲁鲁鲁爽爽爽在线视频观看 | 中文字幕乱码亚洲无线三区 | 国内精品久久毛片一区二区 | 中文字幕无码免费久久9一区9 | 搡女人真爽免费视频大全 | 色综合久久久久综合一本到桃花网 | 久久久无码中文字幕久... | 自拍偷自拍亚洲精品被多人伦好爽 | 中文字幕无线码免费人妻 | 久久人人爽人人爽人人片av高清 | 麻豆md0077饥渴少妇 | 欧美性猛交xxxx富婆 | 5858s亚洲色大成网站www | 最近免费中文字幕中文高清百度 | 久久综合狠狠综合久久综合88 | a在线亚洲男人的天堂 | 野外少妇愉情中文字幕 | 亚洲 日韩 欧美 成人 在线观看 | 免费看男女做好爽好硬视频 | 骚片av蜜桃精品一区 | 天堂一区人妻无码 | 对白脏话肉麻粗话av | 国产精品久久久久久久影院 | 亚洲va中文字幕无码久久不卡 | 欧美国产日韩久久mv | 人妻天天爽夜夜爽一区二区 | 国产精品无码成人午夜电影 | 欧美老妇交乱视频在线观看 | 欧美日韩一区二区三区自拍 | 国产精品二区一区二区aⅴ污介绍 | 最新国产乱人伦偷精品免费网站 | 国产人妻精品一区二区三区不卡 | 日本va欧美va欧美va精品 | 99精品久久毛片a片 | 久在线观看福利视频 | 国内丰满熟女出轨videos | 亚洲乱码国产乱码精品精 | 人人妻人人澡人人爽欧美一区九九 | 77777熟女视频在线观看 а天堂中文在线官网 | 国产av久久久久精东av | 亚洲成a人片在线观看无码3d | 天天做天天爱天天爽综合网 | 欧美成人免费全部网站 | 久久人妻内射无码一区三区 | 一本大道久久东京热无码av | 国产97在线 | 亚洲 | 一个人看的www免费视频在线观看 | 亚洲欧美国产精品专区久久 | 色情久久久av熟女人妻网站 | 大地资源网第二页免费观看 | 亚洲日韩一区二区三区 | 国产成人精品必看 | 欧美zoozzooz性欧美 | 国产精品理论片在线观看 | 捆绑白丝粉色jk震动捧喷白浆 | 妺妺窝人体色www在线小说 | 婷婷丁香五月天综合东京热 | 国产精品国产自线拍免费软件 | 免费国产成人高清在线观看网站 | 国产精品无码永久免费888 | 国产av人人夜夜澡人人爽麻豆 | 欧美日本精品一区二区三区 | 欧美放荡的少妇 | 国内少妇偷人精品视频 | 欧美一区二区三区视频在线观看 | 国产人妖乱国产精品人妖 | 亚洲国产精品毛片av不卡在线 | 性欧美熟妇videofreesex | 亚洲阿v天堂在线 | 久久视频在线观看精品 | 欧美人与牲动交xxxx | 精品国产青草久久久久福利 | 精品久久综合1区2区3区激情 | 久久精品女人的天堂av | 欧美亚洲日韩国产人成在线播放 | 亚洲成av人片天堂网无码】 | 中文字幕无码免费久久9一区9 | 久久国产精品萌白酱免费 | 俄罗斯老熟妇色xxxx | 久久久精品成人免费观看 | 中文字幕+乱码+中文字幕一区 | 成人一区二区免费视频 | 国产av无码专区亚洲a∨毛片 | 一个人免费观看的www视频 | 欧美老熟妇乱xxxxx | 中文字幕日产无线码一区 | 大胆欧美熟妇xx | 欧美人与动性行为视频 | 天天摸天天透天天添 | 精品无码国产自产拍在线观看蜜 | 精品人妻人人做人人爽 | 欧洲极品少妇 | 亚洲日本va午夜在线电影 | yw尤物av无码国产在线观看 | 国产人妖乱国产精品人妖 | 麻豆av传媒蜜桃天美传媒 | 真人与拘做受免费视频 | 久热国产vs视频在线观看 | 四虎永久在线精品免费网址 | 国产麻豆精品一区二区三区v视界 | 偷窥日本少妇撒尿chinese | 久久午夜无码鲁丝片秋霞 | 性欧美大战久久久久久久 | 成年美女黄网站色大免费全看 | 东京无码熟妇人妻av在线网址 | 搡女人真爽免费视频大全 | 乱人伦人妻中文字幕无码久久网 | 中文字幕人成乱码熟女app | 精品无码国产自产拍在线观看蜜 | 亚洲国产精品毛片av不卡在线 | 在教室伦流澡到高潮hnp视频 | 精品无码成人片一区二区98 | 欧美肥老太牲交大战 | 国产乱人偷精品人妻a片 | 国产成人精品视频ⅴa片软件竹菊 | 大地资源中文第3页 | 日本饥渴人妻欲求不满 | 麻豆精品国产精华精华液好用吗 | 四虎4hu永久免费 | 男人扒开女人内裤强吻桶进去 | 国产av一区二区精品久久凹凸 | 亚洲小说图区综合在线 | 亚洲成a人片在线观看无码 | 欧美熟妇另类久久久久久不卡 | 国产sm调教视频在线观看 | 少女韩国电视剧在线观看完整 | 熟女少妇人妻中文字幕 | 正在播放东北夫妻内射 | 波多野结衣乳巨码无在线观看 | 中文字幕无码免费久久9一区9 | 日日躁夜夜躁狠狠躁 | 水蜜桃亚洲一二三四在线 | 日本熟妇乱子伦xxxx | 免费观看激色视频网站 | 欧美日韩一区二区免费视频 | 人人澡人摸人人添 | 亚洲日本在线电影 | 亚洲成av人在线观看网址 | а√天堂www在线天堂小说 | 爽爽影院免费观看 | 亚洲欧洲中文日韩av乱码 | 欧美 丝袜 自拍 制服 另类 | 乌克兰少妇xxxx做受 | 激情内射亚州一区二区三区爱妻 | 国产人妻精品一区二区三区 | 在线а√天堂中文官网 | 亚洲成av人影院在线观看 | 亚洲一区二区三区国产精华液 | 无码精品国产va在线观看dvd | 曰韩少妇内射免费播放 | 久久天天躁狠狠躁夜夜免费观看 | 无码任你躁久久久久久久 | 狂野欧美性猛xxxx乱大交 | 97久久国产亚洲精品超碰热 | 妺妺窝人体色www婷婷 | 欧美日韩精品 | 给我免费的视频在线观看 | 四虎4hu永久免费 | 国产电影无码午夜在线播放 | 中文亚洲成a人片在线观看 | 欧美日韩精品 | 国产特级毛片aaaaaa高潮流水 | 亚洲精品鲁一鲁一区二区三区 | 亚洲精品鲁一鲁一区二区三区 | 国内精品一区二区三区不卡 | 国产精品-区区久久久狼 | 青青青爽视频在线观看 | 日韩av无码一区二区三区不卡 | 成人三级无码视频在线观看 | 欧美日本日韩 | 天海翼激烈高潮到腰振不止 | 国产无套粉嫩白浆在线 | 亚洲日本在线电影 | 久久国产36精品色熟妇 | 99riav国产精品视频 | 成人精品视频一区二区 | 成年女人永久免费看片 | 国内精品九九久久久精品 | 青春草在线视频免费观看 | 亚洲精品久久久久久一区二区 | 欧美猛少妇色xxxxx | 内射后入在线观看一区 | 色 综合 欧美 亚洲 国产 | 国产一区二区三区日韩精品 | 日日碰狠狠躁久久躁蜜桃 | 免费无码肉片在线观看 | 天天爽夜夜爽夜夜爽 | 又湿又紧又大又爽a视频国产 | 无套内射视频囯产 | 少妇高潮喷潮久久久影院 | 久久久久久a亚洲欧洲av冫 | 人妻少妇精品无码专区动漫 | 国产精品久久久久7777 | 国产精品美女久久久久av爽李琼 | 久久99精品国产.久久久久 | 色 综合 欧美 亚洲 国产 | 天干天干啦夜天干天2017 | 无码午夜成人1000部免费视频 | 成人无码视频在线观看网站 | 丁香花在线影院观看在线播放 | 国产亚av手机在线观看 | 骚片av蜜桃精品一区 | av在线亚洲欧洲日产一区二区 | www国产亚洲精品久久久日本 | 亚洲一区av无码专区在线观看 | 国产无遮挡又黄又爽免费视频 | 国产精品成人av在线观看 | 一本色道久久综合狠狠躁 | 国产人妻久久精品二区三区老狼 | 久久综合狠狠综合久久综合88 | 亚洲欧美精品aaaaaa片 | 国产亚洲精品久久久久久 | 亚洲一区二区三区香蕉 | 麻豆md0077饥渴少妇 | 国产69精品久久久久app下载 | 日本大香伊一区二区三区 | 精品一区二区三区波多野结衣 | 漂亮人妻洗澡被公强 日日躁 | 国产高清不卡无码视频 | 精品水蜜桃久久久久久久 | 熟妇女人妻丰满少妇中文字幕 | 76少妇精品导航 | 无套内谢的新婚少妇国语播放 | 亚洲热妇无码av在线播放 | 波多野结衣一区二区三区av免费 | 国产麻豆精品精东影业av网站 | 性欧美videos高清精品 | 久久综合网欧美色妞网 | 欧美成人家庭影院 | 老熟妇仑乱视频一区二区 | 欧美性生交活xxxxxdddd | 国产性生大片免费观看性 | 无码人妻出轨黑人中文字幕 | 久久人人爽人人爽人人片av高清 | 少妇厨房愉情理9仑片视频 | 亚洲高清偷拍一区二区三区 | 青青草原综合久久大伊人精品 | 俺去俺来也在线www色官网 | 色五月丁香五月综合五月 | 欧美老人巨大xxxx做受 | 性欧美videos高清精品 | 东京热男人av天堂 | 久在线观看福利视频 | 国产成人一区二区三区在线观看 | 国产亚洲精品久久久久久久 | 亚洲成a人片在线观看日本 | 亚洲精品一区二区三区四区五区 | 超碰97人人做人人爱少妇 | 亚洲色偷偷偷综合网 | 亚洲一区二区三区在线观看网站 | 99精品无人区乱码1区2区3区 | 成人无码视频免费播放 | 亚洲gv猛男gv无码男同 | 国产无av码在线观看 | 亚洲人成影院在线无码按摩店 | 一区二区传媒有限公司 | 国产区女主播在线观看 | 东京无码熟妇人妻av在线网址 | 色偷偷人人澡人人爽人人模 | 久久久国产一区二区三区 | 任你躁在线精品免费 | 人人妻人人澡人人爽欧美一区九九 | 欧美激情综合亚洲一二区 | 久久人人爽人人爽人人片ⅴ | 日韩精品一区二区av在线 | 成人免费无码大片a毛片 | 少妇激情av一区二区 | 国产黄在线观看免费观看不卡 | 给我免费的视频在线观看 | 捆绑白丝粉色jk震动捧喷白浆 | 性色av无码免费一区二区三区 | 影音先锋中文字幕无码 | 精品国产aⅴ无码一区二区 | 黑人巨大精品欧美一区二区 | 色噜噜亚洲男人的天堂 | 未满小14洗澡无码视频网站 | 国产网红无码精品视频 | 伦伦影院午夜理论片 | 亚洲国产欧美国产综合一区 | 最新版天堂资源中文官网 | 中文字幕 亚洲精品 第1页 | 影音先锋中文字幕无码 | 无码纯肉视频在线观看 | 国产在线一区二区三区四区五区 | 久久人人爽人人人人片 | 亚洲国产精品久久久久久 | 日本精品人妻无码免费大全 | 国产精品爱久久久久久久 | 久久国产精品精品国产色婷婷 | 人人爽人人爽人人片av亚洲 | 国产精品人人妻人人爽 | 97se亚洲精品一区 | 女人被男人躁得好爽免费视频 | 人妻无码αv中文字幕久久琪琪布 | 国产色视频一区二区三区 | 四虎影视成人永久免费观看视频 | 乌克兰少妇性做爰 | 国产亚洲精品久久久闺蜜 | 俄罗斯老熟妇色xxxx | 亚洲啪av永久无码精品放毛片 | 99久久久无码国产aaa精品 | 国产绳艺sm调教室论坛 | 国产人妻人伦精品 | 成人无码精品一区二区三区 | 男人和女人高潮免费网站 | 亚洲欧美精品aaaaaa片 | 亚洲春色在线视频 | 国产精品高潮呻吟av久久4虎 | 免费国产成人高清在线观看网站 | 精品国产一区av天美传媒 | www国产亚洲精品久久网站 | 国产精华av午夜在线观看 | 欧美一区二区三区视频在线观看 | 蜜桃无码一区二区三区 | 欧洲美熟女乱又伦 | 亚洲精品中文字幕 | 成熟妇人a片免费看网站 | 欧美人与善在线com | 麻豆精品国产精华精华液好用吗 | 国产成人精品视频ⅴa片软件竹菊 | 中文字幕av无码一区二区三区电影 | 内射老妇bbwx0c0ck | 国产乱人伦av在线无码 | 亚洲国产成人av在线观看 | 国产凸凹视频一区二区 | 亚洲国产精品无码一区二区三区 | 伊人色综合久久天天小片 | 人妻夜夜爽天天爽三区 | 无码人妻出轨黑人中文字幕 | 装睡被陌生人摸出水好爽 | 久久精品视频在线看15 | 日本一区二区更新不卡 | 无遮挡国产高潮视频免费观看 | 狠狠亚洲超碰狼人久久 | 玩弄人妻少妇500系列视频 | 日韩少妇内射免费播放 | 亚洲国产精品一区二区美利坚 | 日韩人妻少妇一区二区三区 | 中文字幕+乱码+中文字幕一区 | 日本精品久久久久中文字幕 | 亚洲无人区午夜福利码高清完整版 | 免费无码av一区二区 | 亚洲午夜福利在线观看 | 国产免费无码一区二区视频 | 给我免费的视频在线观看 | √天堂资源地址中文在线 | 亚洲一区二区三区在线观看网站 | 成人一在线视频日韩国产 | 俺去俺来也www色官网 | 99re在线播放 | 精品国产一区二区三区av 性色 | 亚洲国产精品久久人人爱 | 亚洲国产午夜精品理论片 | 色欲av亚洲一区无码少妇 | 亚洲国产精品久久人人爱 | 国产成人综合色在线观看网站 | 亚洲成a人片在线观看无码3d | 天天av天天av天天透 | 精品厕所偷拍各类美女tp嘘嘘 | 成人欧美一区二区三区黑人 | 国产精品美女久久久久av爽李琼 | 国产三级久久久精品麻豆三级 | 亚洲 欧美 激情 小说 另类 | 欧美成人高清在线播放 | 清纯唯美经典一区二区 | a在线亚洲男人的天堂 | 午夜成人1000部免费视频 | 色综合久久88色综合天天 | 色综合久久中文娱乐网 | 久久国产精品精品国产色婷婷 | 波多野结衣av一区二区全免费观看 | 俄罗斯老熟妇色xxxx | 亚洲精品久久久久久久久久久 | 国产香蕉尹人综合在线观看 | 国产人妻精品一区二区三区不卡 | 国产乱子伦视频在线播放 | 少妇被黑人到高潮喷出白浆 | 精品久久久久香蕉网 | 久热国产vs视频在线观看 | 亚洲经典千人经典日产 | 亚洲色大成网站www国产 | 日本一本二本三区免费 | 久久99精品国产.久久久久 | 亚洲欧美综合区丁香五月小说 | 亚洲中文字幕乱码av波多ji | 亚洲色偷偷偷综合网 | 久久熟妇人妻午夜寂寞影院 | 久久久av男人的天堂 | 日韩视频 中文字幕 视频一区 | 伊人久久大香线焦av综合影院 | 小鲜肉自慰网站xnxx | 精品无码成人片一区二区98 | 亚洲成色www久久网站 | 人妻插b视频一区二区三区 | 中文字幕无码日韩欧毛 | 好男人www社区 | 亚洲国产精品无码一区二区三区 | 日韩视频 中文字幕 视频一区 | 丰满妇女强制高潮18xxxx | 98国产精品综合一区二区三区 | 中文字幕色婷婷在线视频 | 噜噜噜亚洲色成人网站 | 全球成人中文在线 | 亚洲最大成人网站 | 午夜福利电影 | 国产精品久久久久影院嫩草 | 国产莉萝无码av在线播放 | 青青久在线视频免费观看 | 未满小14洗澡无码视频网站 | 特大黑人娇小亚洲女 | 国产av无码专区亚洲awww | 欧美一区二区三区 | 性啪啪chinese东北女人 | 扒开双腿疯狂进出爽爽爽视频 | 日韩人妻系列无码专区 | 日本乱人伦片中文三区 | 又粗又大又硬毛片免费看 | av人摸人人人澡人人超碰下载 | 狠狠色色综合网站 | 日日躁夜夜躁狠狠躁 | 久久久精品成人免费观看 | 久久久久久国产精品无码下载 | 日日干夜夜干 | 无码精品人妻一区二区三区av | 亚洲色欲久久久综合网东京热 | 久9re热视频这里只有精品 | 亚拍精品一区二区三区探花 | 久久精品国产大片免费观看 | 欧美精品在线观看 | 国产精品.xx视频.xxtv | 亚洲综合精品香蕉久久网 | www国产亚洲精品久久久日本 | 亚洲中文无码av永久不收费 | 野狼第一精品社区 | 亚洲精品欧美二区三区中文字幕 | 日韩精品无码一区二区中文字幕 | 国产一区二区三区影院 | 日韩人妻无码中文字幕视频 | 久久国语露脸国产精品电影 | 午夜无码人妻av大片色欲 | 性啪啪chinese东北女人 | 又色又爽又黄的美女裸体网站 | 三上悠亚人妻中文字幕在线 | 丁香啪啪综合成人亚洲 | 久久综合久久自在自线精品自 | 精品久久综合1区2区3区激情 | 性色欲网站人妻丰满中文久久不卡 | 国产精品久久久 | 亚洲熟女一区二区三区 | 亚洲国产精品无码久久久久高潮 | 又黄又爽又色的视频 | 精品 日韩 国产 欧美 视频 | a国产一区二区免费入口 | 免费无码av一区二区 | 国产片av国语在线观看 | 国产亚av手机在线观看 | 中文字幕乱码亚洲无线三区 | 暴力强奷在线播放无码 | 国产成人一区二区三区在线观看 | 久久久久久亚洲精品a片成人 | 99久久精品国产一区二区蜜芽 | 在线a亚洲视频播放在线观看 | 亚洲成a人片在线观看无码3d | 亚洲色欲色欲天天天www | 国产精品嫩草久久久久 | 亚洲日韩av片在线观看 | 成人无码视频在线观看网站 | 无码免费一区二区三区 | 在线成人www免费观看视频 | 日日躁夜夜躁狠狠躁 | 狂野欧美激情性xxxx | www国产亚洲精品久久久日本 | 性欧美牲交xxxxx视频 | 一本无码人妻在中文字幕免费 | 久久久精品456亚洲影院 | 亚洲va中文字幕无码久久不卡 | 亚洲中文字幕在线无码一区二区 | aa片在线观看视频在线播放 | 黑人巨大精品欧美黑寡妇 | 一个人看的视频www在线 | 波多野42部无码喷潮在线 | 亚洲va欧美va天堂v国产综合 | 久久五月精品中文字幕 | 久久精品国产亚洲精品 | 欧美性猛交内射兽交老熟妇 | 人妻无码久久精品人妻 | 天堂а√在线中文在线 | 国产成人无码av片在线观看不卡 | 人妻天天爽夜夜爽一区二区 | 国产热a欧美热a在线视频 | 99麻豆久久久国产精品免费 | 人人妻人人藻人人爽欧美一区 | 欧美日韩人成综合在线播放 | 日日天干夜夜狠狠爱 | 国产精华av午夜在线观看 | 人妻人人添人妻人人爱 | 日本一区二区三区免费高清 | 免费男性肉肉影院 | 午夜嘿嘿嘿影院 | 欧美大屁股xxxxhd黑色 | 国产亚洲tv在线观看 | 久久这里只有精品视频9 | 任你躁国产自任一区二区三区 | 精品国产一区二区三区四区 | 国产精品99久久精品爆乳 | 无码吃奶揉捏奶头高潮视频 | 午夜丰满少妇性开放视频 | 99久久精品国产一区二区蜜芽 | 亚洲中文字幕成人无码 | 欧洲美熟女乱又伦 | 亚洲大尺度无码无码专区 | 女人被男人躁得好爽免费视频 | 色一情一乱一伦一区二区三欧美 | 性生交大片免费看l | 成年美女黄网站色大免费全看 | 日日麻批免费40分钟无码 | 色综合久久久无码网中文 | 日本乱人伦片中文三区 | 国精品人妻无码一区二区三区蜜柚 | 99精品国产综合久久久久五月天 | 亚洲综合无码久久精品综合 | 在线天堂新版最新版在线8 | 学生妹亚洲一区二区 | 国产成人综合在线女婷五月99播放 | 久久久中文字幕日本无吗 | 国产疯狂伦交大片 | 午夜无码区在线观看 | 亚洲中文字幕无码中字 | 精品人妻人人做人人爽 | 日本精品久久久久中文字幕 | 午夜丰满少妇性开放视频 | 日韩视频 中文字幕 视频一区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 99精品国产综合久久久久五月天 | 成人无码视频在线观看网站 | 97无码免费人妻超级碰碰夜夜 | 正在播放东北夫妻内射 | 99riav国产精品视频 | √天堂中文官网8在线 | 国产亚洲欧美在线专区 | 在线欧美精品一区二区三区 | 3d动漫精品啪啪一区二区中 | 亚洲人交乣女bbw | 午夜福利试看120秒体验区 | 亚洲欧美精品aaaaaa片 | 色综合久久网 | 国产口爆吞精在线视频 | 日本肉体xxxx裸交 | 一本久久a久久精品vr综合 | 国产九九九九九九九a片 | 亚洲天堂2017无码 | 在线精品国产一区二区三区 | 亚洲а∨天堂久久精品2021 | 亚洲天堂2017无码 | 亚洲日韩精品欧美一区二区 | 亚洲国产日韩a在线播放 | 国产精品久久久久无码av色戒 | 一二三四在线观看免费视频 | 国产偷抇久久精品a片69 | 麻豆成人精品国产免费 | 荫蒂被男人添的好舒服爽免费视频 | 少妇性荡欲午夜性开放视频剧场 | 樱花草在线播放免费中文 | 国产无套粉嫩白浆在线 | 日日摸天天摸爽爽狠狠97 | 久久精品丝袜高跟鞋 | 偷窥日本少妇撒尿chinese | 欧美野外疯狂做受xxxx高潮 | 国产综合久久久久鬼色 | 日韩视频 中文字幕 视频一区 | 欧洲精品码一区二区三区免费看 | 亚洲男人av香蕉爽爽爽爽 | 久青草影院在线观看国产 | 亚洲中文字幕在线无码一区二区 | 久久精品女人天堂av免费观看 | 日本一区二区三区免费播放 | 国产97人人超碰caoprom | 亚洲 欧美 激情 小说 另类 | 亚洲欧美色中文字幕在线 | 香港三级日本三级妇三级 | 高潮毛片无遮挡高清免费视频 | 免费乱码人妻系列无码专区 | 精品国产一区二区三区av 性色 | 久久国产精品萌白酱免费 | 蜜臀aⅴ国产精品久久久国产老师 | 国产精品人人妻人人爽 | 巨爆乳无码视频在线观看 | 亚洲综合无码一区二区三区 | 精品国产精品久久一区免费式 | 久久视频在线观看精品 | 亚洲欧洲日本综合aⅴ在线 | 亚洲欧美国产精品专区久久 | 亚无码乱人伦一区二区 | 国产午夜精品一区二区三区嫩草 | 亚洲狠狠婷婷综合久久 | 300部国产真实乱 | 亚洲综合无码一区二区三区 | 久久精品人妻少妇一区二区三区 | 免费无码的av片在线观看 | 中文字幕无码av激情不卡 | 国产精品理论片在线观看 | 天天av天天av天天透 | 午夜理论片yy44880影院 | 亚洲欧美综合区丁香五月小说 | 特级做a爰片毛片免费69 | 国产精品久久久久久亚洲影视内衣 | 乱人伦人妻中文字幕无码久久网 | 麻花豆传媒剧国产免费mv在线 | 色偷偷人人澡人人爽人人模 | 福利一区二区三区视频在线观看 | 亚洲天堂2017无码 | www成人国产高清内射 | 亚洲精品美女久久久久久久 | 中文字幕无码乱人伦 |